r=ping
Проверка доступности сервиса.
GET https://pay.agdor.info/api.php?r=ping
Здесь два разных сценария. Один для проектов, которые работают через API и webhook. Второй для операторов, которые создают счета вручную из панели и отправляют готовую payment page или builder view клиенту.
project_code, api_key, wallet_code, invoice.confirmed
Ручные счета из панели
Для операторов, менеджеров и администраторов, которые сами создают invoice, настраивают шаблоны и отправляют клиенту ссылку или готовый текст.
Проект, кошелек, шаблоны, payment page, builder view
API-поток начинается в панели, но дальше работает без ручных действий. Вы создаете проект, привязываете к нему кошельки, сохраняете `api_key` и затем ваш сервис сам создает invoices.
Откройте Dashboard → Projects. После сохранения проект получает `project_code`, `api_key` и `webhook_secret`. `api_key` показывается один раз.
В Dashboard → Wallets создайте нужный способ оплаты, а затем включите его в проекте через список разрешенных кошельков.
Ваш проект вызывает `r=payment_methods`, получает активные `wallet_code` и показывает клиенту список доступных сетей или Binance ID.
После выбора метода оплаты клиентом ваш сервер вызывает `r=create_invoice`, получает `invoice_id`, точную сумму и адрес назначения, а затем показывает эти данные пользователю.
Когда Payment Service находит платеж, он меняет статус invoice и отправляет `invoice.confirmed` в `Webhook URL` вашего проекта.
Каждый 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: ********"
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
{
"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..."
}
]
}
}
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');
}
Если вы не хотите полагаться только на webhook, можно периодически вызывать `r=get_invoice` и проверять статус. Это особенно полезно для внутренних кабинетов или длинных клиентских сессий.
<?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 "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"
| Статус | Смысл |
|---|---|
pending | Счет создан и ждет платеж. |
confirmed | Платеж найден автоматически. |
manual_confirmed | Счет подтвержден вручную. |
cancelled | Счет отменен оператором или проектом. |
expired | Срок invoice истек до момента подтверждения. |