AgDor Pay

Документация

Здесь два разных сценария. Один для проектов, которые работают через API и webhook. Второй для операторов, которые создают счета вручную из панели и отправляют готовую payment page или builder view клиенту.

API Flow Автоматическая интеграция Для сайтов, SaaS, Telegram-ботов и клиентских проектов, где invoice создается программно и статус приходит вебхуком. project_code, api_key, wallet_code, invoice.confirmed Dashboard Flow Ручные счета из панели Для операторов, менеджеров и администраторов, которые сами создают invoice, настраивают шаблоны и отправляют клиенту ссылку или готовый текст. Проект, кошелек, шаблоны, payment page, builder view

Автоматическая интеграция

API-поток начинается в панели, но дальше работает без ручных действий. Вы создаете проект, привязываете к нему кошельки, сохраняете `api_key` и затем ваш сервис сам создает invoices.

1

Создайте проект

Откройте Dashboard → Projects. После сохранения проект получает `project_code`, `api_key` и `webhook_secret`. `api_key` показывается один раз.

2

Добавьте кошелек и привяжите его к проекту

В Dashboard → Wallets создайте нужный способ оплаты, а затем включите его в проекте через список разрешенных кошельков.

3

Получите методы оплаты

Ваш проект вызывает `r=payment_methods`, получает активные `wallet_code` и показывает клиенту список доступных сетей или Binance ID.

4

Создайте invoice

После выбора метода оплаты клиентом ваш сервер вызывает `r=create_invoice`, получает `invoice_id`, точную сумму и адрес назначения, а затем показывает эти данные пользователю.

5

Дождитесь подтверждения

Когда Payment Service находит платеж, он меняет статус invoice и отправляет `invoice.confirmed` в `Webhook URL` вашего проекта.

Если `api_key` потерян, его нельзя прочитать повторно. Для рабочего проекта нужно сгенерировать новый ключ в настройках проекта и обновить его у клиента.

Авторизация

Каждый API-запрос должен передавать `project_code` и `api_key`. Предпочтительный способ: HTTP-заголовки.

Поле Где передавать Описание
X-Project-Code Header Внутренний код проекта.
X-API-Key Header Секрет проекта для API-запросов.
project_code POST / GET Запасной вариант, если клиент не умеет отправлять заголовки.
api_key POST Запасной вариант для server-to-server запросов.
curl -X POST "https://pay.agdor.info/api.php?r=payment_methods" \
  -H "X-Project-Code: project_demo_123" \
  -H "X-API-Key: ********"

Методы API

r=ping

Проверка доступности сервиса.

GET https://pay.agdor.info/api.php?r=ping

r=payment_methods

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

GET/POST https://pay.agdor.info/api.php?r=payment_methods

r=create_invoice

Создает invoice и возвращает точную сумму с микро-офсетом, который должен оплатить клиент.

POST https://pay.agdor.info/api.php?r=create_invoice

r=get_invoice

Возвращает текущее состояние invoice по `invoice_id` или `external_id`.

GET/POST https://pay.agdor.info/api.php?r=get_invoice

r=cancel_invoice

Отменяет invoice, пока он находится в статусе `pending`.

POST https://pay.agdor.info/api.php?r=cancel_invoice

r=confirm_invoice

Ручное подтверждение invoice со стороны проекта. Используется только для специальных сценариев.

POST https://pay.agdor.info/api.php?r=confirm_invoice

Пример `payment_methods`

{
  "status": "success",
  "data": {
    "project_code": "project_demo_123",
    "wallets": [
      {
        "wallet_code": "usdt_trc20_main",
        "label": "USDT TRC20",
        "payment_type": "crypto_wallet",
        "currency": "USDT",
        "network": "TRC20",
        "address": "T..."
      }
    ]
  }
}

Пример `create_invoice`

