AxtonPay API

Document version: 0.9

ข้อมูลทั่วไป

จุดเชื่อมต่อ API

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

Content-type

API รับคำขอ HTTP ที่มี 2 ประเภทเนื้อหา: 'application/x-www-form-urlencoded', 'application/json'.

ส่วนหัว HTTP ควรพอดีกับเนื้อหาของ POST ส่วนเนื้อหา

ตัวย่อและคำนิยาม

  • {PID} - รหัสของใบแจ้งหนี้ โดยปกติจะเป็นลำดับอักขระตัวเลขและตัวอักษร 8 หลักที่ไม่ซ้ำกัน
  • 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) ปัจจุบัน

ลายเซ็นนี้ใช้ได้เป็นเวลา 24 ชั่วโมง หากค่าของพารามิเตอร์ 'time' แตกต่างจากเวลาของเซิร์ฟเวอร์ปัจจุบันเกิน 24 ชั่วโมง (ไม่ว่าจะไปข้างหน้าหรือถอยหลัง) คำขอจะล้มเหลวแม้ว่าการคำนวณลายเซ็นจะไม่มีข้อผิดพลาด

ถ้าพาเนลของพ่อค้ารับคำขอที่มีลายเซ็นบางอย่าง ลายเซ็นนั้นไม่สามารถใช้ซ้ำได้ แม้แต่การส่งคำขอด้วยพารามิเตอร์เดียวกัน (ซึ่งรวมถึงพารามิเตอร์ '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' ในตัวแปร Boolean แต่เนื่องจากการแปลงชนิดข้อมูลโดยปริยาย ข้อความใดๆ ก็จะถูกจัดว่าเป็น '1' แม้กระทั่งคำว่า 'false' ดังนั้น เพื่อกำหนดค่า 'FALSE' ให้กับตัวแปร Boolean อย่างชัดเจน คุณต้องส่งค่าให้กับมันเป็น '0' หรือสตริงว่าง

ตัวคั่นทศนิยม

มีเพียงจุดทศนิยมเท่านั้นที่ใช้เป็นตัวคั่นทศนิยมในตัวเลข

ตัวพิมพ์ในพารามิเตอร์

ยกเว้นบางกรณี พารามิเตอร์ทั้งหมดจะระบุอักษรใหญ่-เล็กอย่างเคร่งครัด

URL การเรียกกลับ

ในแผงควบคุมผู้ดูแลของ AxtonPay บนหน้าการตั้งค่าการชำระเงิน สามารถตั้งค่า URL ของร้านค้าเพื่อรับการแจ้งเตือนจากเซิร์ฟเวอร์ถึงเซิร์ฟเวอร์จาก AxtonPay รวมถึง URL สำหรับเปลี่ยนเส้นทางผู้ซื้อหลังจากการชำระเงินใบแจ้งหนี้หรือการยกเลิก รวมถึงกรณีเกิดข้อผิดพลาด

URL เหล่านี้สามารถถูกแทนที่ในการร้องขอสร้างใบแจ้งหนี้ได้

วิธีของ AxtonPay API

การสร้างใบแจ้งหนี้: /api/v1/private/checkout/payment/create

เมธอด /api/v1/private/checkout/payment/create เริ่มกระบวนการสร้างใบแจ้งหนี้

หากสำเร็จ วิธีการนี้จะคืนลิงก์ ('invoice_url') ซึ่งคุณควรส่งต่อลูกค้าเพื่อทำการชำระเงิน

พารามิเตอร์ใบแจ้งหนี้ของตนเอง:

  • time (จำเป็น) - POSIX timestamp (Unix time)
  • amount (จำเป็น) - จำนวนเงินที่ต้องชำระ (ราคาของสินค้า หรือบริการที่ร้านค้าต้องการได้รับ)
  • currency (จำเป็น) - รหัสสกุลเงิน 3 ตัวอักษรตาม 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}

ในการรับข้อมูลที่คุณต้องการ ให้เรียกใช้เมธอด /api/v1/private/checkout/payment/get/{PID} โดยระบุ PID ของใบแจ้งหนี้ที่ปลาย URL

พารามิเตอร์ของคำขอ:

  • 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 จะลองใหม่อีก 12 ครั้ง โดยเว้นระยะเพิ่มขึ้นเรื่อย ๆ และจากนั้นสถานะการแจ้งเตือนจะเปลี่ยนเป็น '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 header ที่ได้รับ '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} โดยระบุ 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 สกุลเงินฟีแอท