Платежи

Создание и обработка платежа происходит в несколько этапов:

  • Создание заказа
  • Вызов платежной формы
  • Получение статуса от платежной формы
  • Проверка состояния платежа
  • Обновление данных

Создание заказа

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

В ответ метод вернет invoice_id, который понадобится при проверке платежа и link, который необходимо использовать для вызова платежной формы.

Доступные для продажи товары предварительно настраиваются в панели управления в разделе Платежи / Витрина. При продаже внутри-игровой валюты, параметр количества (count) в методе является обязательным при создании заказа.

Вызов платежной формы

Полученное значение link необходимо передать в метод Telegram.WebApp.openInvoice.

Получение статуса от платежной формы

Для получения статуса платежа от Telegram необходимо в методе Telegram.WebApp.openInvoice указать обработчик платежа на стороне клиента. Если обработчик не был вызван или результат полученный в нем имеет значение не "paid" - платеж не завершен.

Проверка состояния платежа

В случае, если результат, полученный в обработчике метода Telegram.WebApp.openInvoice, имеет значение "paid", необходимо проверить успешность проведенного платежа. Для этого необходимо вызвать метод /invoice/status, куда передать полученный ранее invoice_id.

Обновление данных

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

Пример кода

function doPayment(product_id, count) {
    return new Promise((resolve, reject) => {
        Api.method.invoice.create(product_id, count).then((response) => {
            if (!response['invoice_id'] || !response['link']) { return reject(response); }
            let invoice_id   = response['invoice_id'];
            let invoice_link = response['invoice_link'];
            return Telegram.WebApp.openInvoice(invoice_link, (result) => {
                if (result !== 'paid') { return reject(); }
                Api.method.invoice.status(invoice_id).then((result) => {
                    if (result['status']) { return resolve(response); }
                    reject();
                }).catch(reject);
            });
        }).catch(reject);
    });
}