Прием платежей через Native App SDK

Вы можете принимать платежи в смартапе Native App, если вы:

  • получили доступ к сервису SmartPay;
  • подключили библиотеку messaging в Native App.

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

Шаблон платежей

Чтобы принимать платежи в Native App, необязательно создавать отдельный сценарий. Используйте готовый шаблон в SmartApp Code. Шаблон — это готовый код, в который вам нужно подставить параметры своего смартапа.

Авторизация

Для приема платежей в Native App требуется аутентификация. Для этого:

  1. Получите токен для сервиса приема платежей SmartPay.
  2. Откройте шаблон платежей в SmartApp Code и перейдите в конфигурационный файл chatbot.yaml.
  3. Передайте полученный токен в параметре payapikey.

Прием платежей

Создание счета на оплату

Для создания счета на оплату добавьте в apk-файл код из примеров ниже и заполните параметры классов своими значениями. В результате вы получите json-объект с информацией о заказе. Эти данные бэкенд передаст в платежную библиотеку payment.js для оформления заказа.

Первую часть кода с формированием корзины можно расположить в любой части проекта:

fun addItemsToCartAndPay() {
    val cardInfo = CardInfo(
        1,
        name = "New Elephant",
        item_price = 100,
        item_amount = 100, // must be item_price*quantity.value,
        item_code = "ru.some.elephant",
        tax_type = 6,
        quantity = Quantity(
            1,
            "thing")
    )
    val orderInfo = OrderInfo(
        order_id = randomUUID().toString(),
        order_number = "1",
        description = "Покупка слона",
        tax_system = 0,
        amount = cardInfo.item_amount,
        purpose = "OOO Elephant Seller",
        service_id = "27"
    )
    viewModelScope.launch(ioCoroutineDispatcher) {
        messaging.sendAction(
            MessageName.SERVER_ACTION,
            formBuyServerActionPayload(
                cardInfo = cardInfo,
                orderInfo = orderInfo
            )
        )
    }
}

Вторую часть кода с объявлением классов рекомендуется вынести в отдельный .kt файл:

package ru.sberdevices.pub.demoapp.ui.smartapp.modelimport kotlinx.serialization.Serializable
@Serializable
data class BuyParameters(
    val cardInfo: CardInfo,
    val orderInfo: OrderInfo
)
@Serializable
data class CardInfo(
    val position_id: Int,   
    val name: String,   
    val item_price: Int,   
    val quantity: Quantity,   
    val item_amount: Int,   
    val currency: String = "RUB",   
    val item_code: String,   
    val tax_type: Int
)
@Serializable
data class Quantity(
    val value: Int,
    val measure: String
)
@Serializable
data class OrderInfo(
    val order_id: String,   
    val order_number: String,   
    val amount: Int,  
    val purpose: String,   
    val description: String,   
    val service_id: String,   
    val tax_system: Int,  
    val currency: String = "RUB",   
    val language: String = "ru-RU"
)

Параметры класса CardInfo


CardInfo — класс, в котором передается информация о товарных позициях в корзине.


Параметр Описание

position_id

Обязательное

integer

Номер (идентификатор) товарной позиции в системе магазина. Параметр должен быть уникальным в рамках запроса

name

Обязательное

string 

Наименование или описание товарной позиции

item_price

Обязательное

integer

Цена одной единицы товарной позиции. Например, цена за штуку или килограмм. Указывается без разделителя, в копейках

item_amount

Обязательное

string

Цена за все единицы товарной позиции в корзине. Например, общая цена за 3 штуки одного товара. Указывается без разделителя, в копейках

item_code

string

Номер (идентификатор) товарной позиции в системе магазина. Параметр должен быть уникальным в рамках запроса

currency

Обязательное

string

Код валюты платежа. Поддерживается только значение RUB

tax_type

Обязательное

integer

Значение ставки НДС:

  • 0 - без НДС
  • 1 - НДС по ставке 0%
  • 2 - НДС по ставке 10%
  • 3 - НДС по ставке 18%
  • 4 - НДС по ставке 10/110
  • 5 - НДС по ставке 18/118
  • 6 - НДС по ставке 20%
  • 7 - НДС по ставке 20/120

Значение «НДС по ставке 0%» отличается от варианта «без НДС» только формированием чека, который зависит от системы налогообложения. По сумме налога разницы нет

quantity

Обязательное

Quantity

Класс, в котором передается количество товара в позиции и его единица измерения


Параметры класса Quantity


Quantity — класс, в котором передается информация о количестве и единице измерения товара.

Параметр Описание

value

