AxtonPay API

Document version: 0.9

اطلاعات عمومی

نقطه پایانی API

https://mp.axtonpay.com/api/v1/private/checkout

Content-type

API درخواست‌ها را با دو نوع محتوا می‌پذیرد: 'application/x-www-form-urlencoded', 'application/json'.

هدر HTTP باید با محتوای POST بدنه منطبق باشد.

اختصارات و تعاریف

  • {PID} - شناسه فاکتور، معمولاً یک رشته ۸ کاراکتری حروف و اعداد یکتا است.
  • Shop - وب‌سایت شما که پرداخت‌ها را از طریق سرویس AxtonPay قبول می‌کند

الگوریتم کار با API

ترتیب معمول اقدامات برای دریافت پرداخت:

  • ایجاد یک صورت‌حساب ('/api/v1/private/checkout/payment/create')، پاسخ API آدرس URL صورت‌حساب را برمی‌گرداند ('invoice_url')،
  • خریدار را به این فاکتور بفرستید تا پرداخت انجام شود،
  • منتظر اعلان‌های سرور AxtonPay باشید، که به 'server_notification_url' خواهند آمد،
  • پس از دریافت هرگونه اطلاعیه از AxtonPay، اعتبار امضای آن را بررسی کنید و ترجیحاً تأیید دریافت را به AxtonPay ('/api/v1/private/checkout/payment/confirm/{PID}') ارسال کنید،
  • اگر وضعیت یک فاکتور تغییر کند، اقداماتی مطابق با این وضعیت انجام دهید (به عنوان مثال، درخواست اطلاعات کامل درباره فاکتور، ارسال کالاها، ایجاد تیکت برای تیم پشتیبانی و غیره).

اگر هنگام ایجاد فاکتور یک 'server_notification_url' خالی یا نامعتبر تنظیم کنید، سرویس قادر به ارسال اعلان‌ها درباره تغییرات وضعیت نخواهد بود؛ در چنین مواردی، شما باید خودتان فاکتور را در فواصل زمانی مشخص بررسی کنید ('/api/v1/private/checkout/payment/get/{PID}').

صدور مجوز درخواست‌ها

برای مجاز کردن یک درخواست، لازم است یک هش از رشته‌ای که به صورت خاصی تشکیل شده است، محاسبه شود. این رشته با الحاق (چسباندن) آرگومان‌های URL (QUERY_STRING) و بدنه درخواست POST (REQUEST_BODY) ساخته می‌شود. مهم است که همه مؤلفه‌ها دقیقاً به همان صورت که به سرور منتقل می‌شوند، گرفته شوند. آرگومان‌های URL (QUERY_STRING) باید از URL به صورت یک خط گرفته شوند، بدون تغییر ترتیب آرگومان‌ها و بدون حذف هیچ عنصری. بدنه درخواست POST (REQUEST_BODY) نیز باید بدون هیچ گونه تغییری استفاده شود، از جمله اینکه نباید از آن نقل‌قول‌ها، فاصله‌ها، براکت‌ها یا شکست خطوط را حذف کرد.

در مواردی که بدنه درخواست POST خالی باشد و در مورد آرگومان‌های URL خالی، آن مؤلفه به سادگی رشته خالی خواهد بود.

ترتیب داده‌ها در درخواست امضا: QUERY_STRING ابتدا، سپس داده‌های POST. نباید هیچ علامت اتصال‌دهنده‌ای بین آن‌ها قرار دهید، فقط دو رشته متنی را به هم بچسبانید.

یک بار دیگر، هر نماد مهم است. شما نباید حتی یک فاصله یا نماد خط جدید را اضافه یا حذف کنید. فقط از داده خام دریافت‌شده توسط سرور استفاده کنید.

یک SHA-256 هش با کلید 'Secret key' از رشته حاصل گرفته می‌شود و به عنوان آرگومان دوم تابع hash_hmac() استفاده می‌شود.

عبور دادن پارامتر 'time' حاوی POSIX timestamp (Unix time) فعلی اجباری است.

این امضا برای ۲۴ ساعت معتبر است. اگر مقدار پارامتر 'time' بیش از ۲۴ ساعت با زمان فعلی سرور تفاوت داشته باشد (چه جلو و چه عقب)، درخواست حتی اگر امضا بدون خطا محاسبه شده باشد، ناموفق خواهد بود.

اگر پنل فروشنده درخواستی را با یک امضا قبول کرده باشد، آن امضا نمی‌تواند دوباره استفاده شود، حتی برای ارسال همان درخواست با همان پارامترها (این شامل پارامتر 'time' می‌شود).

هش حاصل در هدر HTTP 'Sign' ارسال می‌شود.

علاوه بر امضای محاسبه شده، درخواست همچنین باید یک هدر 'Api-Key' شامل کلید API استفاده شده داشته باشد. مثال:

