Надання послуг IAP

In-App Purchase (IAP) дозволяє постачальникам поточних послуг через додатки Odoo отримувати компенсацію за поточне використання послуг, а не - і, можливо, замість - єдиної початкової купівлі.

У цьому контексті Odoo діє здебільшого як посередник між клієнтом і розробником програми Odoo:

  • Користувачі купують токени служби в Odoo.

  • Постачальники послуг беруть токени з облікового запису Odoo користувача, коли запитується послуга.

Увага

Цей документ призначений для постачальників послуг і представляє останні, які можна зробити або через прямий JSON-RPC2, або якщо ви використовуєте Odoo, використовуючи зручні помічники, які він надає.

Огляд

../../_images/players.png

Гравці

  • Постачальник послуг - це (імовірно) ви, читач, ви надаватимете цінність клієнту у вигляді послуги, яка оплачується за використання.

  • Клієнт встановив ваш додаток Odoo і звідти запитуватиме послуги.

  • Посередники Odoo кредитують, Клієнт додає кредит на свій рахунок, і ви можете брати звідти кредити для надання послуг.

  • Зовнішня служба є необов’язковим програвачем: ви можете або надавати послугу безпосередньо, або ви можете делегувати фактичну службу, діючи як міст/перекладач між системою Odoo та фактичною службою.

../../_images/credits.jpg

Кредити

Примітка

Починаючи з жовтня 2018 р. кредити змінилися з цілого числа на значення з плаваючою точкою. Цілі значення все ще підтримуються.

Усі послуги, що надаються через платформу IAP, можуть використовуватися клієнтами за допомогою токенів або кредитів. Кредити є плаваючою одиницею, а їхня грошова вартість залежить від послуги та визначається постачальником. Це може бути:

  • для послуги sms: 1 кредит = 1 sms;

  • за рекламну послугу: 1 кредит = 1 реклама; або

  • за поштову послугу: 1 кредит = 1 поштова марка.

Кредит також можна просто пов’язати з фіксованою сумою грошей, щоб зменшити коливання ціни (наприклад, ціни на sms і марки можуть відрізнятися залежно від країни).

Вартість кредитів фіксується за допомогою передплачених кредитних пакетів, які клієнти можуть придбати на https://iap.odoo.com (див. Пакети).

Примітка

У наступних поясненнях ми ігноруватимемо Зовнішню службу, це лише деталь послуги, яку ви надаєте.

../../_images/normal.png

„Звичайний“ потік послуг

Якщо все йде добре, нормальний перебіг такий:

  1. Клієнт запитує певну послугу.

  2. Постачальник послуг запитує Odoo, чи достатньо кредитів для послуги в обліковому записі Клієнта, і створює транзакцію на цю суму.

  3. Постачальник послуг надає послуги (самостійно або за допомогою зовнішніх служб).

  4. Постачальник послуг повертається до Odoo, щоб зафіксувати (якщо послугу можна надати) або скасувати (якщо послугу неможливо надати) транзакцію, створену на кроці 2.

  5. Нарешті, Постачальник послуг повідомляє Клієнта про те, що послугу було надано, можливо (залежно від послуги), відображаючи або зберігаючи її результати в системі клієнта.

../../_images/no-credit.png

Недостатня кількість кредитів

Однак, якщо на рахунку Клієнта не вистачає кредитів для послуги, потік буде таким:

  1. Клієнт запитує послугу, як і раніше.

  2. Постачальник послуг запитує Odoo, чи достатньо кредитів на рахунку Клієнта, і отримує негативну відповідь.

  3. Про це повідомляється Клієнту.

  4. Хто буде перенаправлений до свого облікового запису Odoo, щоб зарахувати його та повторити спробу.

Створення вашого сервісу

Для цього прикладу послуга, яку ми надамо, - це ~~видобуток dogecoins~~, витрачаючи 10 секунд CPU на кредит. Для власних послуг ви можете, наприклад:

  • самостійно надавати онлайн-послуги (наприклад, конвертувати пропозиції в факси для бізнесу в Японії);

  • самостійно надавати офлайн послугу (наприклад, надавати бухгалтерські послуги); або

  • діяти як посередник для іншого постачальника послуг (наприклад, міст до шлюзу MMS).

