مستندات API
ساخت فاکتور، استعلام وضعیت، تأیید یکبارمصرف و لغو. با تمام پارامترها، کدهای خطا و نمونه در چهار زبان.
آدرس پایه و احراز هویت
تمام درخواستها به آدرس زیر میروند و توکن در هدر Authorization به صورت Bearer فرستاده میشود.
POST https://api.abangateway.ir/api/v1/invoices
Authorization: Bearer ag_live_xxxx…xxxx
Content-Type: application/jsonتوکن دو حالت دارد و پیشوندش حالت را نشان میدهد: ag_live_ برای واقعی و ag_test_ برای محیط آزمایش. بعد از پیشوند دقیقا ۴۸ کاراکتر میآید، و کلید کامل فقط همان لحظه ساخت در پنل نشان داده میشود. این دو کاملاً از هم جدا هستند — توکن آزمایشی هرگز نمیتواند فاکتور واقعی را بخواند و برعکس، و هر دو حالت ۴۰۴ میگیرند نه ۴۰۳. گفتن اینکه «این فاکتور هست ولی مال شما نیست» خودش افشای اطلاعات است.
کلید نماینده: فروشگاهی که نمایندگی درگاه دارد میتواند برای هر نماینده کلید جدا بسازد تا نماینده آن را در سایت خودش بگذارد. شکلش همین است (ag_live_ یا ag_test_) و همه مسیرهای این صفحه با آن کار میکنند، با این فرق ها: هر فاکتوری که با آن ساخته شود فروش همان نماینده است و فیلد agent لازم نیست؛ فقط فاکتورهای همان نماینده را میبیند و بقیه برایش ۴۰۴ است؛ order_id در فضای خود نماینده یکتاست، پس سفارش ۱۰۴۳ دو نماینده با هم قاطی نمیشود؛ و وبهوک فقط به callback_url همان فاکتور میرود و با کلید امضای خود نماینده امضا میشود. اگر نماینده یا نمایندگی فروشگاه خاموش شود، این کلید ۴۰۳ میگیرد.
بسته PHP و لاراول
اگر با PHP کار میکنید، بسته رسمی همه درخواست های این صفحه، چک امضای وبهوک و خطاهای کلاس بندی شده را آماده دارد. PHP 7.4 به بالا کافی است و در لاراول ۱۰ تا ۱۳ خودش ثبت میشود: تنظیمات، یک مسیر آماده برای وبهوک و رویداد پرداخت.
composer require abangateway/abangateway-php-packageuse AbanGateway\Client;
$aban = new Client(getenv('ABANGATEWAY_KEY'));
$invoice = $aban->invoiceForOrder('ORD-1043', [
'amount_toman' => 150000,
'callback_url' => 'https://shop.example/aban/webhook',
]);
header('Location: ' . $invoice->paymentUrl);invoiceForOrder برای هر سفارش یک فاکتور باز نگه میدارد: اگر فاکتور قبلی منقضی شده باشد یا مبلغ عوض شده باشد، فاکتور تازه میسازد، و سفارشی را که پرداخت شده دوباره نمیفروشد.
بسته PHP آبان گیت ویراهنمای کامل، نمونه لاراول و جدول خطاها
ساخت فاکتور
POST/api/v1/invoices
یک فاکتور میسازد و لینک صفحه پرداخت را برمیگرداند.
| پارامتر | نوع | الزامی | توضیح |
|---|---|---|---|
| amount_rial | integer | بله | مبلغ به ریال، بزرگ تر از صفر و مضرب ۱۰، یعنی تومان کامل |
| order_id | string | خیر | شناسه سفارش خودتان، حداکثر ۱۲۸ کاراکتر. در هر فروشگاه یکتاست و تکرارش همان فاکتور قبلی را برمیگرداند؛ برای کلید نماینده، در همان نماینده. کلید تست و کلید زنده شماره سفارش جدا دارند: سفارش ۱ تست و سفارش ۱ زنده دو فاکتور جدا هستند |
| callback_url | string | خیر | آدرس دریافت وبهوک. اگر ندهید، آدرس پیشفرض حسابتان استفاده میشود. با کلید نماینده فقط همین آدرس خبر میگیرد |
| description | string | خیر | توضیح فاکتور، حداکثر ۱۰۰۰ کاراکتر |
| metadata | object | خیر | هرچه میخواهید؛ عیناً در وبهوک برمیگردد |
| expiry_minutes | integer | خیر | مهلت پرداخت، بین ۱ تا ۱۴۴۰ دقیقه. پیشفرض از تنظیمات حساب |
| agent | string | خیر | کد نماینده ای که این فروش به اسم اوست، برای فروشگاهی که نمایندگی درگاه دارد. در پاسخ و وب هوک برمیگردد. با کلید نماینده لازم نیست؛ اگر بفرستید باید کد همان نماینده باشد |
{
"invoice_id": "inv_a3f9k2m8p1q7r4s6",
"status": "pending",
"amount_rial": 150000000,
"payable_rial": 150000010,
"payable_toman": 15000001,
"fee_rial": 40000,
"order_id": "ORD-2291",
"card_number": "6037991234567890",
"card_holder": "سارا رضایی",
"card_last4": "7890",
"iban": "IR620540102680020817909002",
"payment_url": "https://abangateway.ir/pay/inv_a3f9k2m8p1q7r4s6",
"expires_at": "2026-08-01T15:30:00Z",
"paid_at": null,
"is_test": false
}استعلام وضعیت
GET/api/v1/invoices/{invoice_id}
وضعیت فعلی فاکتور را برمیگرداند. هر تعداد بار قابل فراخوانی است.
| وضعیت | معنی |
|---|---|
| pending | ساخته شده، هنوز پرداخت نشده |
| partially_paid | فاکتور چندتکه، بعضی تکهها پرداخت شده |
| paid | کامل پرداخت شده |
| expired | مهلت تمام شد |
| cancelled | لغو شده |
تأیید — یکبار و فقط یکبار
POST/api/v1/invoices/{invoice_id}/verify
پرداخت را تأیید و مصرف میکند. تنها اولین فراخوانی موفق است.
این عمداً یکبارمصرف است. اولین فراخوانی موفق verified: true برمیگرداند و هر فراخوانی بعدی ۴۰۹ میدهد. همین یک قاعده است که اجازه میدهد بعد از تایماوت با خیال راحت دوباره تلاش کنید، بدون اینکه سفارش دو بار تحویل داده شود.
{
"verified": true,
"invoice_id": "inv_a3f9k2m8p1q7r4s6",
"order_id": "ORD-2291",
"amount_rial": 150000000,
"paid_at": "2026-08-01T14:32:11Z"
}لغو
POST/api/v1/invoices/{invoice_id}/cancel
فاکتور پرداختنشده را لغو میکند و کارمزد رزروشده را آزاد میکند.
فاکتور پرداختشده لغو نمیشود و ۴۰۹ میگیرید. اگر واریزی بعد از لغو برسد، به صف بررسی دستی شما میرود و گم نمیشود.
محیط آزمایش
POST/api/v1/invoices/{invoice_id}/simulate-payment
فقط با توکن ag_test_ — پرداخت را شبیهسازی میکند.
با توکن آزمایشی میتوانید کل چرخه را بدون کارت واقعی و بدون کارمزد اجرا کنید: فاکتور بسازید، پرداخت را شبیهسازی کنید، وبهوک بگیرید، verify کنید. با توکن واقعی این مسیر ۴۰۳ میدهد.
کدهای خطا
خطاها همیشه یک شکل دارند و code ماشینخوان است. روی message شرط نگذارید؛ متنش ممکن است عوض شود.
{
"error": {
"code": "insufficient_fee_wallet",
"message": "موجودی کیف پول کارمزد کافی نیست."
}
}| HTTP | code | چه شده |
|---|---|---|
| ۴۰۲ | not_yet_paid | هنوز واریزی برای این فاکتور تشخیص داده نشده |
| ۴۰۲ | insufficient_fee_wallet | کیف پول کارمزد خالی است؛ فاکتور جدید ساخته نمیشود |
| ۴۰۳ | sandbox_only | این مسیر فقط با توکن آزمایشی کار میکند |
| ۴۰۳ | agent_disabled | کلید مال نماینده ای است که غیرفعال شده |
| ۴۰۳ | agency_not_enabled | کلید نماینده، وقتی نمایندگی درگاه فروشگاه خاموش است |
| ۴۰۴ | invoice_not_found | فاکتور وجود ندارد یا مال این توکن نیست |
| ۴۰۹ | already_verified | قبلاً تأیید شده — دوباره تحویل ندهید |
| ۴۰۹ | invoice_not_payable | وضعیت فاکتور اجازه این کار را نمیدهد |
| ۴۰۹ | no_card_registered | هیچ کارت فعالی روی حساب ثبت نشده |
| ۴۰۹ | agent_has_no_card | هیچ کدام از کارت های این نماینده الان فعال نیست |
| ۴۰۹ | cards_reserved_for_agents | همه کارت های فعال برای نماینده ها کنار گذاشته شده اند |
| ۴۱۰ | invoice_expired | مهلت پرداخت تمام شده |
| ۴۲۲ | invalid_request | بدنه درخواست ناقص یا نادرست است؛ details.fields میگوید کدام فیلد |
| ۴۲۲ | amount_not_allowed | مبلغ خارج از حد مجاز است |
| ۴۲۲ | unsafe_callback_url | آدرس بازگشت پذیرفته نشد |
| ۴۲۲ | agency_not_enabled | نمایندگی درگاه برای این فروشگاه فعال نیست |
| ۴۲۲ | agent_not_found | نماینده ای با این کد در فروشگاه نیست |
| ۴۲۲ | agent_disabled | این نماینده غیرفعال است |
| ۴۲۲ | agent_key_mismatch | با کلید نماینده، فیلد agent کد نماینده دیگری است |
| ۵۰۳ | capacity_full | ظرفیت همزمان روی این کارت پر است؛ کمی بعد دوباره تلاش کنید |
محدودیت نرخ
سقف درخواست روی کل فروشگاه است، نه روی هر کلید: همه کلیدهای آزمایشی و واقعی یک فروشگاه با هم یک سهم دارند، الان ۱۲۰ درخواست در دقیقه، و هر کلید نماینده سهم جدای خودش را دارد. اگر بیش از حد درخواست بفرستید ۴۲۹ میگیرید با کد rate_limited، همراه با error.details.retry_after_seconds و هدر Retry-After که میگویند چند ثانیه صبر کنید. با backoff نمایی دوباره تلاش کنید، نه در حلقه تنگ.