Публичный 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.
CMS и Tilda onboarding
Для CMS-каналов, включая Tilda, WooCommerce, OpenCart и CS-Cart, VPOS.am должен оставаться server-side платежным слоем. Сайт получает только настройки канала и публичные redirect URL, а банковские реквизиты остаются в runtime VPOS.am.
- Для Tilda vPOS.am генерирует merchant login, HMAC secret и checkout URL для Universal payment gateway; банковские ClientID, login и password не вводятся в Tilda.
- Перед live оператор проверяет готовность сайта, подписанный checkout payload, provider route mapping, callback handling и sandbox test payment.
- Production switch остается контролируемым действием оператора после подтверждения договора merchant, provider route и test evidence.
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. |
connectors.statusSync | Normalized VPOS statuses и platform-specific status mappings. Browser return никогда не является proof of payment. |
payment_links, qr_presentation | Включаются только когда выбранный route может создавать payment sessions. |
refund, capture, void, tokenization, subscriptions | Публичные контракты guarded. Выполнение доступно только когда provider capability включена; иначе запрос получает явную disabled/not-configured ошибку. |
/api/widget/checkout
Создает hosted checkout по публичному widget key для Webflow, Squarespace, Wix, Ucraft и простых лендингов. Browser не получает merchant API tokens или bank credentials; VPOS server-side сопоставляет key, allowed origin, merchant и provider route.
| Поле | Правила |
|---|---|
publicKey | Публичный widget installation key, привязанный к exact allowed origins на server-side. |
productId | Configured product key. Сумма по умолчанию должна приходить из VPOS registry. |
clientReference | Browser-generated idempotency reference для click/order attempt. |
returnUrl | Должен принадлежать allowed origin для widget installation. |
/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 | Capture требует authorized payment. Void/cancel требует provider-eligible authorized или paid 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",
"data": {
"payment": {
"id": "pay_01hxxexample",
"merchantOrderId": "order-1001",
"amountMinor": 15000,
"currency": "AMD",
"status": "paid"
}
}
}
Формат signature header: X-VPOS-Signature: t=<unix_timestamp>,v1=<hex_hmac_sha256>. HMAC-SHA256 считается по строке <timestamp>.<raw_request_body> с merchant webhook secret; старые timestamps нужно отклонять.
Идемпотентность
Используйте 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.