ПРАВИЛА ИНТЕГРАЦИИ

Работа с Webhook

Webhook уведомления отправляются методом POST на notification_url.

Источник notification_url:

  • URL из запроса (/init, /withdrawal, /refund) имеет приоритет.
  • Если URL не передан в запросе, используется URL из настроек мерчанта.

Формат передачи:

  • В зависимости от настроек мерчанта используется application/json или application/x-www-form-urlencoded.

Рекомендации по обработке:

  • Всегда проверяйте signature.
  • Считайте delivery идемпотентным и дедуплицируйте события по webhook_id.
  • Возвращайте 2xx сразу после валидации подписи и постановки события в очередь.
  • Реальное финальное состояние операции при спорных кейсах подтверждайте через методы опроса статуса (/status, /withdrawal_request).

Webhook для Invoice

ПолеОписаниеПример
orderНомер заказа на стороне мерчантаdf78cf8f-db88-4344-8d03-cdbd2a7077cf
amountСумма invoice14.0000
statusСтатус invoicefailed
currencyВалюта invoiceEUR
signatureПодпись webhook0TUnDdSVPPX5OE28w3Kofc_PZV8jYWzgfUY47wdyF9M
timestampВремя успешной оплаты, приходит для complete/partial_complete2026-02-17T21:02:53+00:00
created_atВремя создания invoice2026-02-17 17:26:32.882207+00:00
invoice_idID invoice в системе019c6ca3-b0b1-03dd-0eaf-7d90862c7e2e
masked_panМаскированный PAN карты (может быть пустым)411111XXXXXX1111
product_idID endpoint/product019b6f11-bfb1-f170-1274-bcdaf8308b3d
webhook_idID webhook (одинаковый при повторах)019c6d83-9908-48ec-9e50-66916c2ae099
amount_paidФактически оплаченная сумма0.0000
custom_dataДополнительные данные``
customer_idID клиента019c473b-6d73-41a7-e336-1101913f2d83
merchant_idID мерчанта019b6f11-bf8a-34fd-284c-ff6f167ebc79
customer_feeКомиссия с покупателя0.0000
phone_numberТелефон плательщика (может быть пустым)351934595652
webhook_typeТип webhookinvoice
fee_from_merchantКомиссия с мерчанта0.0000
payment_status_updated_atВремя последнего обновления платежного статуса2026-02-17 21:31:06.864601+00:00
payment_error_codeКод ошибки, приходит только для неуспешного статуса (failed)provider_error
payment_errorТекст ошибки, приходит только для неуспешного статуса (failed)Something went wrong
first_nameИмя клиента, если было передано и включено в payloadDmitry
last_nameФамилия клиента, если была передана и включена в payloadRukhlenko

Пример тела callback (webhook) по успешному invoice:

json
{
  "order": "20242577181",
  "amount": "3000.0000",
  "status": "complete",
  "currency": "RUB",
  "signature": "7Whj7Of_q3viHVGWWVrh-rOhQk51OzTAuBYbl_jE1HY",
  "timestamp": "2026-02-17T21:02:53+00:00",
  "created_at": "2026-02-17 20:17:10.258751+00:00",
  "invoice_id": "019c6d3f-e672-43c3-606e-a9a76c4a9a0c",
  "masked_pan": "",
  "product_id": "019667a5-0b06-3197-fa34-4dbaa6ca82d3",
  "webhook_id": "019c6d69-c408-3b2b-ee2e-1a9cac2acb65",
  "amount_paid": "3000.0000",
  "custom_data": "",
  "customer_id": "019847cc-f5cc-09b6-a22a-2138669e1261",
  "merchant_id": "01966446-681e-5bf4-d7c2-04a7349bfac3",
  "customer_fee": "0.0000",
  "phone_number": "",
  "webhook_type": "invoice",
  "fee_from_merchant": "397.5000",
  "payment_status_updated_at": "2026-02-17 21:02:53.937092+00:00"
}

Пример webhook неуспешного invoice. Набор полей зависит от настроек webhook; здесь показаны поля суммы и времени, доступные в актуальных версиях webhook. Поля timestamp нет, поскольку платёж не завершился успешно.

json
{
  "webhook_type": "invoice",
  "webhook_id": "00000000-0000-4000-8000-000000000002",
  "invoice_id": "00000000-0000-4000-8000-000000000102",
  "product_id": "00000000-0000-4000-8000-000000000201",
  "merchant_id": "00000000-0000-4000-8000-000000000301",
  "order": "order-demo-002",
  "amount": "100.0000",
  "amount_paid": "0.0000",
  "currency": "EUR",
  "status": "failed",
  "customer_fee": "0.0000",
  "fee_from_merchant": "0.0000",
  "masked_pan": "",
  "customer_id": "",
  "phone_number": "",
  "custom_data": "",
  "created_at": "2026-01-01 12:00:00.000000+00:00",
  "payment_status_updated_at": "2026-01-01 12:00:30.000000+00:00",
  "payment_error_code": "COMMON_ERROR",
  "payment_error": "Payment failed. Contact support",
  "signature": "{{webhook_signature}}"
}

