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

Отмена платежа

Отменяйте платёж, когда заказа больше нет — плательщик ушёл, корзина изменилась, — а оплаты ещё не было.

examples/curl/payments/cancel.sh
#!/usr/bin/env bash
# Cancel a payment nobody paid yet. The body is empty and signed as such.
set -euo pipefail
. "$(dirname "$0")/../signed-request.sh"
payment_id=$(mka_required PAYMENT_ID)
mka_request POST "/v1/payments/$payment_id/cancel" "" "$(mka_new_key)"

Тело пустое и подписывается как пустое. Ответ — 202 Accepted, а не «отменён»: реквизиты могут быть уже открыты в банковском приложении плательщика. В платеже появляется cancellation {id, status}:

cancellation.status Значение
requested, processing Провайдер отзывает реквизиты. Платёж в статусе processing.
succeeded Отменён. Платёж в статусе cancelled, и об этом приходит вебхук.
rejected Поздно: деньги пришли раньше. Платёж идёт дальше к succeeded; если нужно, сделайте возврат.

Чтобы узнать исход, прочитайте платёж или дождитесь его вебхука.

Ответ Причина Что делать
409 payment_busy + Retry-After: 1 Реквизиты назначаются прямо сейчас. Повторите через секунду с тем же Idempotency-Key.
409 payment_not_cancellable Оплачен, завершён или на проверке. Прочитайте платёж. Оплаченный верните возвратом.
404 payment_not_found Это не ваш платёж. Проверьте id.

Повтор с тем же ключом возвращает текущее состояние отмены и никогда не создаёт вторую отмену.

Пока плательщик не заплатил и окно открыто, измените сумму на тех же реквизитах, а не отменяйте платёж и не создавайте новый:

examples/curl/payments/correct-amount.sh
#!/usr/bin/env bash
# Change the amount the payer is to transfer while the window is open.
set -euo pipefail
. "$(dirname "$0")/../signed-request.sh"
payment_id=$(mka_required PAYMENT_ID)
body=$(cat <<JSON
{
"amount": "${AMOUNT:-2600.00}",
"currency": "LKR",
"payment_version": $(mka_required PAYMENT_VERSION)
}
JSON
)
mka_request POST "/v1/payments/$payment_id/amount-correction" "$body" "$(mka_new_key)"

Отправьте payment_version, который вы видели. Ответ — 202 с correction {id, status}; когда исправление применено, платёж переходит на следующую версию с новой суммой. Устаревшая версия — это 409 payment_version_conflict, платёж, который больше не ждёт денег, — 409 payment_not_correctable, та же сумма — 409 amount_unchanged.