$headers = [
      'Api-Key: ' . $the_api_key,
      'Sign: ' . $signature_sha256
    ];

شما می‌توانید درخواست ارسال شده به AxtonPay را با هر کلید معتبری که به این چک‌اوت تعلق دارد امضا کنید. با این حال، AxtonPay همیشه از کلیدی که شما در پنل فروشنده انتخاب کرده‌اید استفاده می‌کند.

نمونه‌ای از محاسبه امضا:

/* 
Imagine there is the POST request:
URI: '/api/v1/private/checkout/payment/create?time=1735084500.3561'
POST body: '[email protected]&shop_payment_id=INVOICE-1746&pms=all&amount=19.95&currency=USD'
So there are HTTP query string and request body:
*/ 
$the_query_string = 'time=1735084500.3561';
$the_request_body = '[email protected]&shop_payment_id=INVOICE-1746&pms=all&amount=19.95&currency=USD';

// • A pair of 'API key' and 'Secret key' gathered from the admin panel
$the_api_key = 'key1';
$the_api_secret = 'secret1';

// • Concatenation:
$string_for_sha = $the_query_string . $the_request_body;
// Value: '[email protected]&shop_payment_id=INVOICE-1746&pms=all&amount=19.95&currency=USD'

// • Calculating the HTTP header 'Sign'
// hash method is SHA-256
$signature_sha256 = hash_hmac("sha256", $string_for_sha, $the_api_secret); 
// '31ca271a15e45802e07b7559a5f520656c050dda79e6fa46d52a15fc51d193cd'

/* • Signed HTTP request:
  Method: POST
  URI: '/api/v1/private/checkout/payment/create?time=1735084500.3561'
  HTTP header 'Api-Key': 'key1'
  HTTP header 'Sign': '31ca271a15e45802e07b7559a5f520656c050dda79e6fa46d52a15fc51d193cd'
  POST body: '[email protected]&shop_payment_id=INVOICE-1746&pms=all&amount=19.95&currency=USD'
*/

به فاصله‌ها و شکست‌های خط در مثال دیگری توجه کنید:

/* 
Imagine there is the POST request:
URI: '/api/v1/private/checkout/payment/create?shop_name=Very%20useful%20service'
POST body: '{
  "shop_user_id": "[email protected]",
  "shop_payment_id": "INVOICE-1746",
  "shop_payment_desc": "Premium service
(1 month)",

  "pms": "all",
  "amount": "19.95",
  "currency": "USD",
  "time": "1735084500.3561"
}'

Attention! It's important to keep the raw data 'as is', including all tabulations, whitespaces, and line breaks. 
For example, the signature becomes invalid if your software formats json, adds or removes spaces. 

So there are such HTTP query string and POST request body:
*/ 
$the_query_string = 'shop_name=Very%20useful%20service';
$the_request_body = '{
  "shop_user_id": "[email protected]",
  "shop_payment_id": "INVOICE-1746",
  "shop_payment_desc": "Premium service
(1 month)",

  "pms": "all",
  "amount": "19.95",
  "currency": "USD",
  "time": "1735084500.3561"
}';

// • A pair of 'API key' and 'Secret key' gathered from the merchant panel
$the_api_key = 'key1';
$the_api_secret = 'secret1';

// • Concatenation:
//
// hash method is SHA-256 (HTTP query string + request body)
$string_for_sha = $the_query_string . $the_request_body;
/* Value: 'shop_name=Very%20useful%20service{
  "shop_user_id": "[email protected]",
  "shop_payment_id": "INVOICE-1746",
  "shop_payment_desc": "Premium service
(1 month)",

  "pms": "all",
  "amount": "19.95",
  "currency": "USD",
  "time": "1735084500.3561"
}'
*/

// • Calculating the HTTP header 'Sign'

$signature_sha256 = hash_hmac("sha256", $string_for_sha, $the_api_secret); 
// 'ef15476f28b379e4b137a2dcd9ed495332e4766004ac3610bb92a69ba2303c28'

/* • Signed HTTP request:
  Method: POST
  URI: '/api/v1/private/checkout/payment/create'
  HTTP header 'Api-Key': 'key1'
  HTTP header 'Sign': 'ef15476f28b379e4b137a2dcd9ed495332e4766004ac3610bb92a69ba2303c28'
  POST body: '{
  "shop_user_id": "[email protected]",
  "shop_payment_id": "INVOICE-1746",
  "shop_payment_desc": "Premium service
(1 month)",

  "pms": "all",
  "amount": "19.95",
  "currency": "USD",
  "time": "1735084500.3561"
}' 
*/

Python نمونه‌ای از ترکیب رشته برای محاسبه امضا:

string_for_hash_calculation = f'{request.query_params.urlencode()}{request.data.urlencode()}'

پارامترها

API تمامی پارامترها را هم در QUERY_STRING و هم در بدنهٔ درخواست POST می‌پذیرد.

