Руководство разработчика · API v1

Принимайте оплату картами с помощью платёжных ссылок GetPay

Создайте платёжную ссылку на своём сервере, отправьте по ней покупателя и получите уведомление об оплате. GetPay размещает платёжную страницу, взаимодействует с банком и сообщает вам о каждом результате.

Этот адрес используется во всех примерах на странице. Вставьте свой из личного кабинета GetPay (раздел Домен): у каждого магазина свой адрес на своём домене.

01Как это работает

Платёжная ссылка — это размещённая у GetPay платёжная страница для одного заказа. Ваш сервер создаёт её с данными заказа, а всё остальное берёт на себя GetPay.

  1. Ваш серверСоздаёт платёжную ссылку с товарами, суммой и номером вашего заказа. GetPay возвращает url.
  2. Ваш сайтПеренаправляет покупателя на этот url.
  3. ПокупательПроверяет заказ, вводит свои данные и оплачивает картой на защищённой странице банка. Если карта отклонена, можно повторить попытку по той же ссылке.
  4. GetPayПроверяет результат в банке, отправляет покупателя на ваш success_url и присылает вебхук payment_link.completed на ваш сервер.
  5. Ваш серверПодтверждает оплату и выполняет заказ.
sequenceDiagram
    participant S as Ваш сервер
    participant C as Покупатель
    participant G as GetPay
    participant B as Банк (vPOS)
    S->>G: POST /payment-links
    G-->>S: { id, url }
    S->>C: Редирект на url
    C->>G: Открывает страницу оплаты, нажимает «Оплатить»
    G->>B: Регистрация платежа
    C->>B: Ввод карты, 3-D Secure
    B->>G: Результат
    G->>C: Редирект на success_url
    G->>S: Вебхук payment_link.completed
    S->>G: GET /payment-links/{id} (подтверждение)
      

02Перед началом

Ваш домен и базовый URL

API работает на вашем собственном домене, а не на getpay.am. В личном кабинете GetPay откройте раздел Домен, укажите свой домен (например, shopx.am) и добавьте четыре показанные DNS-записи — все они указывают на IP-адрес GetPay:

ТипИмяНазначение
AapiБазовый URL вашего API: https://api.shopx.am/api/v1
AmerchantВаш личный кабинет
AcheckoutПлатёжные страницы для ваших покупателей
AreceiptСтраницы квитанций

Затем нажмите Проверить подключение. Когда все записи найдены, в кабинете появится базовый URL вашего API. Запросы на любой другой адрес, включая api.getpay.am, отклоняются с кодом 403.

API-ключи

Ключи находятся в личном кабинете GetPay в разделе Главная → API-ключи. Их два, по одному на каждую среду:

КлючДля чего
sk_sandbox_…Разработка и тестирование. Платежи завершаются на тестовой странице GetPay; обращения к банку нет, деньги не списываются.
sk_live_…Реальные платежи. Работает после того, как ваш аккаунт мерчанта переведён в режим live и подключён банк.

Передавайте ключ в заголовке Authorization каждого запроса:

Храните секретные ключи на сервере.Никогда не размещайте их в браузере, мобильном приложении или публичном репозитории. Храните их в переменной окружения, например GETPAY_SECRET_KEY.

Соглашения

  • Суммы указываются в минимальных единицах. 150000 означает 1 500,00 AMD. Всегда передавайте целые числа.
  • Валюта: валюты, включённые GetPay, — GET /meta/currencies (пока AMD). Для остальных возвращается CURRENCY_NOT_SUPPORTED.
  • Запросы и ответы — в формате JSON. Передавайте Content-Type: application/json.
  • Время указывается в UTC в формате ISO 8601, например 2026-09-30T10:15:00Z.
  • Идентификаторы — это UUID. Сохраняйте id платёжной ссылки рядом со своим заказом.

03Создание платёжной ссылки

POST/payment-links

Вызывайте этот метод со своего сервера, когда покупатель готов платить. Передайте, что он покупает, кто он (если знаете) и куда направить его после оплаты.

Параметры

Передайте либо line_items, либо amount, но не оба сразу. Всё остальное необязательно.

