Публичный scope
Создание merchant payment sessions, проверка статуса платежа, non-secret health status, webhooks и идемпотентные retries.
Console/admin endpoints, operator tokens, provider credentials, банковские secrets, payout-данные и внутренние reconciliation controls.
Production credentials выдаются только после onboarding merchant, проверки домена, callback security и тестового платежного сценария.
Не вызывайте merchant endpoints из browser code или мобильных приложений с embedded secrets. Bearer tokens и webhook secrets должны храниться только на доверенном backend.
Быстрый старт
Минимальная интеграция состоит из трех server-side частей: создать платежную сессию, перенаправить покупателя на hosted checkout, затем подтвердить финальный статус через status lookup или подписанный webhook.
curl -X POST https://api.vpos.am/v1/payment-sessions \
-H "Authorization: Bearer <merchant_api_token>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1001-pay-attempt-1" \
-d '{
"merchantOrderId": "order-1001",
"amountMinor": 15000,
"currency": "AMD",
"provider": "manual",
"returnUrl": "https://merchant.example/payments/return",
"customer": {
"email": "buyer@example.com",
"phone": "+37400000000",
"name": "Test Buyer"
},
"metadata": {
"source": "custom-backend"
}
}'
Browser return URL не является доказательством оплаты. Это только UI-событие. Выдача товара или изменение заказа должны ждать server-side verification или подписанного webhook event.
Endpoints
/api/health
Возвращает non-secret runtime status для monitoring и integration checks. Readiness blockers могут присутствовать в JSON, но клиентам не стоит считать их стабильным контрактом.
| Статус | Значение |
|---|---|
| 200 | Сервис доступен. Readiness возвращается в JSON body. |
| 405 | HTTP method не поддерживается. |
/v1/capabilities
Возвращает консервативную provider capability matrix. Используйте ее, чтобы включать PayLink, QR, refunds, fiscalization и tokenization в UI только после готовности route.
| Поле | Правила |
|---|---|
providers[].capabilities | Boolean support/enabled flags для каждого provider route. |
payment_links, qr_presentation | Включаются только когда выбранный route может создавать payment sessions. |
refund, capture, void, tokenization, subscriptions | Публичные контракты guarded; выполнение остается disabled до provider capabilities, idempotency и sandbox tests. |
/v1/payment-links
Создает идемпотентную payment link на базе payment session. QR payload является только URL presentation layer; финальный статус оплаты приходит через webhook или reconciliation.
| Поле | Правила |
|---|---|
Idempotency-Key | Обязательный header. Повторно используйте его при retries, чтобы не создать duplicate link. |
amount, currency | Сумма в major units и валюта AMD/USD/EUR. Для AMD только целое значение. |
description | Обязательное customer-facing описание платежа. |
expiresAt | Опциональная будущая ISO date/time. Expiry не доказывает результат платежа. |
providerRoute | Опциональный provider route. Unsupported или not-ready route отклоняется. |
/v1/payment-sessions
Создает нормализованную платежную сессию и возвращает hosted checkout URL, если выбранный provider может инициировать checkout.
| Поле | Правила |
|---|---|
merchantOrderId | Обязательный merchant-side order reference. Используйте стабильное значение для сверки. |
amountMinor | Обязательная целая сумма в minor currency units. |
currency | Публично поддерживаемые значения: AMD, USD, EUR. |
returnUrl | Абсолютный HTTPS URL, куда покупатель возвращается после checkout. |
customer | Опциональные email, phone и name. Храните только то, что нужно бизнес-процессу. |
/v1/payments/{id}/refunds · /capture · /void
Защищенные контракты операций для refunds, capture, void, fiscal retry, tokenization и subscriptions. Они требуют Idempotency-Key и не выполняют операцию, пока provider capabilities не включены и не протестированы.
| Поле | Правила |
|---|---|
Idempotency-Key | Обязателен для каждой money-moving или lifecycle operation. |
refund | Требует verified paid/partially_refunded payment, amountMinor, совпадающую currency и reason. |
capture, void | Требуют authorized payment. Browser return не используется как proof. |
tokenization | Raw card data отклоняется; нужен provider-hosted token lifecycle и consent. |
subscriptions | Требуют provider token и tested failed-renewal behavior до включения выполнения. |
/v1/payments?paymentId=<id>
Возвращает текущий нормализованный payment state для ранее созданной сессии.
| Статус | Рекомендованная обработка |
|---|---|
created, pending_*, authorized | Не выполнять fulfillment. Продолжайте polling или ждите webhook. |
paid | Fulfillment возможен после совпадения amount, currency и order reference. |
failed, cancelled, expired | Покажите отказ или создайте новую payment attempt. |
refunded, partially_refunded, reversed, disputed | Синхронизируйте accounting, CRM и support workflows. |
Webhooks
Webhook delivery настраивается для каждого merchant при onboarding. Ваш endpoint должен проверить HMAC signature, сохранить event id, быстро ответить и перенести бизнес-эффекты в очередь.
{
"id": "evt_01hxxexample",
"type": "payment.status_changed",
"createdAt": "2026-05-25T08:00:00.000Z",
"payment": {
"id": "pay_01hxxexample",
"merchantOrderId": "order-1001",
"amountMinor": 15000,
"currency": "AMD",
"status": "paid"
}
}
Формат signature header: X-VPOS-Signature: sha256=<hex_hmac_sha256>. HMAC считается по raw request body с merchant webhook secret.
Идемпотентность
Используйте Idempotency-Key для retryable operations, например создания payment session. Храните ключ вместе с order и payment attempt. Network retry не должен создавать второй payable order или invoice.
- Используйте deterministic key для каждой order payment attempt, а не новый random key на каждый retry.
- Для разных user-initiated attempts используйте разные ключи.
- Логируйте VPOS payment id, merchant order id, amount и currency вместе.
Ошибки
| HTTP status | Значение | Действие интегратора |
|---|---|---|
401 | Merchant bearer token отсутствует или неверный. | Не retry вслепую. Проверьте или перевыпустите credentials. |
403 | Request origin не является trusted. | Используйте server-to-server requests или зарегистрируйте backend origin. |
422 | Validation failed. | Исправьте request data перед retry. |
429 | Rate limited. | Сделайте backoff и retry с jitter. |
503 | Provider, storage или auth dependency не готовы. | Повторите позже или обратитесь в support, если это блокирует production. |
Правила безопасности
- Никогда не раскрывайте merchant bearer tokens, webhook secrets или provider credentials во frontend code.
- Используйте только HTTPS и проверяйте server certificates в backend clients.
- Считайте платеж финальным только после server-side confirmation.
- Проверяйте amount, currency и merchant order id перед изменением order, CRM или ERP state.
- Сохраняйте webhook event ids и не допускайте повторных side effects.
- Логируйте failed signature checks и неожиданные status transitions без лишних персональных данных.
Эта публичная страница намеренно не содержит production tokens, internal console routes, private provider callbacks, database details или bank credentials.
Запрос доступа
Для pilot или production access отправьте company name, website, integration type, expected provider, currencies, callback URL и contact person на info@vpos.am.
Перед production VPOS.am проверяет merchant identity, domain ownership, callback security, test payment results, refund/reconciliation process и support ownership.