Перейти к содержимому

Host-to-host

Host-to-host (H2H): ваша страница или приложение показывает плательщику, куда переводить, и плательщик не уходит от вас. Вы берёте на себя то, что делает страница оплаты: показ реквизитов, обратный отсчёт, исход.

Если вы знаете, как платит плательщик, укажите это в payment_method. Тогда реквизиты выдаются, и плательщика ни о чём не спрашивают:

examples/curl/payments/create-host-to-host.sh
#!/usr/bin/env bash
# Create a payment whose method and payer's bank you know: the account comes without the payment page.
set -euo pipefail
. "$(dirname "$0")/../signed-request.sh"
body=$(cat <<JSON
{
"merchant_order_id": "${ORDER_ID:-order-$(mka_new_key)}",
"amount": "${AMOUNT:-2500.00}",
"currency": "LKR",
"payment_method": {
"type": "bank_transfer",
"payer_institution": "${PAYER_BANK:-boc}"
}
}
JSON
)
mka_request POST "/v1/payments" "$body" "$(mka_new_key)"
  • type — метод. Сейчас это bank_transfer, перевод на счёт. Методы — это данные: новые могут появиться без новой версии API.
  • payer_institution — необязательно, банк плательщика: boc (Bank of Ceylon), peoples (People’s Bank), combank (Commercial Bank of Ceylon), hnb (Hatton National Bank), ndb (NDB Bank), sampath (Sampath Bank) или other. Это предпочтение: реквизиты в этом банке выдаются, пока они есть, а затем — в любом другом; тогда перевод идёт между банками через CEFTS.

Метод или банк, которого нет в каталоге, — это 422 method_unavailable.

Читайте платёж, пока он не станет requires_action с customer_action.kind: bank_transfer — обычно через несколько секунд после создания, — и покажите ровно то, что в нём:

"customer_action": {
"kind": "bank_transfer",
"bank_transfer": {
"bank_name": "Bank of Ceylon",
"account_name": "K. A. Perera",
"account_number": "0081234567"
}
},
"expires_at": "2026-10-22T18:49:01Z"
examples/curl/payments/get.sh
#!/usr/bin/env bash
# Read a payment: the truth after a webhook, a timeout or a 503.
set -euo pipefail
. "$(dirname "$0")/../signed-request.sh"
payment_id=$(mka_required PAYMENT_ID)
mka_request GET "/v1/payments/$payment_id"
  • Показывайте точную сумму: перевод на другую сумму не сопоставится с платежом.
  • Показывайте payment_reference, если он есть; плательщик вписывает его в назначение перевода.
  • Ведите обратный отсчёт до expires_at. После него скройте реквизиты: такой перевод зачисляет только поддержка.
  • Не кешируйте реквизиты. Каждый GET возвращает их заново и перестаёт возвращать, как только ими больше нельзя пользоваться.

Статусы и вебхуки те же, что у любого платежа (жизненный цикл). При succeeded сообщите плательщику; при failed с expired предложите попробовать снова новым платежом.

Без payment_method проект, который разрешает плательщикам выбирать, отвечает requires_action с customer_action.kind: method_selection: доступные методы и банки и selection_expires_at. Выбор делается на checkout_url — отправьте плательщика туда. Если за 30 минут ничего не выбрано, платёж завершается failed с expired. Незнакомый вам kind — тоже отправьте плательщика на checkout_url.