Μετάβαση στο περιεχόμενο
Μετάβαση στο περιεχόμενο

ΠΡΟΓΡΑΜΜΑΤΙΣΤΕΣ

Τεκμηρίωση API είσπραξης πληρωμών

Δημιουργήστε μια πληρωμή, στείλτε τον πελάτη στη σελίδα πληρωμής και λάβετε το αποτέλεσμα με webhook ή ερώτημα.

  • Βασικό URLhttps://www.cryptoavans.com/api/v3
  • Έκδοση API3.0.0

Πρώτα βήματα

Περιβάλλον

Δοκιμάστε χωρίς κίνηση πραγματικών χρημάτων.

Πραγματικές πληρωμές. Απαιτείται live κλειδί.

Πρώτα βήματα

Από τον νέο λογαριασμό στην πρώτη live πληρωμή σε τέσσερα βήματα.

  1. Αποκτήστε τα κλειδιά σας

    Δημιουργήστε λογαριασμό από το “Εγγραφή” ή συνδεθείτε, ανοίξτε το “API Key & Ενσωμάτωση” και δημιουργήστε ένα κλειδί sandbox. Προσθέστε πρώτα την IP του διακομιστή σας και μια διεύθυνση webhook. Λεπτομέρειες: Απόκτηση κλειδιού.

  2. Δημιουργήστε πληρωμή

    Στείλτε ένα υπογεγραμμένο POST /api/v3/payments (υπάρχει κώδικας παραδείγματος) και οδηγήστε τον πελάτη στο payment_url που επιστρέφεται. Τα πεδία και οι κανόνες βρίσκονται στις Πληρωμές.

  3. Δοκιμάστε και λάβετε το αποτέλεσμα

    Ολοκληρώστε μια δοκιμαστική πληρωμή με δοκιμαστική κάρτα και δείτε την στο “Παραγγελίες API Sandbox”. Το webhook σας λαμβάνει ένα υπογεγραμμένο payment.paid (Webhooks)· μπορείτε επίσης να διαβάσετε το GET /api/v3/payments/{code}. Ολοκληρώστε την παραγγελία μόνο όταν η κατάσταση είναι paid.

  4. Περάστε σε live

    Μετά την πρώτη παραγγελία sandbox, δημιουργήστε το live κλειδί, προσθέστε τη live λίστα IP και τη διεύθυνση webhook και ολοκληρώστε τη λίστα ελέγχου live.

Συμβάσεις

Βασικό URL
https://www.cryptoavans.com/api/v3
Μορφή
application/json · UTF-8
Ποσά
Δεκαδικές συμβολοσειρές: τα ποσά σε συμβατικά νομίσματα έχουν 2 δεκαδικά ψηφία (π.χ. "250.00"). Το usdt_amount έχει 6.
Νομίσματα
USD EUR AED TRY
Χρονοσημάνσεις
UTC · ISO 8601
Γλώσσα σφαλμάτων
Ορίζεται με την κεφαλίδα Accept-Language. Η προεπιλογή είναι τα τουρκικά.

Το υπόλοιπο, οι επιστροφές, οι αναλήψεις, οι αμφισβητήσεις και οι παραδόσεις webhook περιγράφονται στη σελίδα Λειτουργίες λογαριασμού.

Για να συλλέγετε την κάρτα στη δική σας φόρμα πληρωμής, δείτε το Direct API (v4).

Απόκτηση κλειδιού

Το sandbox και η παραγωγή έχουν ξεχωριστά κλειδιά, λίστες IP και διευθύνσεις webhook. Και τα δύο κλειδιά μπορούν να είναι ενεργά ταυτόχρονα.

  1. Ανοίξτε τη σελίδα “API Key & Ενσωμάτωση”.

  2. Αντιγράψτε τον 6ψήφιο αριθμό λογαριασμού στην κορυφή. Στείλτε τον ως X-CAV-Account-No στα υπογεγραμμένα αιτήματα.

  3. Στο “Δοκιμές”, προσθέστε τη δημόσια IP του διακομιστή στη “Λίστα επιτρεπόμενων IP” με το “Προσθήκη IP”. Εισαγάγετε τις διευθύνσεις IPv4 ή IPv6 μία κάθε φορά. Δεν υποστηρίζονται εύρη CIDR.

  4. Συμπληρώστε μια δημόσια διεύθυνση HTTPS στο “Διεύθυνση webhook HTTPS”. Είναι υποχρεωτική και αποθηκεύεται κατά τη δημιουργία του κλειδιού. Αργότερα, αλλάξτε τη με το “Αποθήκευση webhook”, χωρίς ανανέωση κλειδιού.

  5. Πατήστε “Δημιουργία κλειδιού”. Αποθηκεύστε το κλειδί API και το μυστικό κλειδί, επιλέξτε “Αποθήκευσα με ασφάλεια το μυστικό κλειδί.” και πατήστε “Αποθήκευση, κλείσιμο”.

Η ενότητα live ξεκλειδώνει αφού δημιουργήσετε τουλάχιστον μία παραγγελία sandbox. Δεν χρειάζεται να ολοκληρωθεί η πληρωμή.

  1. Δημιουργήστε τουλάχιστον μία παραγγελία με το κλειδί sandbox (POST /api/v3/payments). Στον πίνακα ξεκλειδώνει η ενότητα live.

  2. Στην ενότητα live, προσθέστε τις διευθύνσεις IP των διακομιστών παραγωγής σας στη “Λίστα επιτρεπόμενων IP”. Η λίστα είναι ξεχωριστή από τη λίστα sandbox. Όσο είναι κενή, απορρίπτεται κάθε αίτημα live.

  3. Εισαγάγετε στο πεδίο “Διεύθυνση webhook HTTPS” τη διεύθυνση webhook HTTPS για το live. Αποθηκεύεται μαζί με το κλειδί στο επόμενο βήμα.

  4. Πατήστε “Δημιουργία κλειδιού” και αποθηκεύστε το live μυστικό κλειδί στον διακομιστή σας.

  5. Ρυθμίστε το κλειδί API παραγωγής και το μυστικό κλειδί στην ενσωμάτωση. Η βασική διεύθυνση API και η μορφή των αιτημάτων παραμένουν ίδιες.

Λίστα επιτρεπόμενων IP

Τα αιτήματα γίνονται δεκτά μόνο από διευθύνσεις IP της λίστας επιτρεπόμενων. Ένα αίτημα από οποιαδήποτε άλλη διεύθυνση απορρίπτεται με 403 (9000012) και δεν εκτελείται καμία ενέργεια.

  • Η λίστα είναι υποχρεωτική. Το sandbox και το live έχουν ξεχωριστές λίστες και δεν μπορεί να δημιουργηθεί κλειδί όσο η λίστα του συγκεκριμένου περιβάλλοντος είναι κενή.
  • Εισάγονται μόνο μεμονωμένες διευθύνσεις IPv4 ή IPv6· δεν υπάρχουν εύρη (CIDR). Αν ο διακομιστής σας συνδέεται προς τα έξω και με IPv4 και με IPv6, προσθέστε και τις δύο.
  • Ισχύει η δημόσια διεύθυνση από την οποία ο διακομιστής σας συνδέεται προς τα έξω. Οι ιδιωτικές διευθύνσεις (10.x, 192.168.x) δεν χρησιμεύουν· αν βρίσκεστε πίσω από NAT ή proxy, προσθέστε τη διεύθυνση εξόδου του.
  • Πατήστε “Αφαίρεση IP” δίπλα στη διεύθυνση και επιβεβαιώστε. Για να αφαιρέσετε την τελευταία IP με ενεργό κλειδί, προσθέστε πρώτα άλλη διεύθυνση ή ανακαλέστε το κλειδί.
  • Οι αλλαγές ισχύουν αμέσως. Δεν χρειάζεται να ανανεώσετε το κλειδί.