curl -X POST "https://pay.agdor.info/api.php?r=create_invoice" \
  -H "X-Project-Code: project_demo_123" \
  -H "X-API-Key: ********" \
  -d "amount=25.00" \
  -d "wallet_code=usdt_trc20_main" \
  -d "external_id=order_10452" \
  -d "customer_id=user_42"
{
  "status": "success",
  "data": {
    "invoice_id": "inv_87a3bfd",
    "project_code": "project_demo_123",
    "external_id": "order_10452",
    "customer_id": "user_42",
    "status": "pending",
    "amount_requested": "25.00",
    "amount": "25.0427",
    "currency": "USDT",
    "payment_type": "crypto_wallet",
    "network": "TRC20",
    "address": "T...",
    "wallet_code": "usdt_trc20_main",
    "wallet_label": "USDT TRC20",
    "expires_at": "2026-06-13 18:30:00",
    "confirmed_at": null,
    "txid": null,
    "metadata": {}
  }
}
Поле amount в ответе может быть больше, чем запрошенная сумма. Оплачивать нужно именно его, иначе автоматическая привязка платежа не сработает.

Вебхуки

После подтверждения invoice сервис отправляет POST-запрос на `Webhook URL`, указанный в проекте. Повторная отправка возможна, поэтому обработчик у клиента должен быть idempotent.

Header Описание
X-Payment-Event-Id Уникальный идентификатор webhook-события.
X-Payment-Timestamp Unix timestamp, который участвует в подписи.
X-Payment-Signature HMAC-SHA256 подпись по формуле `timestamp.payload`.
signature = HMAC_SHA256(
  timestamp + "." + raw_json_payload,
  webhook_secret
)
{
  "event_id": "evt_...",
  "event_type": "invoice.confirmed",
  "invoice_id": "inv_87a3bfd",
  "project_code": "project_demo_123",
  "external_id": "order_10452",
  "customer_id": "user_42",
  "status": "confirmed",
  "amount_requested": "25.00",
  "amount": "25.0427",
  "currency": "USDT",
  "payment_type": "crypto_wallet",
  "network": "TRC20",
  "address": "T...",
  "wallet_code": "usdt_trc20_main",
  "wallet_label": "USDT TRC20",
  "txid": "transaction_hash",
  "confirmed_at": "2026-06-13 18:41:20",
  "metadata": {}
}
<?php
$rawBody = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_PAYMENT_TIMESTAMP'] ?? '';
$signature = $_SERVER['HTTP_X_PAYMENT_SIGNATURE'] ?? '';
$expected = hash_hmac('sha256', $timestamp . '.' . $rawBody, $webhookSecret);

if (!hash_equals($expected, $signature)) {
    http_response_code(403);
    exit('bad signature');
}

Polling как резерв

Если вы не хотите полагаться только на webhook, можно периодически вызывать `r=get_invoice` и проверять статус. Это особенно полезно для внутренних кабинетов или длинных клиентских сессий.

Когда использовать

  • внутренний кабинет без внешнего webhook endpoint
  • резервный канал рядом с webhook
  • проверка статуса в browser session пользователя

Практика

  • опрашивать раз в 5-10 секунд
  • остановить опрос при `confirmed`, `manual_confirmed`, `cancelled`, `expired`
  • не спамить сервис параллельными запросами на один invoice

Примеры

Минимальный PHP-клиент

<?php
$ch = curl_init("https://pay.agdor.info/api.php?r=create_invoice");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_USERAGENT => 'Mozilla/5.0 AgDor Pay Client',
    CURLOPT_HTTPHEADER => [
        'X-Project-Code: project_demo_123',
        'X-API-Key: ********',
    ],
    CURLOPT_POSTFIELDS => http_build_query([
        'amount' => '25.00',
        'wallet_code' => 'usdt_trc20_main',
        'external_id' => 'order_10452',
    ]),
]);
$response = curl_exec($ch);

Минимальный cURL-check статуса

curl "https://pay.agdor.info/api.php?r=get_invoice" \
  -H "X-Project-Code: project_demo_123" \
  -H "X-API-Key: ********" \
  -d "invoice_id=inv_87a3bfd"

Статусы invoice

Статус Смысл
pendingСчет создан и ждет платеж.
confirmedПлатеж найден автоматически.
manual_confirmedСчет подтвержден вручную.
cancelledСчет отменен оператором или проектом.
expiredСрок invoice истек до момента подтверждения.