پرش به محتوا

مستندات 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-package
use 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_rialintegerبلهمبلغ به ریال، بزرگ تر از صفر و مضرب ۱۰، یعنی تومان کامل
order_idstringخیرشناسه سفارش خودتان، حداکثر ۱۲۸ کاراکتر. در هر فروشگاه یکتاست و تکرارش همان فاکتور قبلی را برمیگرداند؛ برای کلید نماینده، در همان نماینده. کلید تست و کلید زنده شماره سفارش جدا دارند: سفارش ۱ تست و سفارش ۱ زنده دو فاکتور جدا هستند
callback_urlstringخیرآدرس دریافت وب‌هوک. اگر ندهید، آدرس پیش‌فرض حسابتان استفاده می‌شود. با کلید نماینده فقط همین آدرس خبر میگیرد
descriptionstringخیرتوضیح فاکتور، حداکثر ۱۰۰۰ کاراکتر
metadataobjectخیرهرچه می‌خواهید؛ عیناً در وب‌هوک برمی‌گردد
expiry_minutesintegerخیرمهلت پرداخت، بین ۱ تا ۱۴۴۰ دقیقه. پیش‌فرض از تنظیمات حساب
agentstringخیرکد نماینده ای که این فروش به اسم اوست، برای فروشگاهی که نمایندگی درگاه دارد. در پاسخ و وب هوک برمیگردد. با کلید نماینده لازم نیست؛ اگر بفرستید باید کد همان نماینده باشد
پاسخ ۲۰۱
{
  "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": "موجودی کیف پول کارمزد کافی نیست."
  }
}
HTTPcodeچه شده
۴۰۲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 نمایی دوباره تلاش کنید، نه در حلقه تنگ.