SPAY — Разовые списания
API
Создание транзакции
POST http://spay.dmapi.ru/transaction/
Content-Type: application/json. Время — ISO 8601.
Заголовки:
| Заголовок | Описание |
|---|---|
HMAC |
HMAC-SHA1 подпись тела запроса в UTF-8. Ключ — секретный ключ проекта (UUID сервиса) |
Тело запроса (JSON):
| Поле | Обяз. | Описание |
|---|---|---|
payer |
да | ID плательщика: телефон 7xxxxxxxxxx, токен карты и т.п. (1–32 символа) |
external_id |
нет | ID платежа на стороне ТСП (до 64 символов) |
service |
да | UUID сервиса |
pay_channel |
да | Платёжный канал (см. ниже) |
money |
да | Сумма в рублях, 2 знака после точки |
Значения pay_channel:
| Канал | Описание |
|---|---|
MTS_MK |
МТС мобильная коммерция |
TELE2_MK |
Tele2 мобильная коммерция |
BEELINE_MK |
Билайн мобильная коммерция |
MEGAFON_MK |
Мегафон мобильная коммерция |
QIWI |
QIWI |
MTS_WALLET |
МТС кошелёк |
WM |
WebMoney |
TELE2_MERCH |
Tele2 мерчант |
MEGAFON_PIN |
Мегафон PIN-подтверждение |
BEE_MK |
Билайн мобильная коммерция |
MTS_2 |
МТС Stream |
MTS_PIN |
МТС PIN-подтверждение |
SBP |
СБП |
YOTA |
Yota |
MTS3 |
МТС (схема MTS3) |
MTS_S |
МТС Stream |
MTS4 |
МТС (схема MTS4) |
Ответ:
{
"uid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"external_id": "your-id"
}
Пример (Python):
import hashlib, hmac, json, requests
url = 'http://spay.dmapi.ru/transaction/'
key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
service = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
request = dict(payer='79261234567', service=service, pay_channel='MTS_MK', money='10.00')
body = json.dumps(request)
digest = hmac.new(key.encode('utf8'), body.encode('utf8'), hashlib.sha1).hexdigest()
headers = {'Content-Type': 'application/json', 'HMAC': digest}
rq = requests.post(url, data=body, headers=headers)
print(rq.status_code, rq.content)
Подтверждение кодом (PIN-submit)
POST http://spay.dmapi.ru/transaction/{transaction_uid}/confirm/
transaction_uid — UUID из ответа создания транзакции.
Заголовки:
| Заголовок | Описание |
|---|---|
HMAC |
HMAC-SHA1 подпись тела запроса. Ключ — секретный ключ проекта |
Content-Type |
application/json |
Тело:
{ "code": "19600" }
Ответ:
{ "uid": "uuid-подтверждения" }
Throttling: повторная отправка кода чаще чем раз в 3 секунды вернёт ошибку 501.
Пример (Python):
import hashlib, hmac, json, requests
key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
transaction_uid = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
code = '19600'
url = f'http://spay.dmapi.ru/transaction/{transaction_uid}/confirm/'
body = json.dumps(dict(code=code))
digest = hmac.new(key.encode('utf8'), body.encode('utf8'), hashlib.sha1).hexdigest()
headers = {'Content-Type': 'application/json', 'HMAC': digest}
rq = requests.post(url, data=body, headers=headers)
print(rq.status_code, rq.content)
Проверка статуса платежа
GET http://spay.dmapi.ru/transactions/{transaction_uid}/{HMAC}
HMAC — HMAC-SHA1 подпись UID транзакции (не тела запроса). Ключ — секретный ключ проекта.
Ответ (200 OK):
| Поле | Описание |
|---|---|
uid |
UUID транзакции |
money_in |
Цена для абонента, руб. |
money_partner |
Деньги ТСП, руб. |
status |
OPEN | PAYED | CANCELED |
created_at |
Время создания (ISO 8601) |
closed_at |
Время фиксации статуса |
channel |
Платёжный канал |
service |
UUID сервиса |
external_id |
ID в ТСП |
Дополнительный endpoint:
GET http://spay.dmapi.ru/transactions_by_eid/{service_uid}/{external_id}/{HMAC}
HMAC вычисляется от external_id, а не от UID транзакции.
Пример (Python):
import hashlib, hmac, requests
key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
uid = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
digest = hmac.new(key.encode('utf8'), uid.encode('utf8'), hashlib.sha1).hexdigest()
url = f'http://spay.dmapi.ru/transactions/{uid}/{digest}'
rq = requests.get(url)
print(rq.status_code, rq.json())
Нотификации о статусах (ПП → ТСП)
POST на URL, настроенный для сервиса. Content-Type: application/json.
Заголовок HMAC — HMAC-SHA1 от JSON-тела.
payment_status
| Поле | Описание |
|---|---|
action |
payment_status |
uid |
UUID транзакции |
external_id |
ID в ТСП |
money_in |
Цена для абонента, руб. |
money_partner |
Деньги ТСП (если включена отправка) |
status |
OPEN | PAYED | CANCELED |
payer |
Плательщик |
closed_at |
Время фиксации статуса |
sended_at |
Время отправки нотификации |
channel |
Платёжный канал |
service |
ID сервиса |
comment |
Комментарий к статусу |
check |
MD5-подпись |
Пример — успешный платёж:
{
"action": "payment_status",
"uid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"external_id": "order-123",
"money_in": "10.00",
"money_partner": "8.50",
"status": "PAYED",
"payer": "79261234567",
"closed_at": "2026-09-15T10:00:05+00:00",
"sended_at": "2026-09-15T10:00:06+00:00",
"channel": "MTS_PIN",
"service": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"comment": "",
"check": "0123456789abcdef0123456789abcdef"
}
Ответ ТСП: HTTP 200 — подтверждение доставки.
payment_code_error
Отправляется при ошибке ввода подтверждающего кода:
| Поле | Описание |
|---|---|
action |
payment_code_error |
uid |
UUID транзакции |
external_id |
ID в ТСП |
sended_at |
Время отправки |
channel |
Платёжный канал |
service |
ID сервиса |
comment |
Описание ошибки |
Пример:
{
"action": "payment_code_error",
"uid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"external_id": "order-123",
"sended_at": "2026-09-15T10:00:06+00:00",
"channel": "MTS_PIN",
"service": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"comment": "wrong code"
}