Прием платежей в SmartApp Graph

Если ваш смартап создан в SmartApp Graph, то вы можете подключить платежи в несколько этапов:

  1. Добавление товара в счет.
  2. Отправка счета в платежную систему.
  3. Обработка результата оплаты.
  4. Возобновление сценария после оплаты.

Для смартапов, созданных в SmartApp Graph, доступно подключение только одностадийных платежей.

Перед подключением

Получение токена

Для подключения оплаты в проекте SmartApp Graph вам понадобится авторизационный токен, который необходимо передавать в каждом запросе.

Как устроено подключение монетизации вы можете посмотреть в шаблоне Пример подключения монетизации.

Подключение библиотеки

Перед созданием логики оплаты товаров убедитесь, что в проекте подключены необходимые библиотеки и указан токен авторизации:

  1. Откройте созданный в SmartApp Graph проект с помощью SmartApp Code:

    1. Войдите в SmartApp Code с помощью своего Сбер ID.
    2. Выберите проект в списке SmartApp Graph.
  2. Перейдите на вкладку Сценарии, откройте файл chatbot.yaml и убедитесь, что в файле подключены необходимые библиотеки и задан токен авторизации:

    scriptsPreLoad:
     global:
         - /jslib/moment.min.js
         - /jslib/underscore.js
         - /jsapi/common.js
         - /jsapi/http.js
     local:
         - /jsapi/mail.js
         - /jsapi/reactions.js
         - /jsapi/payment.js
    
    injector:
      pay_api_key: '<Токен авторизации>'

Использование блока JS-код

Добавление товара, отправка счета и обработка результата происходит с помощью блока JS Код, в котором необходимо определить соответствующие функции. Добавить логику оплаты товара и определить функции можно как в одном, так и в нескольких блоках JS Код, в зависимости от сценария смартапа.

При использовании в блоке JS Код переменных, полученных в сценарии, к ним необходимо обращаться следующим образом:

$session.<название_переменной>

Подключение платежей

Добавление товара

Для добавления товара в счет:

  1. Добавьте блок JS Код в необходимое место в сценарии смартапа.
  2. В блоке вызовите функцию $payment.addItem() и передайте ей необходимый товар:

    $payment.addItem({
     "name": "Кучка из 100 кристаллов для использования при нырянии",
     "item_price": 11836,
     "item_amount": 11836,
     "item_code": "com.MashaAndTheBear.HairSalon.crystal100",
     "image url": "https://i-love-png.com/images/grim-reaper-icon.png",
     "quantity": {
           "value": 1.05,
           "measure": "кг."
     },
     "invoice_params": {
            "key": "packageName",
            "value": "com.MashaAndTheBear.HairSalon"
     }
     "discount_type": "percent",
     "discount_value": 5.25,
     "interest_type": "agentPercent",
     "interest_value": 15.105,
     "tax_type": 6,
     "tax_sum": 2367,
    })

Создание счета

После добавления товара необходимо завершить оформление счета в платежной системе. Для этого вызовите в блоке JS Код функцию $payment.createPayment(invoice, api_key) и передайте ей параметры для формирования счета.

Вы можете передать токен авторизации в качестве параметра функции. При этом значение, заданное в файле chatbot.yaml при подключении платежной библиотеки, будет игнорироваться.

Функция вызывает метод POST /invoices и, при удачном выполнении запроса, возвращает объект с идентификатором счета (поле invoice_id).

Пример вызова $payment.createPayment() и получения идентификатора счета.

var response = $payment.createPayment(
    {
        // переменная, в которой сохранится ответ функции с идентификатором счета
        purchaser: {
            email: 'qq@dd.eof',
            phone: 9123456789,
            contact: 'email',
        },
        delivery_info: {
            address: {
                country: 'RU',
                city: 'Москва',
                address: 'ул. Вавилова, 19, офис 1',
            },
            delivery_type: 'courier',
            description: 'Перезвонить за 1,5 часа',
        },
        order: {
            order_id: 'd290f1ee-6c54-4b01-90e6-d701748f0851',
            order_number: 145,
            service_id: '9',
            amount: 11836,
            currency: 'RUB',
            purpose: 'Покупка в игре "Маша и Медведь, салон красоты Чародейка".',
            description: 'Покупка внутриигрового контента в игре Маша и Медведь, салон красоты Чародейка.',
            language: 'ru-RU',
            expiration_date: '2020-07-31T07:32:56.288Z',
            autocompletion_date: '2020-07-31T07:32:56.288Z',
            tax_system: 0,
        },
    },
    'SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c', // пример токена авторизации
);
$session.invoice_id = response.invoice_id; // получение идентификатора счета из переменной

