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

Создание платежа по подписке (рекурренты)

Рекуррентные платежи через СБП позволяют автоматически списывать средства со счёта клиента в банковском приложении без его повторного участия. Идентификация счёта выполняется по токену, который выдаётся при первичной привязке.

Для активации функционала в проекте обратитесь к сопровождающему менеджеру 1Payment.

Принцип работы

Процесс работы с подписками СБП состоит из четырёх этапов:

  1. Привязка счёта (первый запрос) — вы проводите успешный платёж с суммой больше 0 и параметром subscribe=1 через форму оплаты или GATE. Плательщик подтверждает привязку в приложении банка.
  2. Получение токена — после подтверждения банком 1Payment отправляет колбек с уникальным token. Сохраните его для последующих списаний.
  3. Автосписание (рекуррент) — для повторных оплат ваш сервер вызывает GATE (init_payment), передавая сохранённый token. Списание проходит без участия плательщика.
  4. Уведомление — после каждой попытки списания приходит колбек с финальным результатом транзакции.

Техническая информация

ЭтапЭндпоинтМетоды
Регистрация подписки (форма)https://api.1payment.com/init_formGET, POST
Регистрация подписки (GATE)https://api.1payment.com/init_paymentGET, POST
Рекуррентное списание (GATE)https://api.1payment.com/init_paymentPOST (рекомендуется), GET

Формат ответа: JSON. Для СБП в запросах указывайте payment_type=sbp.

1. Регистрация подписки (первый запрос)

Для регистрации подписки проведите успешный платёж с суммой больше 0 и параметром subscribe=1. Подробнее о параметрах формы и GATE — в разделах Создание платежа по форме и Создание платежа по host2host (GATE). Ниже — обязательный набор для привязки.

Обязательные параметры (инициация)

ПараметрТипОписание
partner_idIntegerВаш уникальный ID в системе 1Payment.
project_idIntegerИдентификатор вашего проекта.
amountNumberСумма платежа при привязке — больше 0 (например, 50.00).
subscribeIntegerФлаг создания подписки. Всегда 1.
payment_typeStringДля СБП всегда sbp.
user_dataStringВаш уникальный ID заказа для сопоставления.
shop_urlStringURL сайта, на котором совершается покупка.
signStringКонтрольная подпись (см. ниже).

Дополнительные параметры (инициация)

ПараметрТипОписание
descriptionStringОписание подписки для клиента.
success_urlStringURL возврата клиента при успехе.
failure_urlStringURL возврата клиента при ошибке.
user_idStringID плательщика в вашей системе.

Подпись при регистрации через форму — префикс init_form. Через GATE — префикс init_payment.

MD5(init_form + <параметры_без_sign_в_алфавитном_порядке_через_&> + <API_KEY>)
MD5(init_payment + <параметры_без_sign_в_алфавитном_порядке_через_&> + <API_KEY>)

2. Рекуррентное списание (повторные платежи)

Для автоматического списания отправьте запрос на GATE с сохранённым token. При активной подписке участие клиента не требуется.

Обязательные параметры (рекуррент)

ПараметрТипОписание
partner_idIntegerВаш уникальный ID в системе 1Payment.
payment_typeStringВсегда sbp.
project_idIntegerИдентификатор вашего проекта.
amountNumberСумма очередного списания (например, 50.00).
tokenStringТокен, полученный при регистрации подписки (из колбека).
user_dataStringНовый уникальный ID транзакции.
shop_urlStringURL сайта источника платежа.
signStringКонтрольная подпись (префикс init_payment).

Формирование подписи (sign)

MD5(init_payment + <параметры_без_sign_в_алфавитном_порядке_через_&> + <API_KEY>)

Проверка подписи (рекуррентное списание)

Проверка подписи {{method}}

Вставьте параметры запроса (JSON), API key и подпись. Виджет автоматически проверит корректность.

