Сценарий из mcp-everything. Актуально на 2026-10-12.
Подходит для регулярных списаний, которыми управляет Prodamus. Подписку сначала создают в личном кабинете, затем покупатель подтверждает первый платёж.
GET /?do=link с subscription, signature и данными клиента. При переданном subscription поле products игнорируется.POST {urlNotification}; первый платёж имеет payment_init=manual, автоматическое списание — payment_init=auto.POST /rest/setActivity/ с subscription, идентификатором клиента и active_manager=0 либо active_user=0.const { HmacHelper, flattenForm } = require("./hmac");
const LINK_TO_FORM = "<ссылка_на_страницу_оплаты>";
const SECRET_KEY = "<секретный_ключ>";
const data = {
do: "link",
// Идентификатор подписки из раздела «Рекуррент и клубы». Если он передан,
// products не учитывается: состав и цена берутся из настроек подписки.
subscription: "12345",
customer_phone: "+79998887755",
customer_email: "test@example.com",
// Дата первого списания в формате ГГГГ-ММ-ДД ЧЧ:ММ.
subscription_date_start: "2026-08-01 12:00",
// Демо-период в днях: столько подписка действует до первого списания.
subscription_demo_period: "7",
// Максимальное количество автоплатежей.
subscription_limit_autopayments: "12",
sys: "your_sys_code",
urlReturn: "https://merchant.ru/return",
urlSuccess: "https://merchant.ru/success",
urlNotification: "https://merchant.ru/api/prodamus/webhook",
};
const params = new URLSearchParams(flattenForm(data));
params.append("signature", HmacHelper.create(data, SECRET_KEY));
const requestUrl = `${LINK_TO_FORM}?${params}`;
console.log(requestUrl);
fetch(requestUrl)
.then((response) => response.text())
.then((paymentLink) => console.log(paymentLink));
https://<subdomain>.payform.ruhttps://widget.prodamus.ru/src/init.jshttps://widget.prodamus.ru/src/init.cssdemo_mode=1Тип: Другое
Секретный ключ доступен в настройках платёжной страницы в блоке «Секретный ключ». Для создания платёжных ссылок, управления подписками и вызова GET или POST /rest/payment/do/ данные запроса без поля signature рекурсивно приводят к строкам, сортируют по ключам, преобразуют в JSON, экранируют / и подписывают HMAC SHA-256. Готовые реализации Hmac.php, hmac.js, prodamus_hmac.py, HmacHelper.cs, HmacHelper.java и hmac.go опубликованы на страницах документации.
Входящий webhook подписан в заголовке Sign; подпись проверяется тем же секретным ключом платёжной страницы. Для оплаты по связке поддержка выдаёт отдельный ключ, привязанный к sys; ключ платёжной страницы используют только для первого платежа.
Для GET /rest/receipt/getReceipts и GET /rest/payment-methods/getList передаются заголовки Timestamp и Authorization: Bearer <token>, где <token> = base64_encode(<timestamp> . md5(<SECRET_KEY>)).
Prodamus отправляет итоговый статус платежа методом POST. При успешной обработке endpoint должен вернуть HTTP 200.
Документация: https://help.prodamus.ru/payform/tekhnicheskaya-dokumentaciya/webhook-ob-oplate
| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
Sign |
header | string | да | HMAC-подпись входящего тела |
date |
body | string | да | Дата платежа |
order_id |
body | number | да | ID заказа в Prodamus |
order_num |
body | string | да | Номер заказа на стороне магазина; может быть пустым |
sum |
body | string | да | Сумма заказа |
currency |
body | string | да | rub, usd или eur |
attempt |
body | string | да | Номер попытки доставки |
products |
body | array | да | Корзина товаров |
products[i].name |
body | string | да | Наименование товара |
products[i].price |
body | number | да | Цена за единицу |
products[i].quantity |
body | integer | да | Количество |
payment_status |
body | string | да | success, order_canceled или order_denied |
payment_status_description |
body | string | да | Расшифровка статуса |
payment_init |
body | string | да | api, auto или manual |
Менеджер может активировать и деактивировать подписку; пользователь может только деактивировать её.
Документация: https://help.prodamus.ru/payform/tekhnicheskaya-dokumentaciya/rest-api/api-upravlenie-podpiskami#post-/rest/setactivity/
| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
signature |
body | string | да | Подпись запроса |
subscription |
body | integer | да | ID подписки в Prodamus |
customer_phone |
body | string | нет | Идентификатор клиента в формате +79999999999 |
customer_email |
body | string | нет | Идентификатор клиента по email |
profile |
body | integer | нет | ID профиля клиента |
tg_user_id |
body | integer | нет | ID клиента Telegram |
vk_user_id |
body | integer | нет | ID клиента ВКонтакте |
active_manager |
body | boolean | нет | 0 — отписан, 1 — подписан менеджером |
active_user |
body | boolean | нет | Для пользователя доступно только значение 0 |
Пример ответа:
success
Endpoint возвращает ссылку при do=link или сразу открывает форму при do=pay. Запрос также можно отправить методом POST с телом application/x-www-form-urlencoded или multipart/form-data.
Пример ответа при do=link:
| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
do |
query | string | да | link — вернуть ссылку; pay — перейти к оплате |
products |
query | array | нет | Корзина; без неё клиент заполняет товар на странице |
products[i].name |
query | string | да | Наименование переданной позиции |
products[i].price |
query | number | да | Цена за единицу переданной позиции |
products[i].quantity |
query | integer | да | Количество переданной позиции |
order_sum |
query | number | нет | Сумма заказа; при do=link без products становится ценой базового товара |
order_id |
query | string | нет | Номер заказа в вашей системе |
customer_phone |
query | string | нет | Телефон клиента |
customer_email |
query | string | нет | Email клиента |
sys |
query | string | нет | Код интеграции от поддержки; обязателен для интеграции сервиса |
urlNotification |
query | string | нет | URL webhook; учитывается вместе с sys |
urlReturn |
query | string | нет | URL возврата без оплаты |
urlSuccess |
query | string | нет | URL возврата после успешной оплаты |
subscription |
query | integer | нет | ID подписки; если он передан, products игнорируется |
demo_mode |
query | integer | нет | Значение 1 включает демо-режим для платежа |
callbackType |
query | string | нет | Значение json запрашивает webhook в JSON |
signature |
query | string | да | HMAC SHA-256 подпись запроса |
Пример запроса:
https://payform.ru/h9brIKu/
urlSuccess и клиентские редиректы не подтверждают поступление денег. Выдавай товар или доступ только после проверенного webhook с payment_status=success.signature; значения приводятся к строкам, ключи сортируются рекурсивно, JSON подписывается HMAC SHA-256 после экранирования /.application/x-www-form-urlencoded, а тестовый чек-лист ожидает multipart/form-data; для callbackType=json приходит application/json. Приёмник должен разбирать фактически выбранный формат до проверки Sign.attempt может увеличиваться. Обработчик должен быть идемпотентным и отвечать HTTP 200 только после успешной обработки.subscription корзина products игнорируется. После деактивации подписки от лица пользователя повторная активация невозможна; нужно оформить подписку заново./rest/payment/do/ — отдельный ключ от поддержки, привязанный к sys.{"success":true} от /rest/payment/do/ подтверждает только инициацию. Итог проверяется по webhook с payment_init=api.GET /rest/payment-methods/getList Timestamp может быть любой непустой строкой: сервер не проверяет формат или актуальность, срок запроса не ограничен и защиты от повторного воспроизведения нет.Content-Type объявляет charset=WINDOWS-1251; это отдельно отмечено в примерах C#.postMessage гарантированно доступны для карт РФ, СБП и Сбербанк-онлайн. Для других способов оплаты используй webhook.available_payment_methods отфильтровал все способы, параметр игнорируется и показывается полный список; если пустой результат дал available_payment_method_groups, форма показывает ошибку об отсутствии методов.Если этого недостаточно — официальная документация: https://help.prodamus.ru/payform/tekhnicheskaya-dokumentaciya Вся интеграция одним документом: https://mcp-everything.ru/integrations/prodamus.md