Προσθέστε κάθε διεύθυνση από την οποία δοκιμάζετε, όπως έναν διακομιστή ανάπτυξης ή τη διεύθυνση εξόδου του γραφείου σας.

Προσθέστε τις διευθύνσεις των διακομιστών παραγωγής στη λίστα παραγωγής. Η λίστα sandbox δεν επιτρέπει αιτήματα παραγωγής.

Ανανέωση και ανάκληση κλειδιών

Αν χάσετε το μυστικό κλειδί, χρησιμοποιήστε το “Ανανέωση κλειδιού”. Το παλιό κλειδί αυτού του περιβάλλοντος ανακαλείται αμέσως. Το άλλο περιβάλλον διατηρεί το κλειδί του.

  • Κάθε περιβάλλον έχει ένα ενεργό κλειδί. Η “Ανανέωση κλειδιού” εκδίδει νέο ζεύγος και ανακαλεί αμέσως το παλιό. Τα αιτήματα που υπογράφονται με το παλιό κλειδί αποτυγχάνουν με 9000003.
  • Η “Ανάκληση κλειδιού” απενεργοποιεί το κλειδί χωρίς να εκδώσει νέο. Τα αιτήματα απορρίπτονται αμέσως.
  • Το μυστικό ενός ανακληθέντος κλειδιού συνεχίζει να υπογράφει webhook για πληρωμές που δημιουργήθηκαν με αυτό. Φυλάξτε με ασφάλεια το αντίστοιχο μυστικό για αυτές τις πληρωμές. Αν χαθεί ή διαρρεύσει, επαληθεύστε την κατάστασή τους με αυθεντικοποιημένα αιτήματα GET και το τρέχον κλειδί σας· μην εμπιστεύεστε webhook υπογεγραμμένα με μυστικό που έχει διαρρεύσει.

Έλεγχος ταυτότητας

Υπογράψτε τα αιτήματα που απαιτούν ταυτοποίηση με HMAC-SHA256 και το μυστικό κλειδί σας. Η υπογραφή καλύπτει τη χρονική σήμανση, τη μέθοδο, τη διαδρομή και το hash του σώματος. Το GET /api/v3/service-status είναι δημόσιο και δεν χρειάζεται υπογραφή.

Υποχρεωτικές κεφαλίδες

ΚεφαλίδαΠεριγραφή
X-CAV-Account-NoΟ 6ψήφιος αριθμός λογαριασμού σας.
X-CAV-Api-KeyΤο κλειδί API του περιβάλλοντος που καλείτε (sandbox ή live).
X-CAV-TimestampΤρέχουσα ώρα Unix σε δευτερόλεπτα, 10 ψηφία. Τα αιτήματα με απόκλιση μεγαλύτερη από 300 δευτερόλεπτα απορρίπτονται.
X-CAV-SignatureHMAC-SHA256 της κανονικής συμβολοσειράς, 64 πεζοί χαρακτήρες hex.
Idempotency-KeyΑπαιτείται στα αιτήματα εγγραφής. Χρησιμοποιήστε 8–128 χαρακτήρες από το A-Z a-z 0-9 _ -. Ένα UUID είναι κατάλληλο.
Content-Typeapplication/json σε αιτήματα με σώμα.

Φυλάξτε το μυστικό κλειδί σύμφωνα με τη Λήψη κλειδιού.

Πώς υπογράφεται ένα αίτημα

  1. Σειριοποιήστε το σώμα JSON μία φορά και υπολογίστε το sha256(body) ως hex με πεζά. Για αιτήματα χωρίς σώμα χρησιμοποιήστε sha256("").

  2. Δημιουργήστε την κανονική συμβολοσειρά από timestamp, METHOD, path και το hash του σώματος, ενωμένα με αλλαγές γραμμής (\n, χωρίς τελική αλλαγή γραμμής). Η διαδρομή δεν περιέχει συμβολοσειρά ερωτήματος.

  3. Υπολογίστε το HMAC-SHA256(secret, canonical) και κωδικοποιήστε το ως 64 πεζούς χαρακτήρες hex.

  4. Στείλτε τις τέσσερις κεφαλίδες X-CAV-* (αριθμός λογαριασμού, κλειδί API, χρονοσήμανση, υπογραφή)· προσθέστε Idempotency-Key στα αιτήματα εγγραφής.

Κανονική συμβολοσειρά υπογραφής

timestamp + "\n" + METHOD + "\n" + path + "\n" + hex(sha256(body))
signature = hmac_sha256(secret, canonical)  // 64 lowercase hex characters

Το path είναι η πλήρης διαδρομή χωρίς τη συμβολοσειρά ερωτήματος (για παράδειγμα /api/v3/payments). Ένα αίτημα χωρίς σώμα χρησιμοποιεί το hash της κενής συμβολοσειράς (sha256("")).

Υπογράψτε ακριβώς τα byte που στέλνετε: σειριοποιήστε το JSON μία φορά και χρησιμοποιήστε την ίδια συμβολοσειρά για το hash και για το σώμα του αιτήματος.

Παράδειγμα (με πλασματικά στοιχεία)

Όλες οι παρακάτω τιμές είναι πλασματικές: αριθμός λογαριασμού 123456, μυστικό κλειδί sk_test_EXAMPLE. Χρησιμοποιήστε τις τιμές από τον δικό σας πίνακα.

Σώμα αιτήματος

{"amount":"250.00","currency_code":"USD","merchant_reference":"ORDER-2026-0001"}

sha256(body)

280db1ad2f6a457444b4838e9da76682edbd328a1b62f7b9b762852d9c4354f7

Κανονική συμβολοσειρά υπογραφής

1790000000
POST
/api/v3/payments
280db1ad2f6a457444b4838e9da76682edbd328a1b62f7b9b762852d9c4354f7

X-CAV-Signature

3d3a95fcbda890bb424184c914ef3e2371c43602988cf3a698dc357b8074c5e9

Αποστολή υπογεγραμμένου αιτήματος

Κάθε παράδειγμα δημιουργεί μια πληρωμή. Τα διαπιστευτήρια διαβάζονται από μεταβλητές περιβάλλοντος. Μη γράφετε το μυστικό κλειδί στον κώδικα. Κάθε εκτέλεση χρησιμοποιεί νέο merchant_reference.

#!/usr/bin/env bash
# export MERCHANT_ACCOUNT_NO=... MERCHANT_API_KEY=... MERCHANT_API_SECRET=...   (sandbox key)
# GET requests: METHOD=GET, REQ_PATH=/api/v3/payments/<code>, BODY='' (sha256 of the empty string), no Content-Type / --data-binary
set -euo pipefail

BASE_URL="https://www.cryptoavans.com"
METHOD="POST"
REQ_PATH="/api/v3/payments"
REFERENCE="ORDER-$(date +%s)-$(openssl rand -hex 4)"   # a new merchant_reference for every payment
BODY="{\"amount\":\"250.00\",\"currency_code\":\"USD\",\"merchant_reference\":\"$REFERENCE\",\"return_url\":\"http://localhost/return\"}"