Webhook для Withdrawal

ПолеОписаниеПример
webhook_typeТип webhookwithdrawal
withdrawal_request_idID выплаты в системе9a7ef4da-34ab-40f2-bf20-cf05cb9dbef8
product_id/endpoint_idID endpoint/productb3f47861-1510-4fe9-b7db-1b8a5511f6f6
merchant_idID мерчантаbb8ca755-f9ec-4990-b21b-c56d28277887
orderВаш ID выплатыwdr-00001
requested_amountЗапрошенная сумма100.0000
amountФактическая сумма выплаты100.0000
fee_from_merchantКомиссия мерчанта1.0000
currencyВалютаEUR
statusСтатус выплатыdone / rejected
masked_panМаскированная карта получателя411111XXXXXX1111
customer_idИдентификатор клиента9ad3c1a7-16cf-43bb-8a87-dab72bc9dc09
custom_dataДополнительные данные{...}
payment_error_codeКод ошибкиCOMMON_ERROR
payment_errorТекст ошибкиInsufficient funds
webhook_idID webhook (стабилен при ретраях)ac2c8cf6-6c1f-4499-b2da-c50152c6936a
signatureПодпись webhook0juDyl...

Пример тела callback (webhook):

json
{
  "webhook_type": "withdrawal",
  "withdrawal_request_id": "9a7ef4da-34ab-40f2-bf20-cf05cb9dbef8",
  "product_id": "b3f47861-1510-4fe9-b7db-1b8a5511f6f6",
  "merchant_id": "bb8ca755-f9ec-4990-b21b-c56d28277887",
  "order": "wdr-00001",
  "requested_amount": "100.0000",
  "amount": "100.0000",
  "fee_from_merchant": "1.0000",
  "currency": "EUR",
  "status": "done",
  "masked_pan": "411111XXXXXX1111",
  "customer_id": "9ad3c1a7-16cf-43bb-8a87-dab72bc9dc09",
  "custom_data": "",
  "webhook_id": "ac2c8cf6-6c1f-4499-b2da-c50152c6936a",
  "signature": "0juDylapbc0NtVGCobWHwTm3F_lMqUC8g0ivl3lH5O0"
}

Пример webhook отклонённой выплаты:

json
{
  "webhook_type": "withdrawal",
  "webhook_id": "00000000-0000-4000-8000-000000000004",
  "withdrawal_request_id": "00000000-0000-4000-8000-000000000402",
  "product_id": "00000000-0000-4000-8000-000000000201",
  "merchant_id": "00000000-0000-4000-8000-000000000301",
  "order": "withdrawal-demo-002",
  "requested_amount": "100.0000",
  "amount": "0.0000",
  "fee_from_merchant": "0.0000",
  "currency": "EUR",
  "status": "rejected",
  "masked_pan": "",
  "customer_id": "",
  "custom_data": "",
  "payment_error_code": "COMMON_ERROR",
  "payment_error": "Payment failed. Contact support",
  "signature": "{{webhook_signature}}"
}

requested_amount содержит запрошенную сумму выплаты, а amount — фактическую. Для отклонённой выплаты причина передаётся в payment_error_code и payment_error. Суммы в примере демонстрационные; обрабатывайте значения, полученные в webhook.

Webhook для Refund

ПолеОписаниеПример
webhook_typeТип webhookrefund
refund_idID возврата8f30f6ef-d6b8-4200-9f54-8a0c1808f5d8
invoice_idID исходного платежаd51817bd-efd6-4a76-a73a-81b2832cb432
product_idID endpoint/productb3f47861-1510-4fe9-b7db-1b8a5511f6f6
merchant_idID мерчантаbb8ca755-f9ec-4990-b21b-c56d28277887
orderВаш внешний IDorder-0001
amountСумма возврата10.0000
fee_from_merchantКомиссия мерчанта0.1000
currencyВалютаEUR
masked_panМаскированная карта411111XXXXXX1111
statusСтатус возвратаnew / pending / complete / failed
webhook_idID webhook (стабилен при ретраях)c38b45c9-f4df-4d01-9c88-66a94d6dce7f
signatureПодпись webhooki7iU9E...

Пример тела callback (webhook):