ПолеОбязательноОписание
line_items[]Одно из двухТовары, за которые платит покупатель, до 100 позиций. Итоговая сумма рассчитывается по ним.
line_items[].nameДаНазвание товара на платёжной странице. До 255 символов.
line_items[].unit_amountДаЦена за единицу в минимальных единицах.
line_items[].quantityНетОт 1 до 10 000. По умолчанию 1.
line_items[].descriptionНетКороткий текст под названием. До 1 000 символов.
line_items[].image_urlНетПубличный http(s)-адрес изображения, которое показывается рядом с товаром.
line_items[].product_idНетВаш SKU или идентификатор товара.
line_items[].metadataНетСтроковые пары «ключ — значение» для ваших нужд.
line_items[].ehdmНетДанные фискального чека. Обязательны, пока ЭККА включена, см. Фискальные чеки.
amountОдно из двухФиксированная сумма в минимальных единицах, если вы не передаёте товары. Требует title или description.
currencyНетAMD (по умолчанию) или другая валюта, включённая GetPay (см. GET /meta/currencies).
titleНетЗаголовок на платёжной странице, например «Заказ №1001».
descriptionНетБолее длинный текст на странице. До 2 000 символов.
merchant_referenceНетНомер вашего заказа. Возвращается в ссылке, её платежах и каждом вебхуке; по нему можно искать.
languageНетЯзык страницы: hy (по умолчанию), en или ru. Покупатель может его переключить.
customer.emailНетПодставляется на платёжной странице.
customer.nameНетПодставляется на платёжной странице.
customer.phoneНетПодставляется на платёжной странице.
customer.external_idНетВаш идентификатор покупателя. Покупателю никогда не показывается.
customer.addressНетline1, line2, city, region, postal_code, country (двухбуквенный код, например AM).
customer_fieldsНетКакие данные запрашивает страница. Для каждого из полей email, name, phone, address: required, optional или hidden. По умолчанию: email обязателен, имя и телефон необязательны, адрес скрыт.
success_urlНетКуда покупатель попадает после оплаты. GetPay добавляет к адресу payment_link_id, payment_id, receipt_number и receipt_url (см. Квитанции).
cancel_urlНетСсылка «Вернуться в магазин» на платёжной странице.
payment_methodsНетОграничивает доступные способы оплаты, например ["ameriabank"]. По умолчанию: все, которые у вас включены.
expires_in_minutesНетОт 30 до 43 200 (30 дней). По умолчанию 1 440 (24 часа).
metadataНетДо 50 ключей. Ключи до 40 символов, значения до 500. Возвращается в ссылке, её платежах и вебхуках.
ehdmНетНастройки фискального чека: skip, skip_reason, item. См. Фискальные чеки.

Ответ

201 Created с платёжной ссылкой. Сохраните id вместе с заказом и направьте покупателя на url.

Если запрос завершился по тайм-ауту,вы можете не знать, была ли создана ссылка. Прежде чем создавать новую, найдите её по номеру заказа: GET /payment-links?merchant_reference=order-1001.

04Переход покупателя на платёжную страницу

Перенаправьте браузер покупателя на url из ответа. На странице показаны название вашей компании, товары и итоговая сумма; она запрашивает выбранные вами поля и предлагает оплату картой. Покупатель может переключаться между армянским, английским и русским языками.

Что происходит дальше

РезультатКуда попадает покупатель
оплаченоВаш success_url с добавленными ?payment_link_id=…&payment_id=…&receipt_number=…&receipt_url=…. Если success_url не задан — страница подтверждения GetPay со ссылкой на квитанцию.
отклоненоОбратно на платёжную страницу с указанием причины (например, «Недостаточно средств на карте»). Можно повторить попытку или использовать другую карту, пока ссылка не истекла.
нажал «назад»Ваш cancel_url. Ссылка остаётся открытой, так что к ней можно вернуться.
Редирект не является подтверждением оплаты.Кто угодно может открыть вашу страницу успеха с любыми параметрами. Всегда подтверждайте оплату на сервере, прежде чем выполнять заказ.

05Подтверждение оплаты

Используйте любой из способов или оба. Вебхуки надёжнее: они приходят, даже если покупатель закрыл браузер, не дойдя до вашей страницы успеха.

  • Вебхук: обработайте payment_link.completed (см. Вебхуки).
  • API: когда покупатель попадает на ваш success_url, запросите ссылку.
GET/payment-links/{id}

Выполняйте заказ, только если status равен complete, payment_status равен paid, а amount_total и currency совпадают с вашим заказом. Этот вызов также повторно проверяет в банке платёж, ожидающий подтверждения.

Статусы платёжной ссылки

statusЗначение
openОжидает оплаты. После отклонённых попыток ссылка остаётся открытой.
completeОплачена. payment_status равен paid, а в payment находится успешный платёж.
expiredВремя expires_at наступило до оплаты.
canceledВы закрыли её через POST /payment-links/{id}/expire.

