Оплата с мобильного телефона (DCB)
Сценарий Direct Carrier Billing состоит из трёх шагов:
- Создание контракта (
POST .../contracts) — привязка номера телефона. - Авторизация контракта (
POST .../contracts/{id}/authorize) — подтверждение PIN-кодом. - Создание счёта (
POST .../invoices) — списание средств в рамках активного контракта.
Контракт привязывает реквизиты, но не ведёт график списаний. Каждое списание инициирует мерчант отдельным CreateInvoice — тогда, когда нужно ему. Если график должна вести платформа, это другой продукт: Подписки.
Отсюда две границы контракта. Метода, возвращающего его статус, в протоколе нет — об истечении или закрытии партнёр узнаёт из уведомления contract. (Вебхуки), а закрыть контракт сам может отменой (§4.4). Возврат делается тоже не по контракту, а по конкретному счёту — Возврат средств.
4.1 Создание контракта
Инициирует привязку мобильного номера клиента для последующих платежей.
JSON API v3
POST /api/v3/projects/{projectId}/contracts
JSON API v3
{
"client_ip": "10.20.30.40",
"customer": {
"type": "mobile_phone",
"msisdn": "79600000000"
},
"merchant_contract_id": "1234567890"
}JSON API v3
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
client_ip | string (ip) | Условно | IP-адрес клиента. По умолчанию обязателен (настраивается в проекте) |
customer. | string | Да | Тип клиента: "mobile_phone" |
customer. | string (E.164) | Да | Номер телефона клиента |
merchant_contract_id | string (max 64) | Да | ID контракта в системе мерчанта. Контракт создаётся по ключу MSISDN + merchant_contract_id |
JSON API v3
{
"success": true,
"data": {
"contract_id": "16449203-0000-009b-a125-351b7bfbd207",
"authorization_type": "SMS_PIN",
"expires_at": "2025-03-29T20:00:08Z",
"merchant_contract_id": "1234567890",
"customer": {
"type": "mobile_phone",
"msisdn": "79600000000",
"country": "RU",
"network": { "id": 3, "name": "Beeline" },
"operator": { "id": 42, "name": "Beeline" }
}
}
}JSON API v3
| Поле | Тип | Описание |
|---|---|---|
contract_id | uuid | Уникальный ID контракта в системе платформы |
authorization_type | enum | Тип авторизации: SMS_PIN, EXTERNAL, SKIP |
expires_at | datetime | Срок действия контракта |
customer. | object | Сеть клиента (id, name) |
customer. | object | Оператор клиента (id, name) |
POST /contracts
curl
curl -X POST "$BASE/api/v3/projects/$PROJECT_ID/contracts" \
-H "Content-Type: application/json" \
-H "X-Login: $LOGIN" \
-H "X-Timestamp: $TS" \
-H "X-Signature-Version: 3" \
-H "X-Signature: $SIG" \
-d '{
"client_ip": "10.20.30.40",
"customer": { "type": "mobile_phone", "msisdn": "79600000000" },
"merchant_contract_id": "1234567890"
}'4.2 Авторизация контракта
Подтверждение контракта PIN-кодом, полученным клиентом по SMS.
JSON API v3
POST /api/v3/projects/{projectId}/contracts/{contractId}/authorize
JSON API v3
{
"client_ip": "10.20.30.40",
"pin_code": "987656"
}JSON API v3
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
client_ip | string | Условно | IP-адрес клиента |
pin_code | string (max 16) | Да | PIN-код из SMS |
JSON API v3
{
"success": true,
"data": {
"contract_id": "16449203-0000-009b-a125-351b7bfbd207",
"status": "active"
}
}После успешной авторизации контракт становится активным. Все платежи в рамках срока действия контракта проходят без повторной авторизации.
4.3 Создание счёта (DCB)
Инициирует списание средств с мобильного счёта клиента.
JSON API v3
POST /api/v3/projects/{projectId}/invoices
JSON API v3
{
"client_ip": "10.20.30.40",
"customer": {
"type": "mobile_phone",
"msisdn": "79600000000",
"email": "test@test.com"
},
"order": {
"merchant_order_id": "order_123",
"price": {
"amount": "25.00",
"currency": "RUB",
"vat_included": true
},
"description": "Premium subscription"
},
"contract": {
"create_if_not_exists": false,
"merchant_contract_id": "1234567890"
},
"application": { "name": "Game of Sultans" },
"product": { "name": "New Pack_1" }
}JSON API v3
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
client_ip | string | Условно | IP-адрес клиента |
customer. | string | Да | "mobile_phone" |
customer. | string | Да | Номер телефона клиента |
customer. | string | Нет | Email клиента |
order. | string (max 38) | Да | ID заказа в системе мерчанта |
order. | money | Нет | Цена для клиента. Если не указана — берётся из настроек проекта |
order. | string | Нет | Описание заказа |
contract. | boolean | Нет | Создать контракт автоматически, если его нет (по умолчанию false) |
contract. | string (max 64) | Нет | ID контракта мерчанта |
application. | string (max 256) | Нет | Название приложения |
product. | string (max 256) | Нет | Название товара / услуги |
JSON API v3
{
"success": true,
"data": {
"invoice_id": "1624505c-0031-00cf-7d54-4cf1ce08cb30",
"status": "Created",
"payment_status": "NOT_PAID",
"authorization": {
"type": "BY_CONTRACT",
"is_authorized": true
},
"price": {
"amount": "25.00",
"currency": "RUB",
"vat_included": true
},
"merchant_order_id": "order_123",
"created_at": "2025-03-29T20:00:10Z",
"expires_at": "2025-03-29T22:00:10Z",
"billing_channel": "CPA",
"customer": {
"type": "mobile_phone",
"msisdn": "79600000000",
"country": "RU",
"network": { "id": 3, "name": "Beeline" },
"operator": { "id": 42, "name": "Beeline" }
},
"contract": {
"contract_id": "16449203-0000-009b-a125-351b7bfbd207",
"authorization_type": "SMS_PIN",
"expires_at": "2025-03-29T20:00:08Z",
"merchant_contract_id": "1234567890"
}
}
}Допускается только один активный счёт на одного клиента в рамках проекта. При попытке создать второй счёт API вернёт 409 Conflict с кодом INVOICE_ALREADY_EXISTS и details. существующего счёта.
POST /invoices — DCB
curl
curl -X POST "$BASE/api/v3/projects/$PROJECT_ID/invoices" \
-H "Content-Type: application/json" \
-H "X-Login: $LOGIN" \
-H "X-Timestamp: $TS" \
-H "X-Signature-Version: 3" \
-H "X-Signature: $SIG" \
-d '{
"client_ip": "10.20.30.40",
"customer": { "type": "mobile_phone", "msisdn": "79600000000" },
"order": {
"merchant_order_id": "order_123",
"price": { "amount": "25.00", "currency": "RUB", "vat_included": true },
"description": "Premium subscription"
},
"contract": { "merchant_contract_id": "1234567890" }
}'4.4 Отмена контракта
JSON API v3
POST /api/v3/projects/{projectId}/contracts/{contractId}/cancel
JSON API v3
{
"client_ip": "10.20.30.40"
}JSON API v3
{
"success": true,
"data": {
"contract_id": "16449203-0000-009b-a125-351b7bfbd207",
"status": "cancelled"
}
}4.5 Проверка поддержки биллинга
Проверяет возможность активации и тарификации для конкретного MSISDN.
JSON API v3
POST /api/v3/projects/{projectId}/billing/check
JSON API v3
{
"msisdn": "79600000000"
}JSON API v3
{
"success": true,
"data": {
"supported": true,
"customer": {
"type": "mobile_phone",
"msisdn": "79600000000",
"country": "RU",
"network": { "id": 3, "name": "Beeline" },
"operator": { "id": 42, "name": "Beeline" }
}
}
}