متغیرهای بولی

API انتظار دارد که در متغیرهای بولی '0' یا '1' دریافت کند، اما به دلیل تبدیل نوع ضمنی، هر رشته متنی به عنوان '1' در نظر گرفته می‌شود، حتی کلمه 'false'. بنابراین، برای تعیین صریح مقدار 'FALSE' برای یک متغیر بولی، باید به آن یا مقدار '0' یا یک رشته خالی بدهید.

جداساز اعشاری

تنها نقطه اعشار به عنوان جداکننده اعشار در اعداد استفاده می‌شود.

حروف بزرگ و کوچک در پارامترها

با چند استثنا، تمام پارامترها حساس به حروف بزرگ و کوچک هستند.

نشانی اینترنتی بازخوانی

در پنل مدیریت AxtonPay، در صفحه تنظیمات پرداخت، امکان تنظیم آدرس‌های اینترنتی فروشگاه برای دریافت اعلان‌های سرور به سرور از AxtonPay وجود دارد، همچنین آدرس‌هایی برای هدایت خریدار پس از پرداخت فاکتور یا لغو آن، و همچنین در صورت بروز خطا، قابل تنظیم است.

این URLها می‌توانند در درخواست ایجاد فاکتور بازنویسی شوند.

روش‌های AxtonPay API

ایجاد فاکتور: /api/v1/private/checkout/payment/create

روش /api/v1/private/checkout/payment/create ایجاد فاکتور را آغاز می‌کند.

اگر موفقیت‌آمیز باشد، این روش یک لینک ('invoice_url') بازمی‌گرداند که شما باید مشتری را برای پرداخت به آن هدایت کنید.

پارامترهای فاکتور مخصوص خود:

  • time (الزامی) - POSIX timestamp (Unix time)
  • amount (الزامی) - مقدار قابل پرداخت (قیمت محصول یا خدماتی که فروشگاه می‌خواهد دریافت کند)
  • currency (الزامی) - کد ارز ۳ حرفی طبق ISO 4217-alpha، بدون حساسیت به حروف بزرگ و کوچک
  • pms (الزامی) - روش‌های پرداخت نمایش داده شده در صفحه فاکتور. اگر می‌خواهید همه روش‌های پرداخت را اجازه دهید، مقدار 'all' است؛ اگر می‌خواهید فقط برخی از آن‌ها را اجازه دهید، شناسه‌های عددی آن‌ها را که با ویرگول جدا شده‌اند فهرست کنید.
  • pm - شناسه روش پرداخت انتخاب شده. مهم است که اگر پارامتر 'pm' ارسال شود، فاکتور در 'حالت شفاف' ایجاد خواهد شد، یعنی خریدار صفحه فاکتور را نخواهد دید و مستقیماً به سیستم پرداخت می‌رود.
  • extra_data - یک آرایهٔ انجمنی که شامل هر دادهٔ اضافی است؛ این داده به طور کامل به فروشگاه بازگردانده می‌شود
  • shop_user_id - شناسه کاربر در فروشگاه، به صورت بدون تغییر به فروشگاه بازگردانده می‌شود
  • shop_payment_id - شناسه پرداخت در فروشگاه، به صورت تغییر نکرده به فروشگاه بازگردانده می‌شود
  • shop_name - نام فروشگاه (نمایش داده شده در صفحه فاکتور)
  • shop_payment_desc - توضیحات سفارش (نمایش داده شده در صفحه فاکتور)
  • shop_payment_remark - یادداشت‌های شما درباره این پرداخت (این یک فیلد برای هر یادداشتی است که درباره پرداخت دارید و AxtonPay آن را به جایی منتقل نمی‌کند؛ فقط در فهرست پرداخت‌ها قابل مشاهده است؛ به فروشگاه باز نمی‌گردد)
  • valid_time - بازه زمانی که فاکتور قابل پرداخت است؛ به ثانیه
  • view_time - بازه زمانی که فاکتور از طریق لینک خارجی قابل مشاهده است؛ بر حسب ثانیه؛ شمارش معکوس پس از پایان دوره 'valid_time' آغاز می‌شود
  • server_notification_method - روش ارسال اعلان‌های سرور به سرور درباره وضعیت‌های پرداخت به فروشگاه؛ مقادیر معتبر: POST, GET

برخی از تنظیمات فاکتور در صفحه تنظیمات تسویه‌حساب قرار دارند. اما مقادیری که در درخواست ارسال می‌شوند، بر این تنظیمات اولویت خواهند داشت.