json
{
  "webhook_type": "refund",
  "refund_id": "8f30f6ef-d6b8-4200-9f54-8a0c1808f5d8",
  "invoice_id": "d51817bd-efd6-4a76-a73a-81b2832cb432",
  "product_id": "b3f47861-1510-4fe9-b7db-1b8a5511f6f6",
  "merchant_id": "bb8ca755-f9ec-4990-b21b-c56d28277887",
  "order": "order-0001",
  "amount": "10.0000",
  "fee_from_merchant": "0.1000",
  "currency": "EUR",
  "masked_pan": "411111XXXXXX1111",
  "status": "complete",
  "webhook_id": "c38b45c9-f4df-4d01-9c88-66a94d6dce7f",
  "signature": "i7iU9E5cQ2Nwm0e8aA4R2QMj6rYyceK1K8y46oR4h4g"
}

Криптовалютные webhook

Криптовалютные пополнения используют webhook платежей, выплаты — webhook выплат. Уведомления отправляются, если включены для вашей интеграции. Набор общих полей зависит от настроек и версии webhook. При проверке подписи учитывайте все полученные поля, включая crypto_*.

В уведомлениях могут присутствовать дополнительные поля; их значения — строки:

ПолеЗначение
crypto_assetИдентификатор актива и сети, например USDT_TRC20
crypto_amountСумма перевода в блокчейне; сохраняйте точность десятичного числа
crypto_tx_hashХеш транзакции блокчейна
crypto_from_addressАдрес отправителя
crypto_to_addressАдрес назначения
crypto_tagTag или memo адреса назначения; может быть пустым, если не используется
crypto_wallet_idID кошелька для пополнений; только для webhook пополнения
crypto_wallet_addressВыданный адрес для пополнений; только для webhook пополнения

Пример уведомления о криптовалютном пополнении:

json
{
  "webhook_type": "invoice",
  "webhook_id": "b834ad91-d6d2-48a7-b1a0-2f7d7f3f3b1f",
  "merchant_id": "16ec5bed-30a5-470c-9b41-c74ead9d4855",
  "product_id": "e82b948f-5416-4560-bcd2-bbec03247dd5",
  "invoice_id": "5f6bce4e-d6f4-4381-a0cb-4810e39d9739",
  "order": "2d1c2e44-cbc2-4478-8b1a-ff354ecad4fc",
  "status": "complete",
  "amount": "100.000000000000000000",
  "currency": "USDT",
  "customer_id": "d4e816c8-eed4-4cff-a628-671c71594714",
  "customer_fee": "0.0000",
  "fee_from_merchant": "0.0000",
  "masked_pan": "",
  "phone_number": "",
  "custom_data": "",
  "timestamp": "2026-09-14T10:00:00+00:00",
  "crypto_asset": "USDT_TRC20",
  "crypto_amount": "100.000000000000000000",
  "crypto_tx_hash": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
  "crypto_from_address": "TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8",
  "crypto_to_address": "TXLAQ63Xg1NAzckPwKHvzw7CSEmLMEqcdj",
  "crypto_tag": "",
  "crypto_wallet_id": "58184561-a14b-4e42-8e37-6f47b8f7a754",
  "crypto_wallet_address": "TXLAQ63Xg1NAzckPwKHvzw7CSEmLMEqcdj",
  "signature": "{{callback_signature}}"
}

Пример уведомления о завершённой криптовалютной выплате:

json
{
  "webhook_type": "withdrawal",
  "webhook_id": "2c3b4d5e-6f70-4812-9234-56789abcdef0",
  "merchant_id": "16ec5bed-30a5-470c-9b41-c74ead9d4855",
  "product_id": "e82b948f-5416-4560-bcd2-bbec03247dd5",
  "withdrawal_request_id": "9a7ef4da-34ab-40f2-bf20-cf05cb9dbef8",
  "order": "crypto-wdr-001",
  "status": "done",
  "requested_amount": "0.0001",
  "amount": "0.0001",
  "currency": "TRX",
  "fee_from_merchant": "0.0000",
  "masked_pan": "",
  "customer_id": "d4e816c8-eed4-4cff-a628-671c71594714",
  "custom_data": "",
  "crypto_asset": "TRX",
  "crypto_amount": "0.0001",
  "crypto_tx_hash": "fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210",
  "crypto_from_address": "TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8",
  "crypto_to_address": "TXLAQ63Xg1NAzckPwKHvzw7CSEmLMEqcdj",
  "crypto_tag": "",
  "signature": "{{callback_signature}}"
}

Шесть полей перевода также могут присутствовать в ответе проверки статуса криптовалютной выплаты. Их отсутствие не меняет статус операции: сведения о транзакции блокчейна могут появиться позже. Поля ID и адреса кошелька относятся только к пополнениям.