Статусы платежа

Каждая попытка оплаты — это платёж. Он возвращается в поле payment ссылки и через API платежей.

statusЗначение
pendingПокупатель оплачивает, либо банк ещё не подтвердил платёж.
succeededДеньги списаны с карты.
failedОтклонён. Причина указана в failure_reason. Покупатель может повторить попытку.
refundedВозвращён полностью.
partially_refundedВозвращена часть суммы. См. amount_refunded.
reversedВы отменили весь платёж в банке в течение 72 часов. См. reversed_at.
canceledПрерван, например ссылка была отменена во время оплаты.

06Вебхуки

Когда что-то происходит, GetPay отправляет HTTPS-запрос POST на ваш сервер, поэтому опрашивать API не нужно. Каждый запрос подписан секретом, который известен только вам и GetPay.

Настройка эндпоинта

  • В личном кабинете откройте раздел Вебхуки, выберите Sandbox или Live и добавьте свой URL, например https://your-site.am/webhooks/getpay.
  • Выберите все события или только нужные.
  • Скопируйте секрет подписи (whsec_…) и сохраните его на сервере как GETPAY_WEBHOOK_SECRET. Он отличается от вашего API-ключа.
  • Нажмите Отправить тест, чтобы проверить эндпоинт. В личном кабинете видна каждая доставка вместе с ответом вашего сервера.

Live-эндпоинты должны использовать https://. Sandbox-эндпоинты могут использовать http://. GetPay не может обратиться к localhost; чтобы получать события на своём компьютере во время разработки, используйте туннель, например ngrok http 8001, и зарегистрируйте выданный им публичный URL.

События

СобытиеКогдаdata.object
payment_link.completedСсылка оплачена. Выполняйте заказ по этому событию.платёжная ссылка
payment.succeededПлатёж картой одобрен.платёж
payment.failedПопытка оплаты отклонена. Покупатель ещё может повторить попытку и оплатить.платёж
payment.refundedПлатёж возвращён полностью или частично.платёж
payment.reversedПлатёж полностью отменён в банке.платёж
receipt.createdПлатёж оплачен, и выпущена квитанция. Отправьте url покупателю.квитанция
receipt.updatedКвитанция изменилась после возврата или отмены.квитанция
payment_link.canceledВы закрыли ссылку через API.платёжная ссылка
webhook.testВы нажали «Отправить тест» в личном кабинете.тестовое сообщение

Формат запроса

ЗаголовокЗначение
GetPay-Signaturet=1790755839,v1=5f2b…: время отправки и подпись HMAC-SHA256.
GetPay-Event-IdУникальный идентификатор события. Используйте его, чтобы игнорировать дубликаты.
GetPay-Event-TypeНапример, payment_link.completed.
Content-Typeapplication/json

data.object имеет точно такую же структуру, как ответ API для этого объекта.

Проверка подписи

Подпись — это HMAC-SHA256(secret, t + "." + raw_body) в hex. Вычисляйте её по исходному телу запроса (повторно закодированный JSON не совпадёт), сравнивайте за постоянное время и отклоняйте запросы старше 5 минут.

Ответ и повторные попытки

  • Верните любой код 2xx в течение 10 секунд. Медленную работу (письма, обновление остатков, синхронизацию с ERP) выполняйте в фоновой задаче после ответа.
  • В любом другом случае доставка повторяется через 1 минуту, 5 минут, 30 минут, 2 часа, 6 часов, 12 часов и 24 часа. После этого доставка помечается как неуспешная, и её можно отправить повторно из личного кабинета.
  • Будьте готовы к дубликатам. Одно и то же событие может прийти несколько раз. Сохраняйте обработанные значения GetPay-Event-Id и пропускайте повторы.
  • Не полагайтесь на порядок. События могут приходить не по порядку. Используйте статус внутри data.object или запрашивайте актуальное состояние через API.
  • Перепроверьте, если сомневаетесь. Запросите событие через GET /events/{id} со своим секретным ключом.

07Тестирование в sandbox

С ключом sk_sandbox_… всё работает так же, как в live, но кнопка Оплатить открывает тестовую страницу GetPay вместо банка. Вы сами выбираете, чем закончится платёж. Вебхуки, редиректы, сообщения об отказе и возвраты ведут себя точно так же, как в режиме live. Банковские учётные данные не нужны.