Функцию можно вызвать как в текущем блоке JS Код, так и в новом, расположенном в сценарии после блока, который добавляет товар.

Полученный идентификатор передается ассистенту для запуска сценария оплаты.

Запуск оплаты

Чтобы ассистент запустил сценарий оплаты, в блоке JS Код вызовите функцию $reactions.pay() и передайте в параметрах идентификатор счета invoice_id:

$reactions.pay($session.invoice_id);

Функцию можно вызвать как в текущем блоке JS Код, так и в новом, расположенном в сценарии после блока, который добавляет товар.

По результатам оплаты в сценарий приходит событие PAY_DIALOG_FINISHED, которое необходимо обработать для возврата в сценарий оплаты.

Возврат в сценарий

Для возврата в основной сценарий смартапа необходимо определить стейт, который будет обрабатывать код ответа из события PAY_DIALOG_FINISHED.

Стейты создаются в файле main.sc автоматически при добавлении в сценарий любых блоков.

Пример стейта блока Текст, который добавлен в самом начале сценария:

theme: /

    state: newNode_0 // идентификатор стейта
        a: Результат оплаты

Чтобы вернуться в основной сценарий смартапа после оплаты:

  1. В SmartApp Graph добавьте в сценарий новый экран с блоком, который будет обрабатывать код ответа. В примере ниже код ответа обрабатывается блоком Условие.
  2. Откройте проект с помощью SmartApp Code.
  3. В папке /src создайте новый файл сценария (например, payfinish.sc) и добавьте в него логику обработки события завершения оплаты (PAY_DIALOG_FINISHED):

    theme: /
     state: PAY_DIALOG_FINISHED
         event!: PAY_DIALOG_FINISHED
         script:
             $session.response_code = $request.data.eventData.parameters.payment_response.response_code // сохраняем результат платежа
             $reactions.transition("/<идентификатор стейта>") // переход к блоку, который обрабатывает код ответа

    Сценарий должен содержать переход в стейт «Результат оплаты» основного сценария (файл main.sc).

  4. В файле entryPoint.sc добавьте новый сценарий:

    require: payfinish.sc
  5. Сохраните проект и откройте его в SmartApp Graph.
  6. Свяжите блок, который обрабатывает коды ответа с остальным сценарием смартапа. Возможные коды ответа response_code смотрите по ссылке.

Пример сценария с блоком Условие, который обрабатывает коды ответа:

Обработка кодов ответа

Вспомогательные функции

При подключении оплаты в смартап доступны вспомогательные функции, с помощью которых можно узнать статус оплаты, проверить содержимое корзины или очистить ее.

Проверка статуса оплаты

Функция checkPayment(invoice_id, api_key) возвращает текущий статус оплаты. Функцию можно использовать в отдельном блоке JS Код.

Вы можете передать токен авторизации в качестве параметра функции. При этом значение, заданное в файле chatbot.yaml при подключении платежной библиотеки, будет игнорироваться.

Пример:

var response = $payment.checkPayment($session.invoice_id);
$session.invoice_status = response.invoice_status;
$reactions.answer($session.invoice_status);

В этом случае переменная response будет содержать весь ответ. Статус оплаты хранится в поле invoice_status.

Очистка счета

Функция clearItems() удаляет все товары из счета. Функцию можно использовать в отдельном блоке JS-Код. Используйте эту функцию в сценарии после получения результата оплаты, чтобы очистить счет.

Пример:

$payment.clearItems();

Просмотр товаров в счете

Функция $payment.getItems() возвращает список товаров, добавленных в счет. Функцию можно использовать в отдельном блоке JS-Код.

$reactions.answer(JSON.stringify($payment.getItems()));

Заметили ошибку?

Выделите текст и нажмите Ctrl + Enter, чтобы сообщить нам о ней