پارامترهای پرداخت که می‌توان برای این فاکتور بازنویسی کرد:

  • customer_success_url - لینکی که خریدار به آن هدایت خواهد شد اگر فاکتور با موفقیت پرداخت شود (یعنی اگر وضعیت فاکتور 'paid' یا 'overpaid' باشد).
  • customer_cancel_url - لینکی که در صورت لغو پرداخت خریدار به آن هدایت خواهد شد
  • customer_fail_url - لینکی که خریدار در صورت بروز خطا در پرداخت به آن هدایت می‌شود
  • server_notification_url - لینک برای ارسال اعلان‌های سرور به سرور وضعیت پرداخت‌ها به فروشگاه

توجه: به منظور رعایت سیاست حفظ حریم خصوصی خود، معمولاً نیازی نیست که داده‌های شخصی مشتری خود را در ویژگی‌های فاکتور وارد کنید. به عنوان مثال، در پارامتر "shop_user_id" بهتر است یک شناسه انتزاعی مشتری مشخص کنید تا ایمیل یا شماره تلفن آن‌ها. همچنین در "shop_payment_desc" بهتر است اصلاً داده‌های مشتری را وارد نکنید، زیرا آن‌ها قبلاً همه چیز درباره خودشان را می‌دانند؛ در عوض، می‌توانید اطلاعاتی درباره کالاها یا خدمات پرداخت شده بنویسید، یا حتی فقط نوع عمل را ذکر کنید، به عنوان مثال "خرید" یا "شارژ موجودی".

تمام مراجع ضرورتاً با پروتکل منتقل می‌شوند.

نمونه‌ای از درخواست:

<?php
// API credentials - get it from settings of the checkout
$api_key = 'API_KEY';
$api_secret = 'API_SECRET';
// API endpoint
$api_endpoint = 'https://mp.axtonpay.com/api/v1/private/checkout';
// Current POSIX timestamp
$time = time();
// API method URL
$api_url = $api_endpoint . '/payment/create';

// Prepare POST parameters
$post_data = [
    'amount' => 4.99,
    'currency' => 'USD',
    'pms' => 'all', // visible payment methods; either 'all' or comma-separated list of selected GUIDs
    // 'pm' => '92807385', // define the certain payment method if you do not want payer to see the list of all possible payment methods

    // Below parameters are optional
    'extra_data' => ['param1'=>'value 1', 'param2'=>'value 2'],

    'shop_user_id' => '[email protected]',
    'shop_payment_id' => 'TEST-333-' . $time,
    'shop_name' => 'TEST-333 web shop',
    'shop_payment_desc' => 'TEST-333 payment description visible to payer',
    'shop_payment_remark' => 'TEST-333 payment remark for admin',

    'customer_success_url' => 'https://example.com/?status=paid-or-overpaid&once=TEST-333-' . $time, 
    'customer_cancel_url' => 'https://example.com/?status=cancelled-by-payer&once=TEST-333-' . $time,
    'customer_fail_url' => 'https://example.com/?status=error&once=TEST-333-' . $time,
    'server_notification_url' => 'https://example.com/?for=server-to-server-notificataions',
    'server_notification_method' => 'POST',
	
    'valid_time' => 60*60*24*7, // seconds
    'view_time'  => 60*60*24*21, // seconds, clock starts after ending of 'valid_time' period
];

// Prepare GET parameters
$query_string = 'time=' . $time;

// Build the request body
$request_body = json_encode($post_data); // Encode as JSON
// $request_body = http_build_query($post_data);

// Concatenate QUERY_STRING and REQUEST_BODY
$string_for_sha = $query_string . $request_body;

// Calculate the signature
$signature = hash_hmac('sha256', $string_for_sha, $api_secret);

// Prepare HTTP headers
$headers = [
    'Api-Key: ' . $api_key,
    'Sign: ' . $signature,
    'Content-Type: application/json'
];

// Initialize cURL
$ch = curl_init($api_url . '?' . $query_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request_body);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

// Execute the request
$response = curl_exec($ch);

// Close cURL
curl_close($ch);
?>

نمونه‌ای از یک پاسخ موفق هنگام درخواست ایجاد فاکتور:

{
    "status": "ok",
    "data": "invoice created",
    "pid": "HNQ5CAHM",
    "test": false,
    "created_at": "2025-12-27T08:14:55.000000Z",
    "invoice_url": "https:\/\/27375212.b88pay.com\/i\/HNQ5CAHM"
}

دریافت اطلاعات فاکتور: /api/v1/private/checkout/payment/get/{PID}

برای دریافت اطلاعاتی که نیاز دارید، با مشخص کردن PID فاکتور در انتهای URL، باید متد /api/v1/private/checkout/payment/get/{PID} را فراخوانی کنید.

پارامترهای درخواست:

  • time (الزامی) - POSIX timestamp (Unix time)

نمونه‌ای از یک خط برای نوشتن امضا:

// Full URL:
https://mp.axtonpay.com/api/v1/private/checkout/payment/get/GIKR3XPY?time=1766837343

// String for signature calculation: 
time=1766837343

نمونه‌ای از یک پاسخ:

{
    "status": "ok",
    "data": {
        "pid": "HNQ5CAHM",
        "checkout_guid": 34677320,
        "created_at": "2025-12-27 12:07:21",
        "updated_at": "2025-12-27 12:07:34",
        "data": {
            "ip": "1.2.3.4",
            "pms": "all",
            "extra_data": {
                "param1": "val1",
                "param2": "val2",
                "server_notification_url": "https:\/\/example.com\/?for=server-to-server-notificataions"
            },
            "redirect_url": "\/wait\/HNQ5CAHM",
            "customer_fail_url": "https:\/\/example.com\/?status=error&id=TEST-333-1766837240",
            "allow_change_amount": false,
            "customer_cancel_url": "https:\/\/example.com\/?status=cancelled-by-payer&id=TEST-333-1766837240",
            "customer_success_url": "https:\/\/example.com\/?status=paid-or-overpaid&id=TEST-333-1766837240"
        },
        "payment_status": 0,
        "amount": "4.99",
        "filled": "0.00",
        "currency_id": 5,
        "transparent": 1,
        "expires_at": "2026-01-03 12:07:21",
        "invisible_at": "2026-01-26 12:07:21",
        "paid_at": null,
        "confirmed_at": null,
        "shop_name": "TEST-333 web shop",
        "shop_user_id": "[email protected]",
        "shop_payment_id": "TEST-333-1766837240",
        "shop_payment_desc": "TEST-333 payment description visible to payer",
        "shop_payment_remark": "TEST-333 payment remark for merchant",
        "payment_method_id": 92807385,
        "gateway_id": 40056646,
        "payment_option_id": 297,
        "txid": null,
        "account_from": null,
        "account_to": "TEnYvbfg9YqJeaVtVHAwEvG2kmAJcTzxTh",
        "payment_option_amount": "17.865973",
        "payment_option_filled": "0.000000",
        "payment_option_currency_id": 317,
        "exchange_rates_expires_at": "2025-12-27 12:27:33",
        "test": false,
        "initiator": "api",
        "initiator_info": null,
        "payment_option": {
            "id": 297,
            "gateway_id": 40056646,
            "pm": "trx",
            "currency_id": 317,
            "name": "Tron",
            "icon": "crypto\/tron.png",
            "min_invoice": null,
            "max_invoice": null
        },
        "payment_option_currency": {
            "id": 317,
            "name": "Tron",
            "code": "TRX",
            "minor_unit": 6
        },
        "currency": {
            "id": 5,
            "name": "United States dollar",
            "code": "USD",
            "minor_unit": 2
        },
        "invoice_url": "https:\/\/27375212.b88pay.com\/i\/HNQ5CAHM"
    }
}

مقایسه مبلغ درخواست‌شده و مبلغ پرداخت‌شده

پاسخ شامل چندین مبلغ مختلف (به ارز صادر شده در فاکتور) است:

  • "amount" - مبلغ فاکتور شده،
  • "filled" - بخشی از فاکتور پرداخت شد
  • "total_filled" - مجموع پرداختی مشتری، شامل کمیسیون‌ها.

اگر "filled = amount"، پس دقیقاً به اندازه‌ای که نیاز است پرداخت می‌شود.

اگر "filled > amount"، پرداخت اضافی وجود دارد.

اگر "filled < amount"، فاکتور به طور کامل پرداخت نشده است (کم‌پرداخت).

فاکتور: پردازش اطلاعیه از AxtonPay درباره تغییر وضعیت

هر بار که وضعیت یک فاکتور تغییر می‌کند، AxtonPay یک اعلان به server_notification_url ارسال می‌کند (با استفاده از server_notification_method)

داده نمونه:

{
    "pid": "U5IB4WIO",
    "status": "3",
    "shop_user_id": "3q23g",
    "shop_payment_id": "h76r5",
    "amount": "240.00000000",
    "filled": "0.00000000",
    "fee": "0",
    "total_filled": "0.00000000",
    "currency": "DASH",
    "test": "0"
}

در پاسخ به این اطلاعیه AxtonPay انتظار دارد HTTP code 200 را دریافت کند، که دریافت موفقیت‌آمیز آن را تأیید می‌کند. در غیر این صورت، AxtonPay دوازده بار دیگر با فواصل زمانی فزاینده تلاش خواهد کرد و سپس وضعیت اطلاعیه به 'error' تغییر می‌کند (اما این بر وضعیت خود فاکتور تأثیری ندارد).

مقادیر وضعیت ممکن:

  • 0 - pending
  • 1 - paid
  • 2 - error
  • 3 - cancelled by customer
  • 4 - underpaid
  • 5 - overpaid
  • 8 - expired

