Перейти к содержанию

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"
}