TIMESTAMP="$(date +%s)"
BODY_SHA256="$(printf '%s' "$BODY" | openssl dgst -sha256 -hex | awk '{print $NF}')"
CANONICAL="$(printf '%s\n%s\n%s\n%s' "$TIMESTAMP" "$METHOD" "${REQ_PATH%%\?*}" "$BODY_SHA256")"
# the secret travels in the environment, not on the command line
SIGNATURE="$(printf '%s' "$CANONICAL" | python3 -c 'import hashlib,hmac,os,sys; print(hmac.new(os.environ["MERCHANT_API_SECRET"].encode(), sys.stdin.buffer.read(), hashlib.sha256).hexdigest())')"

curl --silent --show-error --request "$METHOD" "$BASE_URL$REQ_PATH" \
  --header "X-CAV-Account-No: $MERCHANT_ACCOUNT_NO" \
  --header "X-CAV-Api-Key: $MERCHANT_API_KEY" \
  --header "X-CAV-Timestamp: $TIMESTAMP" \
  --header "X-CAV-Signature: $SIGNATURE" \
  --header "Idempotency-Key: $(openssl rand -hex 16)" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --data-binary "$BODY"
<?php
$config = [
    'base'    => 'https://www.cryptoavans.com',
    'account' => getenv('MERCHANT_ACCOUNT_NO'),
    'key'     => getenv('MERCHANT_API_KEY'),
    'secret'  => getenv('MERCHANT_API_SECRET'),
];

function signedRequest(array $config, string $method, string $path, ?array $payload = null, ?string $idempotencyKey = null): array
{
    $method = strtoupper($method);
    $signingPath = explode('?', $path, 2)[0];
    // serialise once: the same bytes are hashed and sent
    $body = $payload === null ? '' : json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
    $timestamp = (string) time();
    $canonical = implode("\n", [$timestamp, $method, $signingPath, hash('sha256', $body)]);
    $signature = hash_hmac('sha256', $canonical, $config['secret']);

    $headers = [
        'X-CAV-Account-No: ' . $config['account'],
        'X-CAV-Api-Key: ' . $config['key'],
        'X-CAV-Timestamp: ' . $timestamp,
        'X-CAV-Signature: ' . $signature,
        'Content-Type: application/json',
        'Accept: application/json',
    ];
    if ($idempotencyKey !== null) {
        $headers[] = 'Idempotency-Key: ' . $idempotencyKey;
    }

    $ch = curl_init($config['base'] . $path);
    curl_setopt_array($ch, [
        CURLOPT_CUSTOMREQUEST  => $method,
        CURLOPT_HTTPHEADER     => $headers,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 30,
    ]);
    if ($body !== '') {
        curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
    }
    $response = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    curl_close($ch);
    if ($response === false) {
        throw new RuntimeException('No response; retry the same operation and Idempotency-Key.');
    }

    return [$status, json_decode((string) $response, true)];
}

// a new merchant_reference for every payment: seconds plus a random suffix
[$status, $payment] = signedRequest(
    $config,
    'POST',
    '/api/v3/payments',
    ['amount' => '250.00', 'currency_code' => 'USD', 'return_url' => 'http://localhost/return', 'merchant_reference' => 'ORDER-' . time() . '-' . bin2hex(random_bytes(4))],
    bin2hex(random_bytes(16))
);
echo $status, ' ', json_encode($payment, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES), PHP_EOL;

if (!in_array($status, [200, 201], true)) {
    exit(1); // the error code is not a payment code
}

// GET: no body, so the hash is sha256("")
[$status, $fetched] = signedRequest($config, 'GET', '/api/v3/payments/' . $payment['code']);
echo $status, ' ', $fetched['status'] ?? '', PHP_EOL;

Τα αιτήματα με παλιά χρονοσήμανση απορρίπτονται, γι' αυτό κρατήστε το ρολόι του διακομιστή σας συγχρονισμένο μέσω NTP. Οι επανειλημμένες λανθασμένες υπογραφές από μία IP προκαλούν προσωρινό κλείδωμα (429).

Κανόνες αιτημάτων

Idempotency

Στείλτε την κεφαλίδα Idempotency-Key σε κάθε αίτημα εγγραφής. Κάνει ασφαλή την επανάληψη: όσες φορές κι αν στείλετε το ίδιο αίτημα, η λειτουργία εκτελείται μία φορά.

  • Η επανάληψη αιτήματος με το ίδιο κλειδί και σώμα επιστρέφει το αρχικό αποτέλεσμα και δεν δημιουργεί ποτέ δεύτερη λειτουργία. Χρησιμοποιήστε GET όταν χρειάζεστε την τρέχουσα κατάσταση.
  • Το ίδιο κλειδί με διαφορετικό σώμα επιστρέφει 409 με κωδικό 9000010· ένα μη έγκυρο κλειδί επιστρέφει 422 με κωδικό 1000009.
  • Δημιουργήστε νέο τυχαίο κλειδί (κάνει ένα UUID) για κάθε νέα λειτουργία και αποθηκεύστε το με την παραγγελία σας ώστε μια επανάληψη να το ξαναχρησιμοποιήσει.

Όρια ρυθμού

Τα αιτήματα περιορίζονται ανά κλειδί API και ανά διεύθυνση IP. Όταν λάβετε 429, περιμένετε και δοκιμάστε ξανά αργότερα.

  • Σε 429, περιμένετε το Retry-After όταν υπάρχει και ξαναδοκιμάστε με εκθετική υποχώρηση και jitter.
  • Σε 503, ξαναδοκιμάστε αργότερα με το ίδιο Idempotency-Key και σώμα. Διορθώστε τα άλλα σφάλματα 4xx πριν την επανάληψη· χρησιμοποιήστε νέο κλειδί μόνο για νέα λειτουργία.

Αν ένα αίτημα απορριφθεί, βρείτε το code στους Κωδικούς σφαλμάτων. Οι συνηθέστερες αιτίες: λάθος υπογραφή (9000001), παλιά χρονοσήμανση (9000002), λάθος διαπιστευτήρια (9000003) και IP εκτός της λίστας επιτρεπόμενων (9000012).

Πληρωμές

Δημιουργήστε μια πληρωμή και διαβάστε την κατάστασή της.

Καταστάσεις πληρωμής

ΠεδίοΠεριγραφή
createdΗ πληρωμή είναι ανοιχτή. Η προθεσμία της είναι το expires_at· η σελίδα πληρωμής ισχύει για 24 ώρες.
paidΗ πληρωμή εισπράχθηκε. Αποστέλλεται ειδοποίηση payment.paid.
expiredΗ σελίδα πληρωμής έληξε χωρίς επιβεβαιωμένη πληρωμή.

Διαβάστε την τρέχουσα κατάσταση με GET /api/v3/payments/{code}. Μετά από απόρριψη ο πελάτης μπορεί να ξαναδοκιμάσει στο ίδιο payment_url όσο η πληρωμή είναι created. Αν είναι expired, δημιουργήστε νέα πληρωμή με νέο merchant_reference και Idempotency-Key.

