Перейти к основному содержимому

Оплата в Telegram

Вы можете принимать платежи от пользователей Telegram за предоставляемые услуги или товары. Есть два способа настройки оплаты в сценарии JAICP:

  1. С помощью тега действия TelegramPayment.
  2. С помощью ответа бота telegramPayment через объект $response.

Тег действия — это готовое решение, которое вы можете быстро встроить в сценарий, лишь указав необходимые параметры. Использование ответа бота через $response подходит для сценариев, в которых нужно более гибко настроить проверку наличия товара.

В этой статье описан пример, как настроить оплату с помощью ответа бота telegramPayment. Подробное описание того, как использовать тег действия, вы можете найти в статье TelegramPayment.

Пример использования

Рассмотрим следующий пример. Вы хотите, чтобы бот отправил пользователю форму на оплату билета.

Чтобы это сделать, необходимо:

  1. Создать бота в Telegram.
  2. Подключить платежную систему и получить ее уникальный токен.
  3. Использовать в сценарии ответ с типом telegramPayment
state: TelegramPayment
intent!: /Payment
script:
$response.replies = $response.replies || [];
$response.replies.push({
"type": "telegramPayment",
"providerToken": $injector.providerToken,
"startParameter": true,
"paymentTitle": "Она",
"description": "Кинотеатр «Аврора», 25 декабря, 12:00",
"imageUrl": "https://upload.wikimedia.org/wikipedia/en/4/44/Her2013Poster.jpg",
"amount": "400",
"currency": "RUB",
"invoicePayload": "197110, Санкт-Петербург, ул. Большая Зеленина, 24, стр. 1"
});

Статус товара

Перед тем как обработать платеж, Telegram отправляет в JAICP запрос на проверку наличия товара. В сценарии на этот запрос срабатывает событие telegramPrecheckoutEvent. Добавьте в стейт TelegramPayment два вложенных стейта: Precheckout и PaymentFailed.

подсказка
Используйте тип ответа telegramPaymentPrecheckout, чтобы установить статус проверки.

Для проверки наличия товара бот будет посылать запросы на URL-адрес сервиса, который вы укажете в переменной precheckoutUrl. Если товара нет в наличии и сервис вернет ответ с HTTP-кодом, отличным от 2xx, то бот перейдет в стейт PaymentFailed. В этом стейте будут обрабатываться ошибки, его реализация будет рассмотрена позже.

state: Precheckout
event: telegramPrecheckoutEvent
script:
// URL-адрес сервиса для проверки наличия товара.
var precheckoutUrl = "https://www.example.com/";

$response.replies = $response.replies || [];
var telegramPrecheckoutReply = {
type: "telegramPaymentPrecheckout",
precheckoutId: $request.query,
success: true
};
try {
var response = $http.query(precheckoutUrl);
if (!response.isOk) {
telegramPrecheckoutReply.success = false;
$reactions.transition("/TelegramPayment/PaymentFailed");
}
} catch (e) {
telegramPrecheckoutReply.success = false;
$reactions.transition("/TelegramPayment/PaymentFailed");
}
$response.replies.push(telegramPrecheckoutReply);

state: PaymentFailed
event: telegramPaymentFailedEvent
a: Возникли неполадки. Пожалуйста, напишите нам на client@just-ai.com, чтобы купить билет.

предупреждение
Примечание
В сценарии нужно обязательно обрабатывать событие telegramPrecheckoutEvent. Иначе платежи не будут проходить, а последующие сообщения пользователя будут обрабатываться в стейте CatchAll.

Если вам не нужно проверять наличие товара перед оплатой, то используйте в сценарии следующую запись:

state: Precheckout
event: telegramPrecheckoutEvent
script:
$response.replies = $response.replies || [];
$response.replies.push({
"type": "telegramPaymentPrecheckout",
"precheckoutId": $request.query,
"success": true
});

В таком случае событие будет всегда успешно обрабатываться, а товар будет считаться всегда в наличии.

Статус оплаты

Для обработки статуса оплаты предусмотрены события:

  • telegramPaymentSuccessEvent — оплата прошла успешно.
  • telegramPaymentFailedEvent — возникла ошибка, потому что товара нет в наличии или параметры ответа заполнены некорректно. Например, был указан невалидный токен или цена меньше минимального допустимого значения.
  • noMatch — оплата не прошла и пользователь отправил произвольное сообщение боту.

Создайте для telegramPaymentSuccessEvent и noMatch вложенные стейты PaymentSuccessful и CatchAll. Для обработки события telegramPaymentFailedEvent используйте написанный ранее стейт PaymentFailed.

state: PaymentSuccessful
event: telegramPaymentSuccessEvent
a: Оплата прошла успешно. Мы выслали ваш билет на указанный email. До встречи в эфире!
go!: /SendTickets

state: CatchAll
event: noMatch
a: Платеж не прошел. Проверьте, пожалуйста, правильность введенных данных и повторите попытку.
go!: /TelegramPayment
Полный пример сценария
state: TelegramPayment
intent!: /Payment
script:
$response.replies = $response.replies || [];
$response.replies.push({
"type": "telegramPayment",
"providerToken": $injector.providerToken,
"startParameter": true,
"paymentTitle": "Она",
"description": "Кинотеатр «Аврора», 25 декабря, 12:00",
"imageUrl": "https://upload.wikimedia.org/wikipedia/en/4/44/Her2013Poster.jpg",
"amount": "400",
"currency": "RUB",
"invoicePayload": "197110, Санкт-Петербург, ул. Большая Зеленина, 24, стр. 1"
});

state: Precheckout
event: telegramPrecheckoutEvent
script:
// URL-адрес сервиса для проверки наличия товара.
var precheckoutUrl = "https://www.example.com/";

$response.replies = $response.replies || [];
var telegramPrecheckoutReply = {
type: "telegramPaymentPrecheckout",
precheckoutId: $request.query,
success: true
};
try {
var response = $http.query(precheckoutUrl);
if (!response.isOk) {
telegramPrecheckoutReply.success = false;
$reactions.transition("/TelegramPayment/PaymentFailed");
}
} catch (e) {
telegramPrecheckoutReply.success = false;
$reactions.transition("/TelegramPayment/PaymentFailed");
}
$response.replies.push(telegramPrecheckoutReply);

state: PaymentFailed
event: telegramPaymentFailedEvent
a: Возникли неполадки. Пожалуйста, напишите нам на client@just-ai.com, чтобы купить билет.

state: PaymentSuccessful
event: telegramPaymentSuccessEvent
a: Оплата прошла успешно. Мы выслали ваш билет на указанный email. До встречи в эфире!
go!: /SendTickets

state: CatchAll
event: noMatch
a: Платеж не прошел. Проверьте, пожалуйста, правильность введенных данных и повторите попытку.
go!: /TelegramPayment