Обязательное

double

Количество товаров в позиции. Для разделителя используется «.»

measure

Обязательное

string 

Единица измерения количества для значения из поля value. Например: шт., кг. и т. п.


Параметры класса OrderInfo


OrderInfo — класс, в котором передается информация о заказе.


Параметр Описание

order_id

Обязательное

string (50)

Номер (идентификатор) товарной позиции в системе магазина. Параметр должен быть уникальным в рамках запроса

order_number

string  (50)

Номер заказа для отображения покупателю и отслеживания статуса заказа. Рекомендуем сделать его максимально понятным и простым

description

Обязательное

string (500)

Описание платежа для отображения плательщику

tax_system

Обязательное

integer

Система налогообложения:

  • 0 - общая
  • 1 - упрощенная, доход
  • 2 - упрощенная, доход минус расход
  • 3 - единый налог на вмененный доход
  • 4 - единый сельскохозяйственный налог
  • 5 - патентная система налогообложения

amount

Обязательное

integer

Сумма заказа без разделителя, в копейках. Например, 1 рубль передается в этом поле как 100

purpose

Обязательное

string (50)

Наименование вашего юридического лица. Например: ООО «Ромашка»

service_id

Обязательное

string

Идентификатор сервиса. Выдается вместе с эксплуатационным токеном для авторизации

currency

Обязательное

string

Код валюты платежа. Поддерживается только значение RUB

language

Обязательное

string

Язык для текстовых полей. Поддерживается только значение ru-RU

Получение статуса платежа

После создания счета необходимо получить статус платежа и обработать результат оплаты. Для этого используются следующие методы:

  • PayDialogFinished — метод для получения результата оплаты от ассистента.
  • ShowPaymentStatus — метод для проверки статуса платежа.
  • ActionNativeApp — метод для передачи информации о корзине и заказе в платежную библиотеку payments.js.

Эти методы передаются в коде, который необходимо вставить в SmartApp Code в файл main.cs:

    state: PayDialogFinished
        event!: PAY_DIALOG_FINISHED
        script:
            try {
                $temp.code = $request.data.eventData.payment_response.response_code;
                $jsapi.log("check invoice: response_code = "+$temp.code + "; device = "+$session.surface);                $reactions.transition("/ShowPaymentStatus");
            } catch(e) {
                $jsapi.log("catch(e)" + e.message);
                $reactions.transition("/PaymentStatusError");
            }   
    state: ShowPaymentStatus
        intent!: /checkStatus
        script:
            var response = $payment.checkPayment($session.invoice_id);
            $temp.code = response.invoice_status;
            var user_message = response.error.user_message           
            if ($temp.code == "confirmed") {
                reply( {
                    "pronounceText": "Поздравляю вас! Заказ успешно оплачен",
                    items: [
                            formSuccessBuyCommand($session.invoice_id, response.invoice.order.order_bundle)
                        ]
                    },
                    $response);
            } else {
                reply( {
                    "pronounceText": "Ошибка заказа. Статус инвойса: " + user_message,
                    items: [
                            formFailBuyCommand($session.invoice_id)
                        ]
                    },
                    $response);
            }    state: PaymentStatusError
        a: Ошибка платежа     
    state: ActionNativeApp
        event!: ACTION_FROM_NATIVE_APP
        script:
            var request = $jsapi.context().request;           
            $payment.clearItems();
            $payment.addItem(request.data.eventData.cardInfo);           
            var orderInfo = { order: request.data.eventData.orderInfo };
            $jsapi.log("ORDER INFO " + JSON.stringify(orderInfo))           
            var response = $payment.createPayment(orderInfo);
            $jsapi.log("Response: " + JSON.stringify(response))           
            $session.invoice_id = response.invoice_id;
            $reactions.pay($session.invoice_id);
// команда успешной покупки
function formSuccessBuyCommand(invoiceId, orderBundle) {
    return {
        "command": {
            type: "smart_app_data",
            smart_app_data: {
                command: "buy_success",
                buyItems: [ "elephant" ],
                invoiceId: invoiceId,
                orderBundle: orderBundle
            }
        }
    }
}// команда неуспешной покупки
function formFailBuyCommand(invoiceId) {
    return {
        "command": {
            type: "smart_app_data",
            smart_app_data: {
                command: "buy_fail",
                invoiceId: invoiceId
            }
        }
    }
}
// передача собственных ответов в Native App
function reply(body, response) {
    var replyData = {
        type: "raw",
        body: body
    };
    response.replies = response.replies || [];
    response.replies.push(replyData);
}

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

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