Κανόνες

  • Το ποσό πρέπει να είναι εντός των ορίων πληρωμής του λογαριασμού σας. Το όριο ελέγχεται σε δολάρια ΗΠΑ μετά τη μετατροπή· η προεπιλογή είναι 3.00 έως 1100.00 USD. Εκτός αυτού του εύρους, το API επιστρέφει 422 με κωδικό 9000005. Για διαφορετικό όριο επικοινωνήστε με την CryptoAvans.
  • Το merchant_reference έχει έως 64 χαρακτήρες και είναι μοναδικό ανά λογαριασμό και περιβάλλον. Δεν μπορεί να ξαναχρησιμοποιηθεί ακόμη και μετά τη λήξη μιας πληρωμής (409, 9000007)· στείλτε νέο για κάθε νέα πληρωμή.
  • Οδηγήστε τον πελάτη στο payment_url ως κανονική σελίδα (πλοήγηση ανωτάτου επιπέδου). Η σελίδα πληρωμής δεν μπορεί να εμφανιστεί μέσα σε iframe.
  • Το return_url είναι προαιρετικό. Όταν τελειώσει η πληρωμή, η σελίδα αποτελέσματος εμφανίζει ένα κουμπί που οδηγεί τον πελάτη εκεί, με προσθήκη των code, status και, αν το στείλατε, merchant_reference στο ερώτημα. Δεν υπάρχει αυτόματη ανακατεύθυνση.
  • Τα άγνωστα πεδία αιτήματος αγνοούνται. Επιβεβαιώστε την πληρωμή με υπογεγραμμένο webhook ή GET από τον διακομιστή σας· η επιστροφή του πελάτη στον ιστότοπό σας είναι ενημερωτική.

Στο sandbox το payment_url ανοίγει την ίδια σελίδα πληρωμής· πληρώστε με δοκιμαστική κάρτα από το Περιβάλλον δοκιμών.

Στο live, η πληρωμή εισπράττεται από πραγματική κάρτα και πιστώνεται στο υπόλοιπό σας μετά την ημερομηνία αξίας της.

POST/api/v3/paymentsΑπαιτεί Idempotency-Key

Δημιουργία πληρωμής

Η απόκριση 201 περιέχει τα payment_url και expires_at. Οδηγήστε τον πελάτη στο payment_url· η σελίδα πληρωμής ισχύει για 24 ώρες. Αν επιστραφεί 409 / 9000039, επαναλάβετε το ίδιο αίτημα με το ίδιο Idempotency-Key.

Σώμα αιτήματος

ΠεδίοΤύποςΥποχρεωτικόΠεριγραφή
amountstringΥποχρεωτικόΘετικό ποσό, ως δεκαδική συμβολοσειρά σταθερής κλίμακας με 2 δεκαδικά (π.χ. "250.00"), στο currency_code. Πρέπει να είναι εντός των ορίων πληρωμής του λογαριασμού σας (ελέγχονται σε USD μετά τη μετατροπή με την τρέχουσα ισοτιμία· δείτε τα όρια στη σελίδα API Key & Ενσωμάτωση του πίνακα)· διαφορετικά το αίτημα επιστρέφει 422 9000005.
currency_codestringΥποχρεωτικόΝόμισμα προέλευσης.
USDEURAEDTRY
merchant_referencestring | nullΠροαιρετικόΗ δική σας αναφορά παραγγελίας (έως 64 χαρακτήρες). Μοναδική ανά λογαριασμό και περιβάλλον: μια αναφορά δεν μπορεί να ξαναχρησιμοποιηθεί, ούτε καν για πληρωμή που έληξε (409 9000007). Προαιρετικό.
maxLength 64
webhook_urlstring | nullΠροαιρετικόΔιεύθυνση https:// που λαμβάνει τις υπογεγραμμένες ειδοποιήσεις (payment.paid, payment.refunded, payment.failed). Ο κεντρικός υπολογιστής πρέπει να επιλύεται μέσω DNS σε δημόσια διεύθυνση (χωρίς ιδιωτική ή δεσμευμένη IP, χωρίς localhost)· η διεύθυνση έχει το πολύ 500 χαρακτήρες και δεν πρέπει να περιέχει όνομα χρήστη ή κωδικό πρόσβασης. Προαιρετικό: αν παραλειφθεί, χρησιμοποιείται η διεύθυνση webhook που έχει αποθηκευτεί στον πίνακα για το περιβάλλον του κλειδιού υπογραφής σας· αν δεν υπάρχει αποθηκευμένη, δεν στέλνεται ειδοποίηση.
maxLength 500
merchant_namestring | nullΠροαιρετικόΌνομα που εμφανίζεται στην οθόνη πληρωμής. Προαιρετικό· η προεπιλογή είναι Hesap <account number> (ο 6ψήφιος αριθμός λογαριασμού σας). Μια τιμή μεγαλύτερη από 120 χαρακτήρες περικόπτεται και δεν απορρίπτεται.
return_urlstring · uri | nullΠροαιρετικόΠροαιρετικό return_url (έως 2048 χαρακτήρες). Το live απαιτεί HTTPS· το sandbox δέχεται και HTTP σε localhost, 127.0.0.1 ή [::1]. Χωρίς στοιχεία χρήστη, τμήμα, χαρακτήρες ελέγχου ή κενά. Τα διεθνή ονόματα τομέα μετατρέπονται σε ASCII. Μη έγκυρο URL: 422 / 9000038. Όταν τελειώσει η πληρωμή, η σελίδα αποτελέσματος εμφανίζει ένα κουμπί που οδηγεί τον πελάτη σε αυτή τη διεύθυνση, με προσθήκη των code, status και, αν το στείλατε, merchant_reference στο ερώτημα· δεν υπάρχει αυτόματη ανακατεύθυνση. Μην την αλλάζετε κατά την επανάληψη με το ίδιο Idempotency-Key.
maxLength 2048

Σώμα αιτήματος · Παράδειγμα

{
  "amount": "10.00",
  "currency_code": "USD",
  "merchant_reference": "INV-104",
  "merchant_name": "Test Shop",
  "return_url": "https://shop.example.invalid/return?basket=104"
}

Το limits περιέχει currency_code, min_amount και max_amount (null: χωρίς ανώτατο όριο). Τα παρακάτω ποσά είναι παραδείγματα, όχι τα όριά σας.

HTTP 422 / 9000005

{
  "type": "https://www.cryptoavans.com/errors/9000005",
  "title": "Invalid amount",
  "status": 422,
  "code": "9000005",
  "correlation_id": "example",
  "detail": "Amount outside the account limits.",
  "limits": {
    "currency_code": "USD",
    "min_amount": "25.00",
    "max_amount": null
  }
}

Απόκριση · 201

Η πληρωμή δημιουργήθηκε. Αν επαναληφθεί με το ίδιο Idempotency-Key, επιστρέφεται αντί γι' αυτό 200.

Payment

