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}').
Έγκριση αιτήσεων
Για να εξουσιοδοτηθεί ένα αίτημα, είναι απαραίτητο να υπολογιστεί ένα Hash από μια συμβολοσειρά που σχηματίζεται με ειδικό τρόπο. Η συμβολοσειρά αποτελείται από την συνένωση (ένωση) των παραμέτρων URL (QUERY_STRING) και του σώματος του αιτήματος POST (REQUEST_BODY). Είναι σημαντικό όλα τα στοιχεία να ληφθούν ακριβώς με τη μορφή που θα μεταδοθούν στον διακομιστή. Οι παράμετροι URL (QUERY_STRING) πρέπει να ληφθούν από το URL ως μία ενιαία γραμμή, χωρίς αλλαγή της σειράς των παραμέτρων και χωρίς να αφαιρεθεί οποιοδήποτε στοιχείο. Το σώμα του αιτήματος POST (REQUEST_BODY) πρέπει επίσης να χρησιμοποιηθεί χωρίς καμία τροποποίηση, συμπεριλαμβανομένου του ότι δεν πρέπει να αφαιρεθούν από αυτό εισαγωγικά, κενά, αγκύλες ή διακοπές γραμμής.
Στις περιπτώσεις ενός κενό POST σώματος αιτήματος, και στην περίπτωση κενών παραμέτρων URL, εκείνο το στοιχείο θα είναι απλώς κενή συμβολοσειρά.
Η ακολουθία των δεδομένων στο αίτημα υπογραφής: QUERY_STRING πρώτα, μετά τα POST δεδομένα. Δεν πρέπει να εισάγετε κανένα σημείο σύνδεσης μεταξύ τους, απλώς συνενώστε τις δύο συμβολοσειρές κειμένου.
Για άλλη μια φορά, κάθε σύμβολο είναι σημαντικό. Δεν πρέπει να προσθέσετε ή να αφαιρέσετε ούτε ένα κενό ή σύμβολο νέας γραμμής. Απλώς χρησιμοποιήστε τα ακατέργαστα δεδομένα που λαμβάνονται από τον διακομιστή.
Ένα SHA-256 hash με το κλειδί 'Secret key' λαμβάνεται από τη προκύπτουσα συμβολοσειρά και χρησιμοποιείται ως το δεύτερο όρισμα της συνάρτησης hash_hmac().
Είναι υποχρεωτικό να περάσετε την παράμετρο 'time' που περιέχει το τρέχον POSIX timestamp (Unix time).
Αυτή η υπογραφή είναι έγκυρη για 24 ώρες. Εάν η τιμή της παραμέτρου 'time' διαφέρει από την τρέχουσα ώρα του διακομιστή κατά περισσότερο από 24 ώρες (είτε προς τα εμπρός είτε προς τα πίσω), το αίτημα θα αποτύχει ακόμη και αν η υπογραφή υπολογιστεί χωρίς σφάλματα.
Αν το πάνελ του εμπόρου έχει αποδεχθεί ένα αίτημα με κάποια υπογραφή, αυτή η υπογραφή δεν μπορεί να χρησιμοποιηθεί ξανά, ακόμη και για να σταλεί το αίτημα με τις ίδιες παραμέτρους (αυτό περιλαμβάνει την παράμετρο 'time').
Το αποτέλεσμα του hash περνάει στην κεφαλίδα 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 αιτήματος.
Μεταβλητές Boolean
Το API αναμένει να λάβει '0' ή '1' σε Boolean μεταβλητές, αλλά λόγω της έμμεσης μετατροπής τύπων, οποιοδήποτε κείμενο θα θεωρείται ως '1', ακόμη και η λέξη 'false'. Έτσι, για να ορίσετε ρητά μια τιμή 'FALSE' για μια Boolean μεταβλητή, πρέπει να της περάσετε είτε την τιμή '0' είτε μια κενή συμβολοσειρά.
Δεκαδικός διαχωριστής
Μόνο η δεκαδική τελεία χρησιμοποιείται ως δεκαδικός διαχωριστής στους αριθμούς.
Μεγέθος χαρακτήρων στις παραμέτρους
Με λίγες εξαιρέσεις, όλοι οι παράμετροι είναι ευαίσθητοι σε πεζά-κεφαλαία.
Διεύθυνση URL επανάκλησης
Στο πάνελ διαχείρισης του AxtonPay, στη σελίδα ρυθμίσεων ολοκλήρωσης αγοράς, είναι δυνατό να οριστούν διευθύνσεις URL του καταστήματος για τη λήψη ειδοποιήσεων server-server από το 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", είναι προτιμότερο να καθορίσετε ένα αφηρημένο αναγνωριστικό πελάτη αντί για το email ή τον αριθμό τηλεφώνου τους. Επίσης, στο "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 '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"
}
Κωδικοί νομισμάτων
Τα νομίσματα που μπορούν να χρησιμοποιηθούν για τη δημιουργία ενός τιμολογίου.
Οι περισσότεροι από τους χρησιμοποιούμενους κωδικούς νομισμάτων ανήκουν σε νομίσματα fiat, και είναι ίσοι με το 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 | Νόμισμα fiat |
| AFN | Afghan afghani | 2 | Νόμισμα fiat |
| ALL | Albanian lek | 2 | Νόμισμα fiat |
| AMD | Armenian dram | 2 | Νόμισμα fiat |
| ANG | Netherlands Antillean guilder | 2 | Νόμισμα fiat |
| AOA | Angolan kwanza | 2 | Νόμισμα fiat |
| ARS | Argentine peso | 2 | Νόμισμα fiat |
| AUD | Australian dollar | 2 | Νόμισμα fiat |
| AWG | Aruban florin | 2 | Νόμισμα fiat |
| AZN | Azerbaijani manat | 2 | Νόμισμα fiat |
| BAM | Bosnia and Herzegovina convertible mark | 2 | Νόμισμα fiat |
| BBD | Barbados dollar | 2 | Νόμισμα fiat |
| BDT | Bangladeshi taka | 2 | Νόμισμα fiat |
| BGN | Bulgarian lev | 2 | Νόμισμα fiat |
| BHD | Bahraini dinar | 3 | Νόμισμα fiat |
| BIF | Burundian franc | 2 | Νόμισμα fiat |
| BMD | Bermudian dollar | 2 | Νόμισμα fiat |
| BND | Brunei dollar | 2 | Νόμισμα fiat |
| BOB | Boliviano | 2 | Νόμισμα fiat |
| BRL | Brazilian real | 2 | Νόμισμα fiat |
| BSD | Bahamian dollar | 2 | Νόμισμα fiat |
| BTN | Bhutanese ngultrum | 2 | Νόμισμα fiat |
| BWP | Botswana pula | 2 | Νόμισμα fiat |
| BYN | Belarusian ruble | 2 | Νόμισμα fiat |
| BZD | Belize dollar | 2 | Νόμισμα fiat |
| CAD | Canadian dollar | 2 | Νόμισμα fiat |
| CDF | Congolese franc | 2 | Νόμισμα fiat |
| CHF | Swiss franc | 2 | Νόμισμα fiat |
| CLP | Chilean peso | 2 | Νόμισμα fiat |
| CNY | Renminbi (Chinese) yuan | 2 | Νόμισμα fiat |
| COP | Colombian peso | 2 | Νόμισμα fiat |
| CRC | Costa Rican colon | 2 | Νόμισμα fiat |
| CUC | Cuban convertible peso | 2 | Νόμισμα fiat |
| CUP | Cuban peso | 2 | Νόμισμα fiat |
| CVE | Cape Verde escudo | 2 | Νόμισμα fiat |
| CZK | Czech koruna | 2 | Νόμισμα fiat |
| DJF | Djiboutian franc | 2 | Νόμισμα fiat |
| DKK | Danish krone | 2 | Νόμισμα fiat |
| DOP | Dominican peso | 2 | Νόμισμα fiat |
| DZD | Algerian dinar | 2 | Νόμισμα fiat |
| EGP | Egyptian pound | 2 | Νόμισμα fiat |
| ERN | Eritrean nakfa | 2 | Νόμισμα fiat |
| ETB | Ethiopian birr | 2 | Νόμισμα fiat |
| EUR | Euro | 2 | Νόμισμα fiat |
| FJD | Fiji dollar | 2 | Νόμισμα fiat |
| FKP | Falkland Islands pound | 2 | Νόμισμα fiat |
| GBP | Pound sterling | 2 | Νόμισμα fiat |
| GEL | Georgian lari | 2 | Νόμισμα fiat |
| GHS | Ghanaian cedi | 2 | Νόμισμα fiat |
| GIP | Gibraltar pound | 2 | Νόμισμα fiat |
| GMD | Gambian dalasi | 2 | Νόμισμα fiat |
| GNF | Guinean franc | 0 | Νόμισμα fiat |
| GTQ | Guatemalan quetzal | 2 | Νόμισμα fiat |
| GYD | Guyanese dollar | 2 | Νόμισμα fiat |
| HKD | Hong Kong dollar | 2 | Νόμισμα fiat |
| HNL | Honduran lempira | 2 | Νόμισμα fiat |
| HRK | Croatian kuna | 2 | Νόμισμα fiat |
| HTG | Haitian gourde | 2 | Νόμισμα fiat |
| HUF | Hungarian forint | 2 | Νόμισμα fiat |
| IDR | Indonesian rupiah | 2 | Νόμισμα fiat |
| ILS | Israeli new shekel | 2 | Νόμισμα fiat |
| INR | Indian rupee | 2 | Νόμισμα fiat |
| IQD | Iraqi dinar | 3 | Νόμισμα fiat |
| IRR | Iranian rial | 2 | Νόμισμα fiat |
| ISK | Icelandic krona | 2 | Νόμισμα fiat |
| JMD | Jamaican dollar | 2 | Νόμισμα fiat |
| JOD | Jordanian dinar | 3 | Νόμισμα fiat |
| JPY | Japanese yen | 3 | Νόμισμα fiat |
| KES | Kenyan shilling | 2 | Νόμισμα fiat |
| KGS | Kyrgyzstani som | 2 | Νόμισμα fiat |
| KHR | Cambodian riel | 2 | Νόμισμα fiat |
| KMF | Comoro franc | 2 | Νόμισμα fiat |
| KPW | North Korean won | 2 | Νόμισμα fiat |
| KRW | South Korean won | 2 | Νόμισμα fiat |
| KWD | Kuwaiti dinar | 3 | Νόμισμα fiat |
| KYD | Cayman Islands dollar | 2 | Νόμισμα fiat |
| KZT | Kazakhstani tenge | 2 | Νόμισμα fiat |
| LAK | Lao kip | 2 | Νόμισμα fiat |
| LBP | Lebanese pound | 2 | Νόμισμα fiat |
| LKR | Sri Lankan rupee | 2 | Νόμισμα fiat |
| LRD | Liberian dollar | 2 | Νόμισμα fiat |
| LSL | Lesotho loti | 2 | Νόμισμα fiat |
| LYD | Libyan dinar | 3 | Νόμισμα fiat |
| MAD | Moroccan dirham | 2 | Νόμισμα fiat |
| MDL | Moldovan leu | 2 | Νόμισμα fiat |
| MGA | Malagasy ariary | 2 | Νόμισμα fiat |
| MKD | Macedonian denar | 2 | Νόμισμα fiat |
| MMK | Myanmar kyat | 2 | Νόμισμα fiat |
| MNT | Mongolian togrog | 2 | Νόμισμα fiat |
| MOP | Macanese pataca | 2 | Νόμισμα fiat |
| MRU | Mauritanian ouguiya | 2 | Νόμισμα fiat |
| MUR | Mauritian rupee | 2 | Νόμισμα fiat |
| MVR | Maldivian rufiyaa | 2 | Νόμισμα fiat |
| MWK | Malawian kwacha | 2 | Νόμισμα fiat |
| MXN | Mexican peso | 2 | Νόμισμα fiat |
| MYR | Malaysian ringgit | 2 | Νόμισμα fiat |
| MZN | Mozambican metical | 2 | Νόμισμα fiat |
| NAD | Namibian dollar | 2 | Νόμισμα fiat |
| NGN | Nigerian naira | 2 | Νόμισμα fiat |
| NIO | Nicaraguan cordoba | 2 | Νόμισμα fiat |
| NOK | Norwegian krone | 2 | Νόμισμα fiat |
| NPR | Nepalese rupee | 2 | Νόμισμα fiat |
| NZD | New Zealand dollar | 2 | Νόμισμα fiat |
| OMR | Omani rial | 3 | Νόμισμα fiat |
| PAB | Panamanian balboa | 2 | Νόμισμα fiat |
| PEN | Peruvian sol | 2 | Νόμισμα fiat |
| PGK | Papua New Guinean kina | 2 | Νόμισμα fiat |
| PHP | Philippine peso | 2 | Νόμισμα fiat |
| PKR | Pakistani rupee | 2 | Νόμισμα fiat |
| PLN | Polish zloty | 2 | Νόμισμα fiat |
| PYG | Paraguayan guarani | 2 | Νόμισμα fiat |
| QAR | Qatari riyal | 2 | Νόμισμα fiat |
| RON | Romanian leu | 2 | Νόμισμα fiat |
| RSD | Serbian dinar | 2 | Νόμισμα fiat |
| RUB | Russian ruble | 2 | Νόμισμα fiat |
| RWF | Rwandan franc | 2 | Νόμισμα fiat |
| SAR | Saudi riyal | 2 | Νόμισμα fiat |
| SBD | Solomon Islands dollar | 2 | Νόμισμα fiat |
| SCR | Seychelles rupee | 2 | Νόμισμα fiat |
| SDG | Sudanese pound | 2 | Νόμισμα fiat |
| SEK | Swedish krona/kronor | 2 | Νόμισμα fiat |
| SGD | Singapore dollar | 2 | Νόμισμα fiat |
| SHP | Saint Helena pound | 2 | Νόμισμα fiat |
| SLL | Sierra Leonean leone | 2 | Νόμισμα fiat |
| SOS | Somali shilling | 2 | Νόμισμα fiat |
| SRD | Surinamese dollar | 2 | Νόμισμα fiat |
| SSP | South Sudanese pound | 2 | Νόμισμα fiat |
| STN | Sao Tome and Pricipe dobra | 2 | Νόμισμα fiat |
| SVC | Salvadoran colon | 2 | Νόμισμα fiat |
| SYP | Syrian pound | 2 | Νόμισμα fiat |
| SZL | Swazi lilangeni | 2 | Νόμισμα fiat |
| THB | Thai baht | 2 | Νόμισμα fiat |
| TJS | Tajikistani somoni | 2 | Νόμισμα fiat |
| TMT | Turkmenistan manat | 2 | Νόμισμα fiat |
| TND | Tunisian dinar | 3 | Νόμισμα fiat |
| TOP | Tongan paanga | 2 | Νόμισμα fiat |
| TRY | Turkish lira | 2 | Νόμισμα fiat |
| TTD | Trinidad and Tobago dollar | 2 | Νόμισμα fiat |
| TWD | New Taiwan dollar | 2 | Νόμισμα fiat |
| TZS | Tanzanian shilling | 2 | Νόμισμα fiat |
| UAH | Ukrainian hryvnia | 2 | Νόμισμα fiat |
| UGX | Ugandan shilling | 0 | Νόμισμα fiat |
| USD | United States dollar | 2 | Νόμισμα fiat |
| UYU | Uruguayan peso | 2 | Νόμισμα fiat |
| UZS | Uzbekistan som | 2 | Νόμισμα fiat |
| VES | Venezuelan bolivar soberano | 2 | Νόμισμα fiat |
| VND | Vietnamese dong | 2 | Νόμισμα fiat |
| VUV | Vanuatu vatu | 0 | Νόμισμα fiat |
| WST | Samoan tala | 2 | Νόμισμα fiat |
| XAF | CFA franc BEAC | 3 | Νόμισμα fiat |
| XCD | East Caribbean dollar | 2 | Νόμισμα fiat |
| XOF | CFA franc BCEAO | 2 | Νόμισμα fiat |
| XPF | CFP franc (franc Pacifique) | 3 | Νόμισμα fiat |
| XTS | Κωδικοί που προορίζονται ειδικά για σκοπούς δοκιμών | 2 | Κωδικός κρατημένος |
| XXX | Οι κωδικοί που ανατίθενται για συναλλαγές όπου δεν εμπλέκεται νόμισμα | 2 | Κωδικός κρατημένος |
| YER | Yemeni rial | 2 | Νόμισμα fiat |
| ZAR | South African rand | 2 | Νόμισμα fiat |
| ZMW | Zambian kwacha | 2 | Νόμισμα fiat |
| ZWL | Zimbabwean dollar | 2 | Νόμισμα fiat |