Кнопка на тестовой страницеРезультатКод банка
Успешная оплатаsucceeded с тестовой картой 424242******424200
Недостаточно средствfailed0116
Срок действия карты истёкfailed0101
Отклонено эмитентом картыfailed0100
Ошибка 3-D Securefailed0-2006
Оставить в обработкеpending: банк ещё не подтвердил платёж; завершите его позже на тестовой странице—

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

08Возвраты и отмены

Вернуть деньги можно двумя способами. В обоих случаях они возвращаются на карту покупателя через банк.

ДействиеСуммаКогдаРезультат
ОтменаВсегда весь платёжВ течение 72 часов с начала платежа и только если по нему ещё не было возвратовreversed
Полный возвратВсё, что ещё не возвращеноВ любое время после успешного платежаrefunded
Частичный возвратЛюбая сумма в пределах остатка; можно повторятьВ любое время после успешного платежаpartially_refunded, затем refunded, когда остаток равен нулю

Каждый платёж сам сообщает, что с ним можно сделать прямо сейчас, поэтому вам не нужно отслеживать правила самостоятельно:

ПолеЗначение
can_reversetrue, пока отмена возможна.
reversible_untilКрайний срок отмены: 72 часа с начала платежа. Показывайте его своим сотрудникам.
can_refundtrue, пока ещё есть что возвращать.
amount_refundableМаксимальная сумма, которую ещё можно вернуть, в минимальных единицах.
amount_refundedСколько уже возвращено.
reversed_atКогда платёж был отменён.

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

POST/payments/{id}/reverse

Отменяет весь платёж в банке. Используйте, когда заказ отменён вскоре после оплаты. По истечении 72 часов или после любого возврата запрос вернёт 409, и вместо отмены нужно будет сделать возврат. Затем отправляется вебхук payment.reversed.

Возврат платежа

POST/payments/{id}/refund

Для частичного возврата на сумму до amount_refundable передайте {"amount": 500000}. Чтобы вернуть весь остаток, передайте пустое тело или {}. Частичных возвратов может быть несколько. После каждого отправляется вебхук payment.refunded.

Оба запроса возвращают обновлённый платёж. Идентификатор платежа находится в поле payment.id ссылки и в параметре payment_id, добавленном к вашему success URL.

09Квитанции

Каждый оплаченный платёж получает квитанцию, как в Stripe: короткий номер, который покупатель может назвать (например, 4821-0937), и страницу квитанции на стороне GetPay на вашем домене по адресу https://receipt.your-domain.am/…. На странице видны данные вашей компании, товары, использованная карта, возвраты и кнопка сохранения в PDF. Страница доступна на армянском, английском и русском.

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

Где вы получаете ссылку на квитанцию

КаналЧто вы получаете
Success URLК вашему success_url добавляются receipt_number и receipt_url, рядом с payment_link_id и payment_id. Используйте их, чтобы показать ссылку «Посмотреть квитанцию» на странице благодарности.
Вебхукиreceipt.created в момент оплаты и receipt.updated после каждого возврата или отмены. data.object — полная квитанция. Во всех событиях payment.* и payment_link.* платёж тоже содержит receipt_number и receipt_url.
APIreceipt_number и receipt_url в каждом платеже (GET /payments/{id} и поле payment ссылки), а полная квитанция — в GET /payments/{id}/receipt.
Показывайте ссылку на квитанцию, но не доверяйте ей.Как и любые параметры редиректа, их может изменить кто угодно. Подтвердите платёж на своём сервере (см. Подтверждение оплаты) перед выполнением заказа. Для писем и личного кабинета берите receipt_url из вебхука или API.

Объект квитанции

ПолеЗначение
numberНомер квитанции, который видит покупатель. Уникален в рамках вашего аккаунта.
urlПубличная страница квитанции. То же значение, что receipt_url у платежа.
statusСтатус платежа: succeeded, partially_refunded, refunded или reversed.
amountОплаченная сумма в минимальных единицах.
amount_refundedВозвращено на данный момент. Каждый возврат с датой указан в refunds[].
amount_netИтоговая сумма, которую заплатил покупатель: amount − amount_refunded, или 0 после отмены.
line_items[]Товары из платёжной ссылки.
merchantНазвание компании, юридическое название, ИНН (ՀՎՀՀ), адрес и контакты поддержки из профиля в личном кабинете.
customerEmail, имя и телефон, которые ввёл покупатель.
payment_methodБанк, маскированный номер карты, имя держателя, код авторизации и RRN.
paid_at, issued_atКогда был совершён платёж и когда выпущена квитанция.
Не публикуйте ссылки на квитанции.Любой, у кого есть ссылка, может открыть квитанцию, а угадать ссылку невозможно. Передавайте её только покупателю. Квитанции sandbox открываются на той же странице с пометкой «Тестовый режим».