ΠεδίοΤύποςΠεριγραφή
codestringΣύντομος κωδικός πληρωμής (4–16 πεζοί χαρακτήρες).
merchant_referencestring | nullΗ αναφορά παραγγελίας σας, όπως στάλθηκε.
statusstringΚατάσταση κύκλου ζωής της πληρωμής: created μέχρι να πληρώσει ο πελάτης και μετά paid· expired όταν ο σύνδεσμος λήξει απλήρωτος.
createdpaidexpired
amountstringΜικτό ποσό, ως δεκαδική συμβολοσειρά σταθερής κλίμακας με 2 δεκαδικά, στο currency_code.
currency_codestringΝόμισμα προέλευσης αυτής της πληρωμής· διαβάστε την τιμή που επιστρέφεται αντί να υποθέτετε το νόμισμα του παραδείγματος.
USDEURAEDTRY
environmentstringΠεριβάλλον στο οποίο ανήκει αυτή η πληρωμή.
sandboxlive
payment_urlstringΟδηγήστε τον πελάτη στο payment_url που επιστρέφεται ως κανονική σελίδα (πλοήγηση ανωτάτου επιπέδου)· μην δημιουργείτε και μην αλλάζετε εσείς τη διεύθυνση. Η σελίδα δεν μπορεί να ενσωματωθεί σε iframe. Δεν αποστέλλονται δεδομένα κάρτας σε αυτό το API.
created_atstring · date-timeΏρα δημιουργίας (UTC, ISO-8601).
expires_atstring · date-timeUTC. Η σελίδα πληρωμής ισχύει για 24 ώρες μετά τη δημιουργία. Δημιουργήστε νέα πληρωμή μετά τη λήξη· δεν υπάρχει endpoint ανανέωσης. Επαληθεύστε την πληρωμή με GET /api/v3/payments/{code} ή υπογεγραμμένο webhook· η επιστροφή του πελάτη στον ιστότοπό σας είναι ενημερωτική.
paid_atstring · date-time | nullΠότε πληρώθηκε ή null.
payment_url_kindstringΠάντα platform (η δική μας σελίδα πληρωμής). Το πεδίο διατηρείται για τις υπάρχουσες ενσωματώσεις· το provider_hosted δεν επιστρέφεται πλέον.
platformprovider_hosted
cardMerchantCardSummary | nullΣτοιχεία κάρτας της επιτυχούς προσπάθειας· null πριν από την πληρωμή ή αν δεν είναι διαθέσιμα.
failurePaymentFailureSummary | nullΤελευταία αποτυχημένη προσπάθεια όσο δεν έχει πληρωθεί, αλλιώς null. Δεν είναι τελικό: μπορεί να πληρωθεί μέχρι expires_at. Το attempt_count μετρά τις αποτυχίες και στις επαναπροσπάθειες.

Απόκριση · Παράδειγμα

{
  "code": "a1b2c3d4",
  "merchant_reference": "INV-104",
  "status": "created",
  "amount": "10.00",
  "currency_code": "USD",
  "environment": "live",
  "payment_url": "https://pay.example.com/l/a1b2c3d4",
  "payment_url_kind": "platform",
  "created_at": "2026-10-05T12:00:00Z",
  "expires_at": "2026-10-06T12:00:00Z",
  "paid_at": null,
  "card": null,
  "failure": null
}

Άλλες αποκρίσεις

  • 200Επανάληψη idempotent: επιστρέφεται η αρχική πληρωμή· δεν δημιουργείται δεύτερη πληρωμή.
  • 422Ποσά εκτός ορίων λογαριασμού (9000005, και κάτω από 0.01 μετά τη μετατροπή ή πάνω από τη χωρητικότητα) περιλαμβάνουν limits στο βασικό νόμισμα λογαριασμού. Το sandbox εφαρμόζει τον ίδιο έλεγχο. Άλλα σφάλματα μπορεί να μην έχουν limits.

Πιθανά σφάλματα

GET/api/v3/payments/{code}

Ανάκτηση κατάστασης πληρωμής

Παράμετροι

ΠεδίοΤύποςΥποχρεωτικόΠεριγραφή
codestring · pathΥποχρεωτικόΟ κωδικός της πληρωμής.
pattern ^[a-z0-9]{4,16}$

Απόκριση · 200

Η πληρωμή.

Αντικείμενο: Payment (τα πεδία αναφέρονται στο Δημιουργία πληρωμής).

Απόκριση · Παράδειγμα

{
  "code": "ab34cdef",
  "merchant_reference": "ORDER-2026-0001",
  "status": "created",
  "amount": "250.00",
  "currency_code": "USD",
  "environment": "live",
  "payment_url": "https://example.com/l/ab34cdef",
  "created_at": "2026-09-26T09:00:00.000Z",
  "expires_at": "2026-09-27T09:00:00.000Z",
  "paid_at": null,
  "payment_url_kind": "platform"
}

Πιθανά σφάλματα

Αποτυχημένες προσπάθειες

Το Payment.card περιέχει στοιχεία της επιτυχούς προσπάθειας και το failure.card της τελευταίας αποτυχημένης. Μη διαθέσιμες τιμές μπορεί να είναι null. Το όνομα κατόχου είναι προσωπικό δεδομένο: εφαρμόστε τις νομικές υποχρεώσεις σας. Ο πλήρης αριθμός και η ημερομηνία λήξης δεν παρέχονται ποτέ.

Το payment.failed αποστέλλεται μία φορά, στην πρώτη αποτυχημένη προσπάθεια: απόρριψη κάρτας, αποτυχία 3-D Secure ή ακύρωση από τον πληρωτή. Η πληρωμή παραμένει created· ο πελάτης μπορεί να ξαναδοκιμάσει μέχρι το expires_at και αργότερα να έρθει payment.paid. Άλλες αποτυχίες ενημερώνουν το Payment.failure χωρίς νέο συμβάν. Το attempt_count μετρά τις αποτυχίες· το detail_code, αν υπάρχει, είναι ενημερωτικό. Χρησιμοποιήστε τις σταθερές τιμές failure.code παρακάτω.

PaymentFailure

ΠεδίοΤύποςΥποχρεωτικόΠεριγραφή
detail_codestring | nullΥποχρεωτικόΛεπτομερής κωδικός απόκρισης από το δίκτυο πληρωμών, για παράδειγμα 058 ή 511· οι κωδικοί sandbox με τελεία εξακολουθούν να υποστηρίζονται. Χωρίς συναλλαγή: timeout με λεπτομέρεια null. Οι ενσωματώσεις πρέπει να αποφασίζουν με βάση το σταθερό πεδίο code.
pattern ^[0-9]{3}(?:\.[0-9]{3})?$
cardMerchantCardSummary | nullΥποχρεωτικόΠροαιρετικά στοιχεία κάρτας από την επαληθευμένη επιτυχή ή αποτυχημένη προσπάθεια. Το issuing_country χρησιμοποιεί ISO 3166-1 alpha-3. Χωρίς πλήρη αριθμό, ημερομηνία λήξης, κωδικό ασφαλείας ή αναγνωριστικά του ιδρύματος.
codestringΥποχρεωτικόΣταθερός, ασφαλής λόγος από την τελευταία συναλλαγή πληρωμής, αλλιώς από τον έλεγχο ταυτότητας. 511/51: insufficient_funds; 058/004: authentication_failed; 022: timeout; 001/002: cancelled; 527/501: declined; 526: provider_error. Χωρίς συναλλαγή ή επιτυχής έλεγχος ταυτότητας χωρίς πληρωμή: timeout. Άγνωστα σφάλματα: declined. Χωρίς μήνυμα παρόχου ή ευαίσθητα δεδομένα κάρτας.
declinedinsufficient_fundsauthentication_failedcard_invalidcancelledprovider_errorexpired_cardinvalid_cvvtimeout
occurred_atstring · date-timeΥποχρεωτικόΧρόνος ολοκλήρωσης της αποτυχημένης προσπάθειας σε UTC με χιλιοστά δευτερολέπτου.

Webhooks

Οι υπογεγραμμένες ειδοποιήσεις JSON καλύπτουν τα payment.paid, payment.failed και payment.refunded. Επεξεργαστείτε μόνο γνωστούς τύπους και αγνοήστε τους άγνωστους· μια αποτυχημένη προσπάθεια δεν είναι τελικό αποτέλεσμα.