Строка параметров: amount=500.00&partner_id=1234&payment_type=sbp&project_id=5678&shop_url=http://myshop.ru&token=sbp_t_1a2b3c&user_data=sbp_order_888
Строка для MD5: init_paymentamount=500.00&partner_id=1234&payment_type=sbp&project_id=5678&shop_url=http://myshop.ru&token=sbp_t_1a2b3c&user_data=sbp_order_888
Ожидаемая подпись: c56ee7e986fa478392060c581bcf9ee1
Подпись не совпадает

Примеры запроса

const crypto = require('crypto');
const axios = require('axios');

// 1. Инициация подписки (первичная привязка)
async function setupSbpSubscription(apiKey, params) {
  const sortedKeys = Object.keys(params).sort();
  const queryString = sortedKeys.map((k) => `${k}=${params[k]}`).join('&');

  const baseString = `init_form${queryString}${apiKey}`;
  params.sign = crypto.createHash('md5').update(baseString).digest('hex');

  const response = await axios.post('https://api.1payment.com/init_form', params);
  return response.data; // ссылка для подтверждения в приложении банка
}

// 2. Рекуррентное списание (по токену)
async function chargeSbpByToken(apiKey, params) {
  const sortedKeys = Object.keys(params).sort();
  const queryString = sortedKeys.map((k) => `${k}=${params[k]}`).join('&');

  const baseString = `init_payment${queryString}${apiKey}`;
  params.sign = crypto.createHash('md5').update(baseString).digest('hex');

  const response = await axios.post('https://api.1payment.com/init_payment', params);
  return response.data;
}

const secretKey = process.env.ONEPAYMENT_API_KEY;

// Пример: привязка
const setupData = {
  partner_id: 1234,
  project_id: 5678,
  amount: '50.00',
  subscribe: 1,
  payment_type: 'sbp',
  user_data: 'sbp_setup_777',
  shop_url: 'http://myshop.ru',
};
// setupSbpSubscription(secretKey, setupData).then(console.log);

// Пример: списание
const recurringData = {
  partner_id: 1234,
  payment_type: 'sbp',
  project_id: 5678,
  token: 'sbp_t_1a2b3c',
  amount: '500.00',
  user_data: 'sbp_order_888',
  shop_url: 'http://myshop.ru',
};
chargeSbpByToken(secretKey, recurringData).then(console.log);

Ответ API

При успешном рекуррентном запросе (200):

{
  "order_id": "8p3brmb19gfg0sg8gcwhws8kgc748s87",
  "status": 2,
  "status_description": "PENDING"
}

При регистрации через форму в ответе будет поле url (см. Создание платежа по форме); через GATE — redirect_url (см. Создание платежа по host2host (GATE)).

Ошибка запроса (400):

{
  "error_code": 2
}

Уведомления о статусе (колбеки)

При успешной привязке или списании система отправляет POST-запрос в формате JSON на ваш notify_url.

ПараметрТипОбяз.Описание
payment_typeStringДаТип платежа (sbp).
order_idStringДаID платежа в системе 1Payment.
project_idIntegerДаID вашего проекта.
statusIntegerДаСостояние: 3 (успех), 4 (отказ).
status_descriptionStringДаSUCCESS или FAILURE.
init_timeStringДаВремя создания платежа.
status_timeStringДаВремя получения финального статуса.
merchant_priceNumberДаСумма для плательщика.
init_priceNumberДаСумма при инициации.
user_priceNumberДаСумма к начислению партнёру.
currencyStringДаВалюта (ISO 4217).
accountStringДаДля СБП — sbp.
user_dataStringДаВаш ID транзакции, переданный при создании.
signStringДаКонтрольная подпись колбека.
tokenStringНетТокен для последующих списаний — сохраните при привязке.
testIntegerНет1 для тестовых транзакций.
status_codeStringНетКод причины отказа.

Важно: ваш сервер должен вернуть HTTP 200 OK. Иначе система повторяет отправку колбека раз в минуту в течение 10 минут.

Проверка подписи колбека: MD5 от параметров в алфавитном порядке через & + API_KEY (без префикса init_payment). Подробнее — в разделе Формат запроса к API.

Связанные разделы

Статья была полезна?