10Фискальные чеки (ЭККА)

Если ваш бизнес обязан выдавать кассовые чеки, GetPay может регистрировать каждый успешный платёж в Комитете госдоходов через электронную кассу PayX (Է-ՀԴՄ, ehdm.am). Нужен ваш собственный договор с PayX. Подключите выданный ими API-логин в личном кабинете в разделе Настройки → ЭККА.

Пока ЭККА включена, каждая платёжная ссылка должна указывать, что продаётся: код классификатора, название на армянском и единицу измерения. После успешной оплаты GetPay автоматически выдаёт фискальный чек, а после отмены или полного возврата — чек возврата.

Проверьте, включена ли ЭККА

GET/ehdm

enabled: true означает, что ваши платёжные ссылки должны содержать фискальные данные (или пропускать их). dep — налоговый отдел, выбранный в настройках ЭККА; он используется для товаров без dep.

Фискальные данные в платёжной ссылке

ПолеОбязательноОписание
line_items[].ehdm.adg_codeДа*Код классификатора: ԱԴԳՏ для услуг (напр. 85.59 — курсы) или ԱՏԳ ԱԱ (ТН ВЭД) для товаров (напр. 5401). Поиск: GET /ehdm/adg-codes?q=….
line_items[].ehdm.good_nameДа*Название на армянском, как в чеке, до 50 символов. По умолчанию — line_items[].name, если помещается.
line_items[].ehdm.unitДа*Одно из: հատ, կգ, գրամ, լիտր, մետր, ք/մ, խ/մ, մլ, այլ — шт., кг, грамм, литр, метр, м², м³, мл, другое. Печатается в чеке как отправлено.
line_items[].ehdm.good_codeДа*Внутренний код — ваш код товара или штрихкод (до 50 символов), печатается в чеке как Ն/Կ.
line_items[].ehdm.depНетНалоговый отдел: 1 НДС, 2 без НДС, 3 налог с оборота, 7 микропредприятие. По умолчанию — налоговый отдел из настроек ЭККА.
ehdm.itemНетТе же поля для ссылки с amount без товаров. good_name по умолчанию — title.
ehdm.skipНетtrue создаёт ссылку без фискального чека, например если чек выдаётся в другом месте. ehdm.skip_reason — необязательная заметка.
* Обязательно, только пока ЭККА включена. Если чего-то не хватает, ссылка не создаётся и возвращается EHDM_FIELDS_REQUIRED со списком недостающих полей.

После оплаты

Чек регистрируется в фоне, обычно за несколько секунд. Страница квитанции покупателя (receipt_url) показывает его как кассовый чек — с фискальным номером, QR-кодом и ссылкой на PDF от PayX. Вы получаете его в трёх местах:

КаналЧто вы получаете
APIfiscal_receipt в каждом платеже и GET /payments/{id}/fiscal-receipt.
Вебхукиreceipt.updated, когда фискальный чек выдан и когда по нему оформлен возврат. Он находится в data.object.fiscal.
Личный кабинетВ деталях транзакции видны фискальный чек, его статус и кнопка Повторить.

Статусы фискального чека

СтатусЗначение
pendingОжидает регистрации (или повторяется).
issuedЗарегистрирован в налоговом органе.
failedНе удалось зарегистрировать после всех попыток. Повторите из кабинета или через API.
reverse_pendingОформляется чек возврата после отмены или полного возврата.
reversedЧек возврата выдан.
reverse_failedНе удалось выдать чек возврата. Повторите.
canceledПлатёж вернули до регистрации чека, поэтому ничего не зарегистрировано.
Платёж никогда не ждёт чека.Если PayX недоступен, GetPay повторяет попытки около 10 часов, затем ставит failed; повторите через POST /payments/{id}/fiscal-receipt/retry. Частичный возврат нельзя автоматически оформить по товарам: needs_manual_return становится true, и чек возврата вы оформляете в PayX.
Чеки в sandbox имитируются.У них livemode: false, и они никогда не попадают в PayX или налоговый орган, поэтому можно протестировать весь процесс, включая ошибки валидации.

11Справочник API