Επαληθεύστε κάθε ειδοποίηση

  1. Διαβάστε το ακατέργαστο σώμα πριν αναλύσετε το JSON. Απορρίψτε υπογραφές ή χρονικές σημάνσεις που λείπουν ή έχουν μη έγκυρη μορφή. Τα παραδείγματα απορρίπτουν χρονικές σημάνσεις που απέχουν πάνω από 300 δευτερόλεπτα από το ρολόι του διακομιστή σας· διατηρήστε το συγχρονισμένο.

  2. Ξαναδημιουργήστε την κανονική συμβολοσειρά από το X-CAV-Timestamp, POST, τη διαδρομή του webhook URL σας (χωρίς συμβολοσειρά ερωτήματος) και το sha256 του ακατέργαστου σώματος.

  3. Υπολογίστε HMAC-SHA256 με το μυστικό κλειδί σας και συγκρίνετέ το με το X-CAV-Signature σε σταθερό χρόνο. Χρησιμοποιήστε το μυστικό του κλειδιού που δημιούργησε την πληρωμή, ακόμη και αν έχετε ανανεώσει το κλειδί σας έκτοτε.

  4. Μετά την επαλήθευση της υπογραφής, αντιστοιχίστε το υπογεγραμμένο environment, τον κωδικό πληρωμής, το ποσό και το νόμισμα με την παραγγελία σας. Χρησιμοποιήστε το event_type του υπογεγραμμένου σώματος για να διακρίνετε τα payment.paid / payment.failed και payment.refunded· μια επιστροφή δεν πρέπει να ενεργοποιεί εκτέλεση παραγγελίας.

  5. Αφαιρέστε τα διπλότυπα ατομικά με το event_id του επαληθευμένου σώματος. Συγκρίνετέ το με το X-CAV-Delivery χωρίς διάκριση πεζών και κεφαλαίων και απορρίψτε τυχόν ασυμφωνία· η ίδια η κεφαλίδα δεν υπογράφεται. Μη βασίζεστε στη σειρά παράδοσης· ελέγξτε απρόσμενα συμβάντα μέσω των endpoints κατάστασης.

  6. Επιστρέψτε γρήγορα 2xx αφού αποθηκεύσετε μόνιμα το επαληθευμένο συμβάν ή ολοκληρώσετε την επεξεργασία του. Αν δεν μπορείτε να το αποθηκεύσετε, επιστρέψτε αποτυχία ώστε να επαναληφθεί. Επιστρέψτε 2xx για ήδη αποθηκευμένο διπλότυπο. Το σώμα της απόκρισης αγνοείται και οι ανακατευθύνσεις δεν ακολουθούνται.

Χρησιμοποιήστε έγκυρο πιστοποιητικό TLS από δημόσια αρχή πιστοποίησης· ο έλεγχος πιστοποιητικού δεν μπορεί να απενεργοποιηθεί.

Παραδείγματα επαλήθευσης υπογραφής

<?php
// $path is the path of YOUR webhook URL (no query string), e.g. /payment-webhook
function isValidWebhook(string $rawBody, array $headers, string $path, string $secret): bool
{
    $headers = array_change_key_case($headers, CASE_LOWER);
    $timestamp = $headers['x-cav-timestamp'] ?? '';
    $signature = $headers['x-cav-signature'] ?? '';
    if (!is_string($timestamp) || !is_string($signature)
        || preg_match('/^[0-9]{10}$/D', $timestamp) !== 1
        || preg_match('/^[0-9a-f]{64}$/D', $signature) !== 1
        || abs(time() - (int) $timestamp) > 300) {
        return false;
    }
    $canonical = implode("\n", [$timestamp, 'POST', $path, hash('sha256', $rawBody)]);

    return hash_equals(hash_hmac('sha256', $canonical, $secret), $signature);
}

$rawBody = file_get_contents('php://input');
$headers = [
    'X-CAV-Timestamp' => $_SERVER['HTTP_X_CAV_TIMESTAMP'] ?? '',
    'X-CAV-Signature' => $_SERVER['HTTP_X_CAV_SIGNATURE'] ?? '',
];
if (!isValidWebhook($rawBody, $headers, '/payment-webhook', getenv('MERCHANT_API_SECRET'))) {
    http_response_code(401);
    exit;
}

// After verification: compare event_id from the signed body with X-CAV-Delivery (case-insensitive),
// save the event once (deduplicate by event_id), then answer 2xx. On a save error answer 5xx so it is retried.
$event = json_decode($rawBody, true);
http_response_code(204);
const crypto = require("node:crypto");

// path is the path of YOUR webhook URL (no query string), e.g. /payment-webhook
function isValidWebhook(rawBody, headers, path, secret) {
  const timestamp = headers["x-cav-timestamp"] ?? "";
  const signature = headers["x-cav-signature"] ?? "";
  if (typeof timestamp !== "string" || typeof signature !== "string"
      || !/^[0-9]{10}$/.test(timestamp) || !/^[0-9a-f]{64}$/.test(signature)
      || Math.abs(Math.floor(Date.now() / 1000) - Number(timestamp)) > 300) return false;
  const bodyHash = crypto.createHash("sha256").update(rawBody).digest("hex");
  const canonical = [timestamp, "POST", path, bodyHash].join("\n");
  const expected = crypto.createHmac("sha256", secret).update(canonical).digest("hex");
  const a = Buffer.from(expected);
  const b = Buffer.from(signature);
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}

// rawBody must be the untouched request bytes (Buffer), not re-serialised JSON.
// After verification, deduplicate using event_id from the signed body; check X-CAV-Delivery matches.
// Check event_type and order fields, then durably save before 2xx (see the verification steps).
module.exports = { isValidWebhook };
import hashlib
import hmac
import re
import time


def is_valid_webhook(raw_body: bytes, headers: dict, path: str, secret: str) -> bool:
    """path is the path of YOUR webhook URL (no query string), e.g. /payment-webhook."""
    headers = {key.lower(): value for key, value in headers.items()}
    timestamp = headers.get("x-cav-timestamp", "")
    signature = headers.get("x-cav-signature", "")
    if (not isinstance(timestamp, str) or not isinstance(signature, str)
            or not re.fullmatch(r"[0-9]{10}", timestamp)
            or not re.fullmatch(r"[0-9a-f]{64}", signature)
            or abs(int(time.time()) - int(timestamp)) > 300):
        return False
    canonical = "\n".join([timestamp, "POST", path, hashlib.sha256(raw_body).hexdigest()])
    expected = hmac.new(secret.encode(), canonical.encode(), hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature)


# After verification, deduplicate by event_id from the signed body; check X-CAV-Delivery matches.
# Check event_type and order fields, then durably save before 2xx (see the verification steps).

Επαναλήψεις

Κάθε απόκριση εκτός από 2xx, λήξη χρόνου (περίπου 10 δευτερόλεπτα) ή σφάλμα σύνδεσης μετρά ως αποτυχημένη προσπάθεια. Γίνονται έως 6 προσπάθειες και ανάμεσά τους τηρούνται τουλάχιστον οι χρόνοι αναμονής που φαίνονται παρακάτω. Μετά την τελευταία αποτυχημένη προσπάθεια η παράδοση επισημαίνεται ως failed· μπορείτε να την επαναφέρετε στην ουρά με POST /api/v3/webhooks/deliveries/{id}/retry.

Το σώμα και το X-CAV-Delivery είναι ίδια σε κάθε προσπάθεια· τα X-CAV-Timestamp και X-CAV-Signature υπολογίζονται εκ νέου κάθε φορά. Το id της παράδοσης, η κεφαλίδα X-CAV-Delivery και το event_id στο σώμα είναι το ίδιο UUID με κεφαλαία· συγκρίνετέ το χωρίς διάκριση πεζών-κεφαλαίων.

