Принимайте оплату картами с помощью платёжных ссылок GetPay
Создайте платёжную ссылку на своём сервере, отправьте по ней покупателя и получите уведомление об оплате. GetPay размещает платёжную страницу, взаимодействует с банком и сообщает вам о каждом результате.
01Как это работает
Платёжная ссылка — это размещённая у GetPay платёжная страница для одного заказа. Ваш сервер создаёт её с данными заказа, а всё остальное берёт на себя GetPay.
- Ваш серверСоздаёт платёжную ссылку с товарами, суммой и номером вашего заказа. GetPay возвращает
url. - Ваш сайтПеренаправляет покупателя на этот
url. - ПокупательПроверяет заказ, вводит свои данные и оплачивает картой на защищённой странице банка. Если карта отклонена, можно повторить попытку по той же ссылке.
- GetPayПроверяет результат в банке, отправляет покупателя на ваш
success_urlи присылает вебхукpayment_link.completedна ваш сервер. - Ваш серверПодтверждает оплату и выполняет заказ.
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:
| Тип | Имя | Назначение |
|---|---|---|
| A | api | Базовый URL вашего API: https://api.shopx.am/api/v1 |
| A | merchant | Ваш личный кабинет |
| A | checkout | Платёжные страницы для ваших покупателей |
| A | receipt | Страницы квитанций |
Затем нажмите Проверить подключение. Когда все записи найдены, в кабинете появится базовый 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Создание платёжной ссылки
Вызывайте этот метод со своего сервера, когда покупатель готов платить. Передайте, что он покупает, кто он (если знаете) и куда направить его после оплаты.
Параметры
Передайте либо 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, запросите ссылку.
Выполняйте заказ, только если 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-Signature | t=1790755839,v1=5f2b…: время отправки и подпись HMAC-SHA256. |
| GetPay-Event-Id | Уникальный идентификатор события. Используйте его, чтобы игнорировать дубликаты. |
| GetPay-Event-Type | Например, payment_link.completed. |
| Content-Type | application/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******4242 | 00 |
| Недостаточно средств | failed | 0116 |
| Срок действия карты истёк | failed | 0101 |
| Отклонено эмитентом карты | failed | 0100 |
| Ошибка 3-D Secure | failed | 0-2006 |
| Оставить в обработке | pending: банк ещё не подтвердил платёж; завершите его позже на тестовой странице | — |
Перед запуском проверьте: успешный платёж, отказ с последующей успешной повторной попыткой, покупателя, который закрывает браузер после оплаты (ваш вебхук всё равно должен выполнить заказ), и возврат.
08Возвраты и отмены
Вернуть деньги можно двумя способами. В обоих случаях они возвращаются на карту покупателя через банк.
| Действие | Сумма | Когда | Результат |
|---|---|---|---|
| Отмена | Всегда весь платёж | В течение 72 часов с начала платежа и только если по нему ещё не было возвратов | reversed |
| Полный возврат | Всё, что ещё не возвращено | В любое время после успешного платежа | refunded |
| Частичный возврат | Любая сумма в пределах остатка; можно повторять | В любое время после успешного платежа | partially_refunded, затем refunded, когда остаток равен нулю |
Каждый платёж сам сообщает, что с ним можно сделать прямо сейчас, поэтому вам не нужно отслеживать правила самостоятельно:
| Поле | Значение |
|---|---|
| can_reverse | true, пока отмена возможна. |
| reversible_until | Крайний срок отмены: 72 часа с начала платежа. Показывайте его своим сотрудникам. |
| can_refund | true, пока ещё есть что возвращать. |
| amount_refundable | Максимальная сумма, которую ещё можно вернуть, в минимальных единицах. |
| amount_refunded | Сколько уже возвращено. |
| reversed_at | Когда платёж был отменён. |
Отмена платежа
Отменяет весь платёж в банке. Используйте, когда заказ отменён вскоре после оплаты. По истечении 72 часов или после любого возврата запрос вернёт 409, и вместо отмены нужно будет сделать возврат. Затем отправляется вебхук payment.reversed.
Возврат платежа
Для частичного возврата на сумму до 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. |
| API | receipt_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 | Название компании, юридическое название, ИНН (ՀՎՀՀ), адрес и контакты поддержки из профиля в личном кабинете. |
| customer | Email, имя и телефон, которые ввёл покупатель. |
| payment_method | Банк, маскированный номер карты, имя держателя, код авторизации и RRN. |
| paid_at, issued_at | Когда был совершён платёж и когда выпущена квитанция. |
10Фискальные чеки (ЭККА)
Если ваш бизнес обязан выдавать кассовые чеки, GetPay может регистрировать каждый успешный платёж в Комитете госдоходов через электронную кассу PayX (Է-ՀԴՄ, ehdm.am). Нужен ваш собственный договор с PayX. Подключите выданный ими API-логин в личном кабинете в разделе Настройки → ЭККА.
Пока ЭККА включена, каждая платёжная ссылка должна указывать, что продаётся: код классификатора, название на армянском и единицу измерения. После успешной оплаты GetPay автоматически выдаёт фискальный чек, а после отмены или полного возврата — чек возврата.
Проверьте, включена ли ЭККА
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. Вы получаете его в трёх местах:
| Канал | Что вы получаете |
|---|---|
| API | fiscal_receipt в каждом платеже и GET /payments/{id}/fiscal-receipt. |
| Вебхуки | receipt.updated, когда фискальный чек выдан и когда по нему оформлен возврат. Он находится в data.object.fiscal. |
| Личный кабинет | В деталях транзакции видны фискальный чек, его статус и кнопка Повторить. |
Статусы фискального чека
| Статус | Значение |
|---|---|
pending | Ожидает регистрации (или повторяется). |
issued | Зарегистрирован в налоговом органе. |
failed | Не удалось зарегистрировать после всех попыток. Повторите из кабинета или через API. |
reverse_pending | Оформляется чек возврата после отмены или полного возврата. |
reversed | Чек возврата выдан. |
reverse_failed | Не удалось выдать чек возврата. Повторите. |
canceled | Платёж вернули до регистрации чека, поэтому ничего не зарегистрировано. |
failed; повторите через POST /payments/{id}/fiscal-receipt/retry. Частичный возврат нельзя автоматически оформить по товарам: needs_manual_return становится true, и чек возврата вы оформляете в PayX.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 | Значение |
|---|---|---|
| 400 | BAD_REQUEST | Запрос не может быть обработан, например неподдерживаемая валюта или не включён ни один способ оплаты. Смотрите message. |
| 400 | EHDM_FIELDS_REQUIRED | ЭККА включена, а фискальных данных не хватает. details.missing перечисляет поля, напр. line_items[0].ehdm.adg_code. |
| 400 | CURRENCY_NOT_SUPPORTED | Валюта не включена GetPay. details.supported перечисляет допустимые валюты. |
| 400 | EHDM_CURRENCY_NOT_SUPPORTED | Фискальные чеки только в AMD. Используйте AMD или отправьте ehdm.skip: true. |
| 401 | UNAUTHORIZED | Секретный ключ отсутствует или недействителен. |
| 403 | FORBIDDEN | Ключу это запрещено, например live-ключ до перевода аккаунта в режим live. |
| 404 | NOT_FOUND | Такого объекта нет для этого ключа и среды. |
| 409 | CONFLICT | Невозможно в текущем состоянии, например отмена после 72 часов, возврат неоплаченного платежа или закрытие оплаченной ссылки. В message указано, что сделать вместо этого. |
| 422 | VALIDATION_ERROR | Поле отсутствует или заполнено неверно. В details.errors перечислены все такие поля. |
| 502 | PAYMENT_GATEWAY_ERROR | Банк отклонил возврат или не ответил. Можно безопасно повторить позже. |
13Чек-лист запуска
- Ваш домен подключён в разделе Домен, и ваш сервер использует указанный там базовый URL API.
- Ваш аккаунт мерчанта прошёл онбординг и переведён в режим live в личном кабинете.
- Учётные данные вашего банка (Ameriabank vPOS) подключены и включены в разделе Платёжные шлюзы → Live.
- Ваш сервер берёт ключ
sk_live_…из переменной окружения, а не из кода. - Добавлен live-эндпоинт вебхуков с адресом
https://, а его секретwhsec_…хранится на вашем сервере. - Ваш обработчик вебхуков проверяет подписи, отклоняет старые метки времени и игнорирует повторяющиеся идентификаторы событий.
- Вы выполняете заказы только после подтверждения
complete/paidи совпадения суммы и валюты. - Ваша страница благодарности или письмо о заказе показывает покупателю
receipt_url. - Если вы используете ЭККА: PayX подключён и включён в разделе Настройки → ЭККА, а ваши ссылки передают
line_items[].ehdm. - Вы провели один небольшой реальный платёж и вернули его.