Зареєструвати послугу на Odoo

Першим кроком є реєстрація вашої служби на кінцевій точці IAP (виробництва та/або тестування), перш ніж ви зможете справді запитувати облікові записи користувачів. Щоб створити службу, перейдіть до свого облікового запису порталу на кінцевій точці IAP (https://iap.odoo.com для виробництва, https://iap-sandbox.odoo.com для тестування, кінцеві точки є незалежними та не синхронізовано). Крім того, ви можете перейти на свій портал на Odoo (https://iap.odoo.com/my/home) і вибрати In-App Services.

Примітка

У виробництві існує етап ручної перевірки, перш ніж послугу можна буде використовувати для керування реальними транзакціями. Цей крок автоматично пропускається в пісочниці, щоб полегшити тести.

Увійдіть, потім перейдіть до Мій обліковий запис ‣ Ваші In-App служби, натисніть Створити та надайте інформацію про свою службу.

Сервіс має сім важливих полів:

  • name - ServiceName: це рядок, який вам потрібно буде надати в app клієнта під час запиту транзакції від Odoo. (наприклад, self.env['iap.account].get(name)). Це має відповідати технічній назві вашого додатку.

  • label - Label: Ім’я, що відображається на торговому порталі для клієнта.

Попередження

І ServiceName, і Label є унікальними. Як хороша практика, ServiceName зазвичай має відповідати назві вашого клієнтського додатку Odoo.

  • icon - Icon: загальна піктограма, яка слугуватиме типовою для ваших packs.

  • key - ServiceKey: ключ розробника, який ідентифікує вас в IAP (див. your service) і дозволяє отримувати кредити з облікового запису клієнта. Він буде показаний лише один раз під час створення послуги та може бути відновлений за бажанням.

Небезпека

Ваш ServiceKey є секретом, витік вашого службового ключа дозволяє іншим розробникам додатків отримати кредити, придбані за ваші послуги.

  • пробні кредити - Float: це відповідає кредитам, які ви готові запропонувати користувачам вашої програми під час першого використання. Зверніть увагу, що така послуга буде доступна лише клієнтам, які мають діючий корпоративний договір.

  • політика конфіденційності - PrivacyPolicy: це URL-адреса політики конфіденційності вашої служби. Тут має бути чітко вказано інформацію, яку ви збираєте, як ви її використовуєте, її актуальність для забезпечення роботи вашої послуги та інформуйте клієнта про те, як вони можуть отримати доступ, оновити або видалити свою особисту інформацію.

../../_images/menu.png ../../_images/service_list.png ../../_images/creating_service.png ../../_images/service_created.png

Потім ви можете створити кредитні пакети, які клієнти зможуть придбати, щоб скористатися вашими послугами.

Пакети

Кредитний пакет – це, по суті, продукт із п’ятьма характеристиками:

  • Назва: назва пакета,

  • Піктограма: спеціальна іконка для пакета (якщо не надано, вона використовуватиме піктограму служби),

  • Опис: детальна інформація про упаковку, яка з’явиться на сторінці магазину, а також рахунок-фактура,

  • Сума: сума кредитів, на яку клієнт має право при купівлі пакету,

  • Ціна: ціна в EUR (на даний момент планується підтримка USD).

Примітка

Odoo бере 25% комісії з усіх продажів пакетів. Відповідно відкоригуйте ціну продажу.

Примітка

Залежно від стратегії ціна кредиту може відрізнятися від одного пакета до іншого.

../../_images/package.png

Додаток Odoo

Другим кроком є розробка Додатка Odoo, який клієнти можуть установити у своєму екземплярі Odoo і за допомогою якого вони можуть запитувати послуги, які ви надаєте. Наша програма просто додасть кнопку до форми партнерів, яка дозволить користувачеві запитати спалювання процесорного часу на сервері.

Спочатку ми створимо odoo module залежно від iap. IAP - це стандартний модуль V11, і залежність гарантує, що локальний обліковий запис правильно налаштовано, і ми матимемо доступ до деяких необхідних представлень і корисних помічників.

coalroller/__manifest__.py
{
    'name': "Coal Roller",
    'category': 'Tools',
    'depends': ['iap'],
}

По-друге, «локальна» сторона інтеграції. Тут ми лише додамо кнопку дії до перегляду партнерів, але ви, звичайно, можете надати значну локальну цінність через свою програму та додаткові частини через віддалену службу.

coalroller/__manifest__.py
{
    'name': "Coal Roller",
    'category': 'Tools',
    'depends': ['iap'],
    'data': [
        'views/res_partner_views.xml',
    ],
}
coalroller/views/res_partner_views.xml
<odoo>
    <record model="ir.ui.view" id="partner_form_coalroll">
        <field name="name">partner.form.coalroll</field>
        <field name="model">res.partner</field>
        <field name="inherit_id" ref="base.view_partner_form" />
        <field name="arch" type="xml">
            <xpath expr="//div[@name='button_box']">
                <button type="object" name="action_partner_coalroll"
                        class="oe_stat_button" icon="fa-gears">
                    <div class="o_form_field o_stat_info">
                        <span class="o_stat_text">Roll Coal</span>
                    </div>
                </button>
            </xpath>
        </field>
    </record>
</odoo>
../../_images/button.png

Тепер ми можемо реалізувати метод дії/зворотний виклик. Це викличе наш власний сервер.

Немає жодних вимог щодо сервера чи протоколу зв’язку між програмою та нашим сервером, але iap надає iap_jsonrpc() помічника для виклику Кінцева точка JSON-RPC2 на іншому екземплярі Odoo та прозоро повторно викликає відповідні винятки Odoo (InsufficientCreditError, odoo.exceptions.AccessError і odoo.exceptions.UserError).

У цьому виклику нам потрібно буде надати:

  • будь-який відповідний параметр клієнта (тут немає),

  • token поточного клієнта, який надається полем account_token моделі iap.account. Ви можете отримати обліковий запис для своєї служби, викликавши env['iap.account'].get(service_name), де service_name - це назва служби, зареєстрованої в кінцевій точці IAP .

coalroller/models/res_partner.py
from odoo import api, models
from odoo.addons.iap import jsonrpc, InsufficientCreditError

# whichever URL you deploy the service at, here we will run the remote
# service in a local Odoo bound to the port 8070
DEFAULT_ENDPOINT = 'http://localhost:8070'
class Partner(models.Model):
    _inherit = 'res.partner'

    def action_partner_coalroll(self):
        # fetch the user's token for our service
        user_token = self.env['iap.account'].get('coalroller')
        params = {
            # we don't have any parameter to provide
            'account_token': user_token.account_token
        }
        # ir.config_parameter allows locally overriding the endpoint
        # for testing & al
        endpoint = self.env['ir.config_parameter'].sudo().get_param('coalroller.endpoint', DEFAULT_ENDPOINT)
        jsonrpc(endpoint + '/roll', params=params)
        return True

Примітка

iap автоматично обробляє InsufficientCreditError, що надходить від дії, і пропонує користувачеві додати кредити до свого облікового запису.

iap_jsonrpc() піклується про повторне підвищення InsufficientCreditError за вас.

Небезпека

Якщо ви не використовуєте iap_jsonrpc(), ви має бути обережним, щоб повторно підняти InsufficientCreditError в ваш обробник, інакше користувачеві не буде запропоновано поповнити рахунок, і наступний виклик буде невдалим.

Послуга

Хоча це не обов’язково, оскільки iap надає як помічник клієнта для викликів JSON-RPC2 (iap_jsonrpc()), так і помічник служби для транзакцій ( iap_charge) ми також будемо реалізовувати сервісну сторону як модуль Odoo:

coalroller_service/__manifest__.py
{
    'name': "Coal Roller Service",
    'category': 'Tools',
    'depends': ['iap'],
}

Оскільки запит від клієнта надходить як JSON-RPC2, нам знадобиться відповідний контролер, який може викликати iap_charge і виконувати службу в межах:

coalroller_service/controllers/main.py
from passlib import pwd, hash

from odoo import http
from odoo.addons.iap import charge

class CoalBurnerController(http.Controller):
    @http.route('/roll', type='json', auth='none', csrf='false')
    def roll(self, account_token):
        # the service key *is a secret*, it should not be committed in
        # the source
        service_key = http.request.env['ir.config_parameter'].sudo().get_param('coalroller.service_key')

        # we charge 1 credit for 10 seconds of CPU
        cost = 1
        # TODO: allow the user to specify how many (tens of seconds) of CPU they want to use
        with charge(http.request.env, service_key, account_token, cost):

            # 10 seconds of CPU per credit
            end = time.time()  (10 * cost)
            while time.time() < end:
                # we will use CPU doing useful things: generating and
                # hashing passphrases
                p = pwd.genphrase()
                h = hash.pbkdf2_sha512.hash(p)
        # here we don't have anything useful to the client, an error
        # will be raised & transmitted in case of issue, if no error
        # is raised we did the job

Помічник iap_charge:

  1. авторизувати (створити) транзакцію з вказаною кількістю кредитів, якщо на рахунку недостатньо кредитів, викличе відповідну помилку

  2. виконати тіло оператора з

  3. якщо тіло з виконується успішно, за потреби оновіть ціну транзакції

  4. захоплення (підтвердження) транзакції

  5. інакше, якщо з тіла with виникає помилка, скасуйте транзакцію (і зніміть утримання кредитів)

Небезпека

За замовчуванням iap_charge зв’язується з виробничою кінцевою точкою IAP, https://iap.odoo.com. Розробляючи та тестуючи свій сервіс, ви можете спрямувати його на кінцеву точку IAP development https://iap-sandbox.odoo.com.

Для цього встановіть параметр конфігурації iap.endpoint у вашій службі Odoo: у режимі налагодження/розробника, Налаштування ‣ Технічні ‣ Параметри ‣ Параметри системи, просто визначте запис для ключа iap.endpoint, якщо такого ще не існує).

Помічник iap_charge має два додаткові необов’язкові параметри, які ми можемо використовувати, щоб зробити речі зрозумілішими для кінцевого користувача.

description

це повідомлення, яке буде пов’язане з транзакцією та відображатиметься на інформаційній панелі користувача, корисно нагадати користувачеві, чому існує стягнення.

credit_template

це назва шаблону Шаблони QWeb, який буде відображено та показано користувачеві, якщо в його обліковому записі буде менше доступного кредиту, ніж запитує постачальник послуг; його мета полягає в тому, щоб повідомити вашим користувачам, чому вони повинні бути зацікавлені ваші пропозиції IAP.

coalroller_service/__manifest__.py
{
    'name': "Coal Roller Service",
    'category': 'Tools',
    'depends': ['iap'],
    'data': [
        'views/no-credit.xml',
    ],
}
coalroller_service/controllers/main.py
@http.route('/roll', type='json', auth='none', csrf='false')
def roll(self, account_token):
    # the service key *is a secret*, it should not be committed in
    # the source
    service_key = http.request.env['ir.config_parameter'].sudo().get_param('coalroller.service_key')

    # we charge 1 credit for 10 seconds of CPU
    cost = 1
    # TODO: allow the user to specify how many (tens of seconds) of CPU they want to use
    with charge(http.request.env, service_key, account_token, cost,
                description="We're just obeying orders",
                credit_template='coalroller_service.no_credit'):

        # 10 seconds of CPU per credit
        end = time.time()  (10 * cost)
        while time.time() < end:
            # we will use CPU doing useful things: generating and
            # hashing passphrases
            p = pwd.genphrase()
            h = hash.pbkdf2_sha512.hash(p)
coalroller_service/views/no-credit.xml
<odoo>
    <template id="no_credit" name="No credit warning">
        <div>
            <div class="container-fluid">
                <div class="row">
                    <div class="col-md-7 offset-lg-1 mt32 mb32">
                    <h2>Consume electricity doing nothing useful!</h2>
                    <ul>
                        <li>Heat our state of the art data center for no reason</li>
                        <li>Use multiple watts for only 0.1€</li>
                        <li>Roll coal without going outside</li>
                    </ul>
                    </div>
                </div>
            </div>
        </div>
    </template>
</odoo>

API транзакцій JSON-RPC2

../../_images/flow.png
  • API транзакцій IAP не потребує використання Odoo під час впровадження вашого серверного шлюзу, виклики є стандартними JSON-RPC2.

  • Виклики використовують різні кінцеві точки, але той самий метод на всіх кінцевих точках (call).

  • Винятки повертаються як помилки JSON-RPC2, офіційна назва винятку доступна на data.name для програмних маніпуляцій.

Перегляньте також

iap.odoo.com документація для додаткової інформації.

Авторизувати

/iap/1/authorize

Перевіряє, що в обліковому записі користувача є принаймні кредит доступний і створює утримання (незавершену транзакцію) на цю суму.

Будь-яка сума, яка зараз утримується транзакцією, що очікує на розгляд, вважається недоступною для подальшої авторизації дзвінків.

Повертає TransactionToken, що ідентифікує незавершену транзакцію, яку можна використати для запису (підтвердження) або скасування зазначеної транзакції (iap.odoo.com документація).

Параметри
  • key (ServiceKey) –

  • account_token (UserToken) –

  • credit (float) –

  • description (str) – необов’язково, допомагає користувачам визначити причину стягнення плати з їхнього рахунку

  • dbuuid (str) – необов’язковий, дозволяє користувачеві скористатися пробними кредитами, якщо його база даних відповідає вимогам (див. Реєстрація послуги)

Повертає

TransactionToken, якщо авторизація пройшла успішно

Raises

AccessError, якщо токен служби недійсний

Raises

InsufficientCreditError якщо в обліковому записі недостатньо кредитів

Raises

TypeError, якщо значення credit не є цілим чи числом з плаваючою точкою

r = requests.post(ODOO + '/iap/1/authorize', json={
    'jsonrpc': '2.0',
    'id': None,
    'method': 'call',
    'params': {
        'account_token': user_account,
        'key': SERVICE_KEY,
        'credit': 25,
        'description': "Why this is being charged",
    }
}).json()
if 'error' in r:
    # handle authorize error
tx = r['result']

# provide your service here

Захоплення

/iap/1/capture

Підтверджує вказану транзакцію, переказуючи зарезервовані кредити з облікового запису користувача до постачальника послуг.

Виклики захоплення є ідемпотентними: виконання викликів захоплення вже захопленої транзакції не має подальшого ефекту.

Параметри
  • token (TransactionToken) –

  • key (ServiceKey) –

  • credit_to_capture (float) – необов’язковий параметр для отримання меншої кількості кредитів, ніж дозволено

Raises

AccessError

  r2 = requests.post(ODOO + '/iap/1/capture', json={
      'jsonrpc': '2.0',
      'id': None,
      'method': 'call',
      'params': {
          'token': tx,
          'key': SERVICE_KEY,
          'credit_to_capture': credit or False,
      }
  }).json()
  if 'error' in r:
      # handle capture error
  # otherwise transaction is captured

Скасувати

/iap/1/cancel

Скасовує вказану транзакцію, скасовуючи утримання кредитів користувача.

Виклики скасування є ідемпотентними: виконання викликів захоплення вже скасованої транзакції не має подальшого ефекту.

Параметри
Raises

AccessError

r2 = requests.post(ODOO + '/iap/1/cancel', json={
    'jsonrpc': '2.0',
    'id': None,
    'method': 'call',
    'params': {
        'token': tx,
        'key': SERVICE_KEY,
    }
}).json()
if 'error' in r:
    # handle cancel error
# otherwise transaction is cancelled

Типи

Крім винятків, це абстрактні типи, які використовуються для ясності, вас не має хвилювати, як вони реалізовані.

class ServiceName

Рядок, що ідентифікує вашу послугу на https://iap.odoo.com (виробництво), а також пов’язаний із вашою послугою обліковий запис у базі даних клієнта.

class ServiceKey

Ідентифікатор, згенерований для послуги провайдера. Кожному ключу (і службі) відповідає токен фіксованого значення, згенерований постачальником послуги.

Різні типи токенів відповідають різним послугам. Наприклад, SMS та MMS можуть бути або однією послугою (коли MMS „коштує“ декілька SMS), або окремими послугами з різними цінами.

Небезпека

Ваш службовий ключ є секретом, витік вашого службового ключа дозволяє іншим розробникам додатків отримати кредити, придбані за ваші послуги.

class UserToken

Ідентифікатор облікового запису користувача.

class TransactionToken

Ідентифікатор транзакції, повернутий процесом авторизації та використаний під час запису або скасування транзакції.

exception odoo.addons.iap.tools.iap_tools.InsufficientCreditError

Викликається під час авторизації транзакції, якщо запитані кредити наразі недоступні в обліковому записі (або недостатньо кредитів, або забагато незавершених транзакцій/існуючих утримань).

exception odoo.exceptions.AccessError

Виявлено:

  • будь-яка операція, для якої потрібен службовий токен, якщо службовий токен недійсний; або

  • будь-який збій у міжсерверному виклику. (зазвичай у iap_jsonrpc()).

exception odoo.exceptions.UserError

Викликається будь-якою несподіваною поведінкою на розсуд розробника додатку (ви).

Тестування API

Щоб протестувати розроблений додаток, ми пропонуємо платформу ізольованого програмного середовища, яка дозволяє:

  1. Перевірте весь потік з точки зору клієнта - фактичні послуги та транзакції, з якими можна ознайомитися. (це знову потребує зміни кінцевої точки, див. примітку про небезпеку в Послуга).

  2. Тестування API.

Останній складається з конкретних токенів, які працюватимуть лише в IAP-Sandbox.

  • Токен 000000: Представляє неіснуючий обліковий запис. Повертає InsufficientCreditError під час спроби авторизації.

  • Токен 000111: представляє обліковий запис без достатньої кількості кредитів для виконання будь-яких послуг. Повертає InsufficientCreditError під час спроби авторизації.

  • Токен 111111: Представляє обліковий запис із достатньою кількістю кредитів для виконання будь-яких послуг. Спроба авторизації поверне фіктивний токен транзакції, який обробляється маршрутами захоплення та скасування.

Примітка

  • Ці токени активні лише на сервері IAP-Sanbox.

  • Службовий ключ повністю ігнорується в цьому потоці. Якщо ви хочете запустити надійний тест вашої служби, вам слід ігнорувати ці токени.

Помічники Odoo

Для зручності, якщо ви впроваджуєте свою послугу за допомогою Odoo, модуль iap надає кілька помічників, щоб зробити потік IAP ще простішим.

Charging

class odoo.addons.iap.tools.iap_tools.iap_charge(env, key, account_token, credit[, dbuuid, description, credit_template])

Контекстний менеджер для авторизації та автоматичного захоплення або скасування транзакцій для використання у серверній частині/проксі.

Працює так само, як напр. менеджер контексту курсора:

  • негайно авторизує транзакцію із зазначеними параметрами;

  • виконує with тілом;

  • якщо тіло виконується повністю без помилок, фіксує транзакцію;

  • інакше скасовує його.

Параметри
  • env (odoo.api.Environment) – використовується для отримання ключа конфігурації iap.endpoint

  • key (ServiceKey) –

  • token (UserToken) –

  • credit (float) –

  • description (str) –

  • credit_template (Qweb template) –

  @route('/deathstar/superlaser', type='json')
  def superlaser(self, user_account,
                 coordinates, target,
                 factor=1.0):
      """
      :param factor: superlaser power factor,
                     0.0 is none, 1.0 is full power
      """
      credits = int(MAXIMUM_POWER * factor)
      description = "We will demonstrate the power of this station on your home planet of Alderaan."
      with iap_charge(request.env, SERVICE_KEY, user_account, credits, description) as transaction:
          # TODO: allow other targets
          transaction.credit = max(credits, 2)
          # Sales ongoing one the energy price,
          # a maximum of 2 credits will be charged/captured.
          self.env['systems.planets'].search([
              ('grid', '=', 'M-10'),
              ('name', '=', 'Alderaan'),
          ]).unlink()

Авторизувати

class odoo.addons.iap.tools.iap_tools.iap_authorize(env, key, account_token, credit[, dbuuid, description, credit_template])

Дасть дозвіл на все.

Параметри
  • env (odoo.api.Environment) – використовується для отримання ключа конфігурації iap.endpoint

  • key (ServiceKey) –

  • token (UserToken) –

  • credit (float) –

  • description (str) –

  • credit_template (Qweb template) –

  @route('/deathstar/superlaser', type='json')
  def superlaser(self, user_account,
                 coordinates, target,
                 factor=1.0):
      """
      :param factor: superlaser power factor,
                     0.0 is none, 1.0 is full power
      """
      credits = int(MAXIMUM_POWER * factor)
      description = "We will demonstrate the power of this station on your home planet of Alderaan."
      #actual IAP stuff
      transaction_token = authorize(request.env, SERVICE_KEY, user_account, credits, description=description)
      try:
          # Beware the power of this laser
          self.put_galactical_princess_in_sorrow()
      except Exception as e:
          # Nevermind ...
          r = cancel(env,transaction_token, key)
          raise e
      else:
          # We shall rule over the galaxy!
          capture(env,transaction_token, key, min(credits, 2))

Скасувати

class odoo.addons.iap.tools.iap_tools.iap_cancel(env, transaction_token, key)

Скасує авторизовану трансакцію.

Параметри
  • env (odoo.api.Environment) – використовується для отримання ключа конфігурації iap.endpoint

  • transaction_token (str) –

  • key (ServiceKey) –

  @route('/deathstar/superlaser', type='json')
  def superlaser(self, user_account,
                 coordinates, target,
                 factor=1.0):
      """
      :param factor: superlaser power factor,
                     0.0 is none, 1.0 is full power
      """
      credits = int(MAXIMUM_POWER * factor)
      description = "We will demonstrate the power of this station on your home planet of Alderaan."
      #actual IAP stuff
      transaction_token = authorize(request.env, SERVICE_KEY, user_account, credits, description=description)
      try:
          # Beware the power of this laser
          self.put_galactical_princess_in_sorrow()
      except Exception as e:
          # Nevermind ...
          r = cancel(env,transaction_token, key)
          raise e
      else:
          # We shall rule over the galaxy!
          capture(env,transaction_token, key, min(credits, 2))

Захоплення

class odoo.addons.iap.tools.iap_tools.iap_capture(env, transaction_token, key, credit)

Зафіксує суму кредиту для даної транзакції.

Параметри
  • env (odoo.api.Environment) – використовується для отримання ключа конфігурації iap.endpoint

  • transaction_token (str) –

  • key (ServiceKey) –

  • credit

  @route('/deathstar/superlaser', type='json')
  def superlaser(self, user_account,
                 coordinates, target,
                 factor=1.0):
      """
      :param factor: superlaser power factor,
                     0.0 is none, 1.0 is full power
      """
      credits = int(MAXIMUM_POWER * factor)
      description = "We will demonstrate the power of this station on your home planet of Alderaan."
      #actual IAP stuff
      transaction_token = authorize(request.env, SERVICE_KEY, user_account, credits, description=description)
      try:
          # Beware the power of this laser
          self.put_galactical_princess_in_sorrow()
      except Exception as e:
          # Nevermind ...
          r = cancel(env,transaction_token, key)
          raise e
      else:
          # We shall rule over the galaxy!
          capture(env,transaction_token, key, min(credits, 2))