ΠροσπάθειαΑναμονή πριν
1—
260 s (1 min)
3300 s (5 min)
4900 s (15 min)
53600 s (1 h)
621600 s (6 h)

Ειδοποιήσεις προς τον διακομιστή σας

ΣυμβάνΠότε αποστέλλεται
payment.paidΗ πληρωμή εισπράχθηκε.
payment.failedΗ πρώτη αποτυχημένη προσπάθεια μιας πληρωμής που παραμένει ανοιχτή. Δεν είναι τελική: ο πελάτης μπορεί να ξαναδοκιμάσει.
payment.refundedΟλοκληρώθηκε μια επιστροφή.
POSTpayment.paid

Υπογεγραμμένη ειδοποίηση payment.paid προς το URL του εμπόρου

Κεφαλίδα

ΠεδίοΤύποςΥποχρεωτικόΠεριγραφή
X-CAV-Eventstring · headerΥποχρεωτικό
payment.paid
X-CAV-Environmentstring · headerΥποχρεωτικό
sandboxlive
X-CAV-Deliverystring · uuid · headerΥποχρεωτικόΑναγνωριστικό παράδοσης. Δεν αλλάζει στις επαναλήψεις.
X-CAV-Timestampstring · headerΥποχρεωτικό
pattern ^[0-9]{10}$
X-CAV-Signaturestring · headerΥποχρεωτικό
pattern ^[0-9a-f]{64}$

Σώμα αιτήματος · Παράδειγμα

{
  "event_id": "3BAEB108-41A8-40AE-81EF-0A82AA1132D6",
  "event_type": "payment.paid",
  "environment": "sandbox",
  "occurred_at": "2026-10-05T12:01:00.000Z",
  "payment": {
    "code": "a1b2c3d4",
    "merchant_reference": "INV-104",
    "status": "paid",
    "amount": "10.00",
    "currency_code": "USD",
    "created_at": "2026-10-05T12:00:00.000Z",
    "paid_at": "2026-10-05T12:01:00.000Z",
    "card": {
      "brand": "visa",
      "bin": "400000",
      "last4": "0010",
      "holder_name": "TEST CARDHOLDER",
      "issuing_country": "TUR",
      "issuing_bank": "TEST BANK",
      "funding_type": "credit",
      "category": "STANDARD"
    }
  }
}
POSTpayment.failed

Υπογεγραμμένη ειδοποίηση αποτυχημένης προσπάθειας πληρωμής

Σώμα αιτήματος · Παράδειγμα

{
  "event_id": "3BAEB108-41A8-40AE-81EF-0A82AA1132D6",
  "event_type": "payment.failed",
  "environment": "sandbox",
  "occurred_at": "2026-10-05T12:01:00.000Z",
  "payment": {
    "code": "a1b2c3d4",
    "merchant_reference": "INV-104",
    "status": "created",
    "amount": "10.00",
    "currency_code": "USD",
    "created_at": "2026-10-05T12:00:00.000Z",
    "expires_at": "2026-10-06T12:00:00.000Z"
  },
  "failure": {
    "code": "declined",
    "occurred_at": "2026-10-05T12:01:00.000Z",
    "detail_code": null,
    "card": {
      "brand": "visa",
      "bin": "400000",
      "last4": "0010",
      "holder_name": "TEST CARDHOLDER",
      "issuing_country": "TUR",
      "issuing_bank": "TEST BANK",
      "funding_type": "credit",
      "category": "STANDARD"
    }
  }
}

Το περίβλημα είναι ίδιο με το payment.paid. Το payment φέρει expires_at αντί για paid_at και το failure περιγράφει την προσπάθεια (βλ. Αποτυχημένες προσπάθειες).

Για έλεγχο των παραδόσεων ή επαναφορά μιας αποτυχημένης στην ουρά, βλ. Παραδόσεις webhook.

Περιβάλλον δοκιμών

Τα αιτήματα sandbox χρησιμοποιούν εικονικά δεδομένα και δεν μετακινούν ποτέ πραγματικά χρήματα. Ανοίξτε το payment_url και πληρώστε με μία από τις δοκιμαστικές κάρτες παρακάτω.

Πώς λειτουργεί

Κάθε αίτημα που υπογράφεται με κλειδί sandbox εκτελείται σε απομονωμένα εικονικά δεδομένα. Οι κανόνες, τα πεδία και οι κωδικοί σφαλμάτων είναι ίδια με το live. Το payment_url ανοίγει την ίδια σελίδα πληρωμής που βλέπουν οι πελάτες σας στο live. Όταν εγκριθεί μια δοκιμαστική πληρωμή, το payment.paid αποστέλλεται στη διεύθυνση webhook της πληρωμής με το environment ίσο με sandbox.

  • Η σελίδα εμφανίζει ειδοποίηση δοκιμής και δέχεται μόνο τις δοκιμαστικές κάρτες παρακάτω· οι πραγματικοί αριθμοί καρτών απορρίπτονται. Στις κάρτες 3-D Secure σας ζητά να εγκρίνετε ή να απορρίψετε την ταυτοποίηση. Το API δεν δέχεται αριθμούς καρτών· εισαγάγετε την κάρτα στη σελίδα πληρωμής.
  • Δεν εμπλέκονται πραγματικά χρήματα, πραγματική κάρτα ή συναλλαγή στο blockchain και τίποτα δεν φτάνει στο live υπόλοιπό σας.

Δοκιμαστικές κάρτες sandbox

Χρησιμοποιήστε αυτούς τους συνθετικούς αριθμούς μόνο στη σελίδα πληρωμής μιας πληρωμής sandbox, ποτέ σε πραγματική πληρωμή. Δώστε οποιοδήποτε όνομα κατόχου με τουλάχιστον 2 γράμματα, ημερομηνία λήξης του τρέχοντος μήνα ή μεταγενέστερη και CVV 3 ή 4 ψηφίων.

Αριθμός κάρταςΚωδικός αποτελέσματοςΣυμπεριφορά
4000000000000010approvedΕγκρίνεται χωρίς 3-D Secure.
4000000000000051declinedΑπορρίπτεται χωρίς 3-D Secure.
4000000000000002three_ds_approvedΗ σελίδα πληρωμής εμφανίζει ένα βήμα 3-D Secure· αν το εγκρίνετε, η πληρωμή εγκρίνεται, αν το απορρίψετε, η πληρωμή απορρίπτεται.
4000000000000093three_ds_declinedΗ σελίδα πληρωμής εμφανίζει ένα βήμα 3-D Secure· η πληρωμή απορρίπτεται όποιο αποτέλεσμα κι αν επιλέξετε.
4000000000000044timeoutΤο αποτέλεσμα μένει σε εκκρεμότητα (χωρίς τελικό αποτέλεσμα)· μην το θεωρείτε οριστική απόρριψη. Η προσπάθεια κλείνει αργότερα ως ληγμένη.

Μια πληρωμή που απορρίφθηκε παραμένει created και στέλνει payment.failed μία φορά, στην πρώτη αποτυχημένη προσπάθεια· ο πελάτης μπορεί να δοκιμάσει ξανά (10 προσπάθειες ανά ώρα ανά διεύθυνση IP). Η κάρτα λήξης χρόνου και τα ποσά που τελειώνουν σε .77 αφήνουν το αποτέλεσμα σε εκκρεμότητα: η σελίδα εμφανίζει αποτέλεσμα σε εκκρεμότητα, δεν στέλνεται webhook και το αποτέλεσμα δεν καταχωρείται ποτέ χειροκίνητα. Μετά από περίπου 30 λεπτά η προσπάθεια κλείνει ως ληγμένη· η πληρωμή παραμένει created και ο πελάτης μπορεί να ξεκινήσει ξανά. Ο κανόνας .77 ελέγχει το ποσό σε δολάρια ΗΠΑ.