Все эндпоинты используют ваш секретный ключ. Sandbox-ключ видит только данные sandbox, а live-ключ — только данные live.

ЭндпоинтОписание
POST /payment-linksСоздать платёжную ссылку.
GET /payment-linksСписок ссылок, сначала новые.Фильтры: status, merchant_reference, customer_external_id, limit (1–100, по умолчанию 20), offset.
GET /payment-links/{id}Получить ссылку и её последний платёж.
POST /payment-links/{id}/expireЗакрыть неоплаченную ссылку, чтобы по ней больше нельзя было заплатить.
GET /paymentsСписок платежей.Фильтры: status, merchant_reference, payment_link_id, limit, offset.
GET /payments/{id}Получить платёж, включая данные карты (маскированный номер, имя держателя, код авторизации, RRN).
GET /payments/{id}/receiptПолучить квитанцию оплаченного платежа (404, пока платёж не оплачен). Тот же объект, что в вебхуках receipt.*.
POST /payments/{id}/refundВернуть платёж полностью (без суммы) или частично (amount).
POST /payments/{id}/reverseОтменить весь платёж в течение 72 часов.
GET /meta/currenciesВалюты GetPay; платёжные ссылки можно создавать в валютах с is_enabled: true. Ключ не нужен.
GET /ehdmВключена ли ЭККА для вашего аккаунта и ваш налоговый отдел.
GET /ehdm/adg-codesПоиск кодов классификатора.Фильтры: q (начало кода или часть названия), kind (adgt или atg), limit.
GET /payments/{id}/fiscal-receiptФискальный чек платежа.
POST /payments/{id}/fiscal-receipt/retryПовторить фискальный чек в статусе failed или reverse_failed.
GET /eventsСписок событий, сначала новые.Фильтры: type, limit, offset.
GET /events/{id}Получить одно событие, например чтобы подтвердить полученный вебхук.

Списки возвращаются в виде { "object": "list", "items": [...], "total", "limit", "offset" }.

12Ошибки

При ошибке возвращается JSON с HTTP-статусом, стабильным кодом message_code для проверки в вашем коде и понятным текстом message.

Статусmessage_codeЗначение
400BAD_REQUESTЗапрос не может быть обработан, например неподдерживаемая валюта или не включён ни один способ оплаты. Смотрите message.
400EHDM_FIELDS_REQUIREDЭККА включена, а фискальных данных не хватает. details.missing перечисляет поля, напр. line_items[0].ehdm.adg_code.
400CURRENCY_NOT_SUPPORTEDВалюта не включена GetPay. details.supported перечисляет допустимые валюты.
400EHDM_CURRENCY_NOT_SUPPORTEDФискальные чеки только в AMD. Используйте AMD или отправьте ehdm.skip: true.
401UNAUTHORIZEDСекретный ключ отсутствует или недействителен.
403FORBIDDENКлючу это запрещено, например live-ключ до перевода аккаунта в режим live.
404NOT_FOUNDТакого объекта нет для этого ключа и среды.
409CONFLICTНевозможно в текущем состоянии, например отмена после 72 часов, возврат неоплаченного платежа или закрытие оплаченной ссылки. В message указано, что сделать вместо этого.
422VALIDATION_ERRORПоле отсутствует или заполнено неверно. В details.errors перечислены все такие поля.
502PAYMENT_GATEWAY_ERRORБанк отклонил возврат или не ответил. Можно безопасно повторить позже.

13Чек-лист запуска

  • Ваш домен подключён в разделе Домен, и ваш сервер использует указанный там базовый URL API.
  • Ваш аккаунт мерчанта прошёл онбординг и переведён в режим live в личном кабинете.
  • Учётные данные вашего банка (Ameriabank vPOS) подключены и включены в разделе Платёжные шлюзы → Live.
  • Ваш сервер берёт ключ sk_live_… из переменной окружения, а не из кода.
  • Добавлен live-эндпоинт вебхуков с адресом https://, а его секрет whsec_… хранится на вашем сервере.
  • Ваш обработчик вебхуков проверяет подписи, отклоняет старые метки времени и игнорирует повторяющиеся идентификаторы событий.
  • Вы выполняете заказы только после подтверждения complete / paid и совпадения суммы и валюты.
  • Ваша страница благодарности или письмо о заказе показывает покупателю receipt_url.
  • Если вы используете ЭККА: PayX подключён и включён в разделе Настройки → ЭККА, а ваши ссылки передают line_items[].ehdm.
  • Вы провели один небольшой реальный платёж и вернули его.