وضعیت‌های پرداخت موفق 1 (paid) و 5 (overpaid) هستند؛ در صورت دریافت آنها می‌توانید خرید پرداخت شده را به مشتری منتقل کنید یا موجودی را شارژ کنید. برای پرداخت‌هایی با وضعیت 5 (overpaid)، در صورت شارژ موجودی می‌توانید موجودی را به اندازه مبلغ پرداخت شده واقعی شارژ کنید، اما در صورت فروش کالا/خدمات و وجود مبلغ زیاد مازاد پرداخت، توصیه می‌شود با پرداخت‌کننده تماس بگیرید و با او تصمیم بگیرید که چگونه با مازاد پرداخت برخورد کنید.

وضعیت تا حدی موفق 4 (underpaid) است؛ در صورت دریافت این وضعیت، امکان شارژ مجدد موجودی به میزان پرداخت واقعی دریافت شده وجود دارد. با این حال، این وضعیت نمی‌تواند برای فروش کالاها/خدمات به عنوان موفق در نظر گرفته شود.

تمام وضعیت‌های دیگر - 0 (pending), 2 (error), 3 (canceled by customer) به معنای عدم پرداخت کامل است؛ در صورت دریافت آن‌ها هیچ اقدامی برای شارژ موجودی یا فروش کالا/خدمات نباید انجام شود.

بررسی امضا

برای اطمینان از اینکه اعلان دقیقاً توسط AxtonPay ارسال شده است، لازم است قبل از اعتماد به آن، امضای اعلان دریافت شده را بررسی کنید. بررسی مشابه امضای درخواست‌های خودتان است، تنها مرحله آخر اضافه شده است، زمانی که باید امضای محاسبه‌شده را با هدر HTTP دریافت‌شده مقایسه کنید 'Sign'.

مراحل اصلی پس از دریافت اطلاعیه درباره وضعیت تغییر یافته پرداخت به شرح زیر است:

  • کل رشته آرگومان‌ها (QUERY_STRING) را از اعلان دریافتی بگیرید،
  • کل POST data (REQUEST_BODY) را از اعلان دریافتی بگیرید,
  • با استفاده از آن QUERY_STRING + REQUEST_BODY و 'Secret key' مناسب، امضا را محاسبه کنید،
  • امضای محاسبه شده را با امضایی که در هدر HTTP دریافت شده است مقایسه کنید 'Sign'،
  • اگر امضاها یکی باشند، اعلان واقعاً از AxtonPay آمده است؛
  • اگر امضاها متفاوت باشند، ممکن است تلاش پرداخت‌کننده برای تقلب باشد.

نمونه‌ای از یک خط برای تولید امضا:

// Full URL:
https://EXAMPLE.COM?time=1737027838.1237

// POST body: 
pid=ABCD5678&status=1&shop_user_id=&shop_payment_id=&amount=25.00000000&filled=25.00000000&fee=0&total_filled=25.00000000&currency=RDD&test=0

// String for signature calculation: 
time=1737027838.1237pid=ABCD5678&status=1&shop_user_id=&shop_payment_id=&amount=25.00000000&filled=25.00000000&fee=0&total_filled=25.00000000&currency=RDD&test=0

تأیید اینکه فروشگاه اطلاعات پرداخت را پردازش کرده است: /api/v1/private/checkout/payment/confirm/{PID}

این درخواست به AxtonPay ارسال شده است در پاسخ به اطلاعیه‌ای که از آن دریافت شده است. از نظر عملکردی، این تأییدی است بر اینکه فروشگاه با موفقیت اطلاعیه دریافت شده را دریافت و پردازش کرده است.

برای ارسال یک درخواست، متد /api/v1/private/checkout/payment/confirm/{PID} را فراخوانی کنید و شناسه پی‌دی فاکتور را در انتهای URL مشخص کنید.

پارامترهای درخواست:

  • time (الزامی) - POSIX timestamp (Unix time)
  • status (الزامی، عدد صحیح) - شماره وضعیت پرداخت که فروشگاه برای آن تأیید ارسال می‌کند

اگر وضعیت ارسال‌شده با وضعیت فعلی این فاکتور در سیستم مطابقت داشته باشد، AxtonPay با 'OK' پاسخ خواهد داد و اگر مطابقت نداشته باشد، با یک خطا پاسخ خواهد داد.

نمونه‌ای از یک خط برای تولید امضا:

// Full URL:
https://mp.axtonpay.com/api/v1/private/checkout/payment/confirm/ABCD5678?time=1737011414

// POST body: 
{"status":"1"}

// String for signature calculation:
time=1737011414{"status":"1"}

مثالی از یک پاسخ در صورتی که وضعیت پرداخت فعلی مشابه باشد:

{
    "status": "ok",
    "data": "\"Paid\" status notification is confirmed"
}

نمونه‌ای از پاسخ در صورتی که وضعیت پرداخت فعلی با وضعیت ارسال شده در درخواست متفاوت باشد:

{
    "status": "error",
    "message": "Something went wrong"
}

کدهای ارزی

ارزهایی که می‌توانند برای صدور فاکتور استفاده شوند.