Αρχείο αιτημάτων

Στον πίνακα, το “Αρχείο αιτημάτων sandbox” εμφανίζει τα πρόσφατα αιτήματα sandbox: τις τελευταίες 90 ημέρες, με την IP προέλευσης να διατηρείται για 30 ημέρες. Τα αιτήματα που απέτυχαν στον έλεγχο υπογραφής ή διαπιστευτηρίων δεν καταγράφονται· βρείτε τα με το correlation_id της απόκρισης. Τα αιτήματα live δεν καταγράφονται.

Οι δοκιμές επιστροφών, αναλήψεων και αμφισβητήσεων περιγράφονται στη σελίδα Λειτουργίες λογαριασμού.

Κωδικοί σφαλμάτων

Τα σφάλματα επιστρέφονται ως application/problem+json. Το πεδίο code είναι ένας από τους παρακάτω κωδικούς· συμπεριλάβετε το correlation_id όταν επικοινωνείτε με την υποστήριξη. Τα title και detail ακολουθούν την κεφαλίδα Accept-Language· στον κώδικά σας βασιστείτε μόνο στο code.

Παράδειγμα απόκρισης σφάλματος

application/problem+json

{
  "type": "https://www.cryptoavans.com/errors/9000011",
  "title": "Signature headers are missing",
  "status": 400,
  "detail": "X-CAV-Account-No, X-CAV-Api-Key, X-CAV-Timestamp and X-CAV-Signature are mandatory.",
  "code": "9000011",
  "correlation_id": "3BAEB108-41A8-40AE-81EF-0A82AA1132D6"
}

Πίνακας κωδικών

Αν χαθεί η απόκριση ή λάβετε 500 ή 503, το αποτέλεσμα μπορεί να είναι άγνωστο. Επαναλάβετε με το ίδιο Idempotency-Key και σώμα, υπογράφοντας ξανά με τρέχουσα χρονική σήμανση. Τηρήστε το Retry-After για 503. Μη δημιουργείτε νέα πληρωμή μόνο επειδή έληξε ο χρόνος αναμονής του αιτήματος.

ΚωδικόςHTTPΤίτλος
9000001401Η υπογραφή δεν είναι έγκυρη
9000002401Χρονοσήμανση εκτός παραθύρου
9000003401Τα διαπιστευτήρια δεν είναι έγκυρα
9000004403Ο λογαριασμός δεν μπορεί να κάνει συναλλαγές
9000005422Το ποσό δεν είναι έγκυρο
9000006422Η αναφορά εμπόρου δεν είναι έγκυρη
9000007409Η αναφορά εμπόρου έχει ήδη χρησιμοποιηθεί
9000008422Η διεύθυνση ειδοποίησης δεν είναι έγκυρη
9000009404Η πληρωμή ή η επιστροφή δεν βρέθηκε
9000010409Σύγκρουση Idempotency
9000011400Λείπουν οι κεφαλίδες υπογραφής
9000012403Η IP δεν επιτρέπεται
9000013409Το sandbox δεν είναι διαθέσιμο
9000014409Υπάρχει ήδη αίτημα επιστροφής ή ακύρωσης
9000015404Η αμφισβήτηση δεν βρέθηκε
9000016409Η απάντηση στην αμφισβήτηση δεν γίνεται δεκτή
9000017422Η διεύθυνση TRC20 δεν είναι έγκυρη
9000018422Απαιτείται επιβεβαίωση της διεύθυνσης
9000019422Το ποσό δεν είναι έγκυρο
9000020409Ανεπαρκές υπόλοιπο
9000021409Υπέρβαση του ημερήσιου ορίου ανάληψης
9000022409Η ανάληψη βρίσκεται σε επεξεργασία
9000023404Η ανάληψη δεν βρέθηκε
9000024404Η παράδοση webhook δεν βρέθηκε
9000025409Δεν επιτρέπεται επανάληψη
9000026503Το σχήμα sandbox δεν είναι έτοιμο
9000027409Το υπόλοιπο sandbox είναι σε χρήση
9000030409Η πίστωση sandbox δεν είναι έγκυρη
9000033409Ανεπαρκές υπόλοιπο sandbox
9000038422Μη έγκυρη διεύθυνση επιστροφής
9000039409Η πληρωμή προετοιμάζεται
9000040403Η πρόσβαση στο API είναι απενεργοποιημένη
1000001422Σφάλμα επικύρωσης κοινό
1000002404Δεν βρέθηκε καμία εγγραφή κοινό
1000005429Υπέρβαση του ορίου αιτημάτων κοινό
1000006500Σφάλμα διακομιστή κοινό
1000007405Η μέθοδος δεν υποστηρίζεται κοινό
1000009422Μη έγκυρο κλειδί idempotency κοινό
1000011503Η υπηρεσία δεν είναι διαθέσιμη αυτή τη στιγμή κοινό
1000013503Η υποδομή κλειδιών δεν είναι έτοιμη κοινό
1000014503Η υπηρεσία βρίσκεται σε συντήρηση κοινό
1000020422Μη έγκυρη μορφή ποσού κοινό
1000021422Μη υποστηριζόμενο νόμισμα κοινό
1000023422Το ποσό υπερβαίνει τη χωρητικότητα κοινό
1000030422Η διεύθυνση δεν μπορεί να χρησιμοποιηθεί
3000001503Η ισοτιμία δεν είναι διαθέσιμη αυτή τη στιγμή κοινό

Λίστα ελέγχου για το live

Ολοκληρώστε κάθε σημείο πριν περάσετε στο live.

  • Δοκιμάσατε από άκρο σε άκρο στο sandbox τις ροές πληρωμής, webhook, επιστροφής και ανάληψης.

  • Το live κλειδί και το μυστικό κλειδί αποθηκεύονται μόνο στον διακομιστή σας και δεν γράφονται στα αρχεία καταγραφής.

  • Η live λίστα επιτρεπόμενων IP και η live διεύθυνση webhook HTTPS έχουν οριστεί.

  • Η επαλήθευση υπογραφής webhook είναι ενεργή και απορρίπτει μη έγκυρες υπογραφές· ο χειριστής απαντά γρήγορα με 2xx και ανέχεται επαναλαμβανόμενες παραδόσεις.

  • Οι παραγγελίες ολοκληρώνονται μόνο όταν το webhook ή το GET /payments/{code} δείχνει paid, ποτέ από τον περιηγητή του πελάτη.

  • Τα αιτήματα εγγραφής στέλνουν Idempotency-Key και οι επαναλήψεις το επαναχρησιμοποιούν· κάθε πληρωμή λαμβάνει νέο merchant_reference.

  • Το ρολόι του διακομιστή σας είναι συγχρονισμένο μέσω NTP.

  • Στον λογαριασμό σας έχει ανατεθεί live τερματικό και κάνατε μια μικρή πραγματική πληρωμή μαζί με την CryptoAvans.

Μιλήστε με τον υπεύθυνο λογαριασμού σας για το live τερματικό και την τελική δοκιμή από άκρο σε άκρο. Είσοδος στο πάνελ