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¤cy=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¤cy=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¤cy=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¤cy=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¤cy=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¤cy=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 | สกุลเงินฟีแอท |