اکثر کدهای ارزی استفاده شده به ارزهای فیات تعلق دارند و آن‌ها برابر با ISO 4217 هستند. همچنین فهرست شامل چندین ارز دیجیتال نیز می‌شود.

کد نام اعداد ده‌دهی نوع
BCH Bitcoin Cash 8 رمزارز
BLK Blackcoin 8 رمزارز
BNB Binancecoin 18 رمزارز
BTC Bitcoin 8 رمزارز
BTT BitTorrent 18 توکن کریپتو
BUSD Binance USD 18 توکن کریپتو
DAI Dai 18 توکن کریپتو
DASH Dash 8 رمزارز
DOGE Dogecoin 8 رمزارز
ETC Ethereum Classic 18 رمزارز
ETH Ethereum 18 رمزارز
LTC Litecoin 8 رمزارز
NLG Gulden 8 رمزارز
RDD ReddCoin 8 رمزارز
TRX Tron 6 رمزارز
USDC USD Coin 6 توکن کریپتو
USDD Decentralized USD 18 توکن کریپتو
USDT Tether USDT 6 توکن کریپتو
VTC Vertcoin 8 رمزارز
XVG Verge 8 رمزارز
AED United Arab Emirates dirham 2 ارز فیات
AFN Afghan afghani 2 ارز فیات
ALL Albanian lek 2 ارز فیات
AMD Armenian dram 2 ارز فیات
ANG Netherlands Antillean guilder 2 ارز فیات
AOA Angolan kwanza 2 ارز فیات
ARS Argentine peso 2 ارز فیات
AUD Australian dollar 2 ارز فیات
AWG Aruban florin 2 ارز فیات
AZN Azerbaijani manat 2 ارز فیات
BAM Bosnia and Herzegovina convertible mark 2 ارز فیات
BBD Barbados dollar 2 ارز فیات
BDT Bangladeshi taka 2 ارز فیات
BGN Bulgarian lev 2 ارز فیات
BHD Bahraini dinar 3 ارز فیات
BIF Burundian franc 2 ارز فیات
BMD Bermudian dollar 2 ارز فیات
BND Brunei dollar 2 ارز فیات
BOB Boliviano 2 ارز فیات
BRL Brazilian real 2 ارز فیات
BSD Bahamian dollar 2 ارز فیات
BTN Bhutanese ngultrum 2 ارز فیات
BWP Botswana pula 2 ارز فیات
BYN Belarusian ruble 2 ارز فیات
BZD Belize dollar 2 ارز فیات
CAD Canadian dollar 2 ارز فیات
CDF Congolese franc 2 ارز فیات
CHF Swiss franc 2 ارز فیات
CLP Chilean peso 2 ارز فیات
CNY Renminbi (Chinese) yuan 2 ارز فیات
COP Colombian peso 2 ارز فیات
CRC Costa Rican colon 2 ارز فیات
CUC Cuban convertible peso 2 ارز فیات
CUP Cuban peso 2 ارز فیات
CVE Cape Verde escudo 2 ارز فیات
CZK Czech koruna 2 ارز فیات
DJF Djiboutian franc 2 ارز فیات
DKK Danish krone 2 ارز فیات
DOP Dominican peso 2 ارز فیات
DZD Algerian dinar 2 ارز فیات
EGP Egyptian pound 2 ارز فیات
ERN Eritrean nakfa 2 ارز فیات
ETB Ethiopian birr 2 ارز فیات
EUR Euro 2 ارز فیات
FJD Fiji dollar 2 ارز فیات
FKP Falkland Islands pound 2 ارز فیات
GBP Pound sterling 2 ارز فیات
GEL Georgian lari 2 ارز فیات
GHS Ghanaian cedi 2 ارز فیات
GIP Gibraltar pound 2 ارز فیات
GMD Gambian dalasi 2 ارز فیات
GNF Guinean franc 0 ارز فیات
GTQ Guatemalan quetzal 2 ارز فیات
GYD Guyanese dollar 2 ارز فیات
HKD Hong Kong dollar 2 ارز فیات
HNL Honduran lempira 2 ارز فیات
HRK Croatian kuna 2 ارز فیات
HTG Haitian gourde 2 ارز فیات
HUF Hungarian forint 2 ارز فیات
IDR Indonesian rupiah 2 ارز فیات
ILS Israeli new shekel 2 ارز فیات
INR Indian rupee 2 ارز فیات
IQD Iraqi dinar 3 ارز فیات
IRR Iranian rial 2 ارز فیات
ISK Icelandic krona 2 ارز فیات
JMD Jamaican dollar 2 ارز فیات
JOD Jordanian dinar 3 ارز فیات
JPY Japanese yen 3 ارز فیات
KES Kenyan shilling 2 ارز فیات
KGS Kyrgyzstani som 2 ارز فیات
KHR Cambodian riel 2 ارز فیات
KMF Comoro franc 2 ارز فیات
KPW North Korean won 2 ارز فیات
KRW South Korean won 2 ارز فیات
KWD Kuwaiti dinar 3 ارز فیات
KYD Cayman Islands dollar 2 ارز فیات
KZT Kazakhstani tenge 2 ارز فیات
LAK Lao kip 2 ارز فیات
LBP Lebanese pound 2 ارز فیات
LKR Sri Lankan rupee 2 ارز فیات
LRD Liberian dollar 2 ارز فیات
LSL Lesotho loti 2 ارز فیات
LYD Libyan dinar 3 ارز فیات
MAD Moroccan dirham 2 ارز فیات
MDL Moldovan leu 2 ارز فیات
MGA Malagasy ariary 2 ارز فیات
MKD Macedonian denar 2 ارز فیات
MMK Myanmar kyat 2 ارز فیات
MNT Mongolian togrog 2 ارز فیات
MOP Macanese pataca 2 ارز فیات
MRU Mauritanian ouguiya 2 ارز فیات
MUR Mauritian rupee 2 ارز فیات
MVR Maldivian rufiyaa 2 ارز فیات
MWK Malawian kwacha 2 ارز فیات
MXN Mexican peso 2 ارز فیات
MYR Malaysian ringgit 2 ارز فیات
MZN Mozambican metical 2 ارز فیات
NAD Namibian dollar 2 ارز فیات
NGN Nigerian naira 2 ارز فیات
NIO Nicaraguan cordoba 2 ارز فیات
NOK Norwegian krone 2 ارز فیات
NPR Nepalese rupee 2 ارز فیات
NZD New Zealand dollar 2 ارز فیات
OMR Omani rial 3 ارز فیات
PAB Panamanian balboa 2 ارز فیات
PEN Peruvian sol 2 ارز فیات
PGK Papua New Guinean kina 2 ارز فیات
PHP Philippine peso 2 ارز فیات
PKR Pakistani rupee 2 ارز فیات
PLN Polish zloty 2 ارز فیات
PYG Paraguayan guarani 2 ارز فیات
QAR Qatari riyal 2 ارز فیات
RON Romanian leu 2 ارز فیات
RSD Serbian dinar 2 ارز فیات
RUB Russian ruble 2 ارز فیات
RWF Rwandan franc 2 ارز فیات
SAR Saudi riyal 2 ارز فیات
SBD Solomon Islands dollar 2 ارز فیات
SCR Seychelles rupee 2 ارز فیات
SDG Sudanese pound 2 ارز فیات
SEK Swedish krona/kronor 2 ارز فیات
SGD Singapore dollar 2 ارز فیات
SHP Saint Helena pound 2 ارز فیات
SLL Sierra Leonean leone 2 ارز فیات
SOS Somali shilling 2 ارز فیات
SRD Surinamese dollar 2 ارز فیات
SSP South Sudanese pound 2 ارز فیات
STN Sao Tome and Pricipe dobra 2 ارز فیات
SVC Salvadoran colon 2 ارز فیات
SYP Syrian pound 2 ارز فیات
SZL Swazi lilangeni 2 ارز فیات
THB Thai baht 2 ارز فیات
TJS Tajikistani somoni 2 ارز فیات
TMT Turkmenistan manat 2 ارز فیات
TND Tunisian dinar 3 ارز فیات
TOP Tongan paanga 2 ارز فیات
TRY Turkish lira 2 ارز فیات
TTD Trinidad and Tobago dollar 2 ارز فیات
TWD New Taiwan dollar 2 ارز فیات
TZS Tanzanian shilling 2 ارز فیات
UAH Ukrainian hryvnia 2 ارز فیات
UGX Ugandan shilling 0 ارز فیات
USD United States dollar 2 ارز فیات
UYU Uruguayan peso 2 ارز فیات
UZS Uzbekistan som 2 ارز فیات
VES Venezuelan bolivar soberano 2 ارز فیات
VND Vietnamese dong 2 ارز فیات
VUV Vanuatu vatu 0 ارز فیات
WST Samoan tala 2 ارز فیات
XAF CFA franc BEAC 3 ارز فیات
XCD East Caribbean dollar 2 ارز فیات
XOF CFA franc BCEAO 2 ارز فیات
XPF CFP franc (franc Pacifique) 3 ارز فیات
XTS کدهایی که به‌طور خاص برای مقاصد آزمایشی رزرو شده‌اند 2 کد رزرو شده
XXX کدهای اختصاص داده شده برای تراکنش‌هایی که هیچ ارزی در آن دخیل نیست 2 کد رزرو شده
YER Yemeni rial 2 ارز فیات
ZAR South African rand 2 ارز فیات
ZMW Zambian kwacha 2 ارز فیات
ZWL Zimbabwean dollar 2 ارز فیات