Σύμβαση API V1
Συνιστούμε το API server-to-server. Η JavaScript είναι μόνο προαιρετική εναλλακτική διαδρομή αναλυτικών στοιχείων και λειτουργεί μόνο μετά τη χορήγηση συγκατάθεσης για αναλυτικά στοιχεία.
Σύμβαση API V1 Σύνδεσμος προς την ενότητα Σύμβαση API V1
Συνιστούμε το API server-to-server. Η JavaScript είναι μόνο προαιρετική εναλλακτική διαδρομή αναλυτικών στοιχείων και λειτουργεί μόνο μετά τη χορήγηση συγκατάθεσης για αναλυτικά στοιχεία.
Οι παραγγελίες, τα έσοδα και οι παράγωγες μετρήσεις εμφανίζονται μόνο όταν η μέτρηση μετατροπών είναι ενεργή. Χρησιμοποιούνται μόνο για ανάλυση και δεν αλλάζουν τη χρέωση CPC.
schema_version
1.0
payload_contract
order_v1
Content-Type
application/json
request_limit
64 KiB
Πώς να συνδέσετε τη μέτρηση Σύνδεσμος προς την ενότητα Πώς να συνδέσετε τη μέτρηση
Συνιστούμε το API server-to-server. Η JavaScript είναι μόνο προαιρετική εναλλακτική διαδρομή αναλυτικών στοιχείων και λειτουργεί μόνο μετά τη χορήγηση συγκατάθεσης για αναλυτικά στοιχεία.
- 1 Αποθηκεύστε την παράμετρο zclid από το URL προορισμού στο καλάθι ή στην παραγγελία για 30 ημέρες.
- 2 Στον διακομιστή, δημιουργήστε ένα σταθερό αποτύπωμα HMAC-SHA-256 του εσωτερικού ID παραγγελίας, χρησιμοποιώντας ξεχωριστό κλειδί. Μην στέλνετε το ακατέργαστο ID ή προσωπικά δεδομένα.
- 3 Μετά τη δημιουργία της παραγγελίας, στείλτε JSON στο API και υπογράψτε το ακριβές σώμα του αιτήματος με το μυστικό κλειδί ενσωμάτωσης.
- 4 Για πληρωμή, ακύρωση και σωρευτικές επιστροφές χρησιμοποιήστε τα ίδια zclid και order_id_hash. Μην αλλάζετε τα τελικά σύνολα και τα είδη.
Το μυστικό κλειδί ενσωμάτωσης εμφανίζεται μόνο μία φορά. Αποθηκεύστε το σε διαχειριστή μυστικών στον διακομιστή του καταστήματος.
Συνιστάται: API server-to-server Σύνδεσμος προς την ενότητα Συνιστάται: API server-to-server
Ο διακομιστής του καταστήματος στέλνει επαληθευμένες παραγγελίες, αλλαγές κατάστασης και επιστροφές χρημάτων απευθείας στο Zoneo. Μην εισάγετε ποτέ το μυστικό κλειδί στο πρόγραμμα περιήγησης.
https://zoneo.gr/api/v1/conversions
https://zoneo.gr/api/v1/conversions/sandbox
Στον διακομιστή, δημιουργήστε ένα σταθερό αποτύπωμα HMAC-SHA-256 του εσωτερικού ID παραγγελίας, χρησιμοποιώντας ξεχωριστό κλειδί. Μην στέλνετε το ακατέργαστο ID ή προσωπικά δεδομένα.
order_id_hash · PHP
$orderIdHash = hash_hmac(
'sha256',
"zoneo-order-v1\n".$internalOrderId,
$_ENV['ZONEO_ORDER_HASH_KEY'],
);
Παράδειγμα αιτήματος Σύνδεσμος προς την ενότητα Παράδειγμα αιτήματος
Μετά τη δημιουργία της παραγγελίας, στείλτε JSON στο API και υπογράψτε το ακριβές σώμα του αιτήματος με το μυστικό κλειδί ενσωμάτωσης.
order_v1 · JSON
{
"schema_version": "1.0",
"zclid": "018fb72a-7d8e-7c3c-a4da-f37ce07ad739",
"order_id_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"currency": "EUR",
"occurred_at": "2026-08-31T12:34:56Z",
"status": "placed",
"refund_amount_minor": 0,
"totals": {
"items_gross_minor": 14000,
"discount_minor": 1500,
"shipping_gross_minor": 390,
"fees_gross_minor": 100,
"tax_minor": 2165,
"order_total_gross_minor": 12990
},
"items": [
{
"merchant_item_id": "ITEM_ID_FROM_FEED",
"item_group_id": "MODEL-10",
"variant_id": "size:42",
"name": "PRODUCT_NAME",
"gtin": "8581234567890",
"quantity": 2,
"unit_price_gross_minor": 7000,
"line_total_gross_minor": 14000
}
],
"order_locale": "el",
"expected_delivery_date": "2026-09-03"
}
| JSON | Υποχρεωτικά πεδία | V1 |
|---|---|---|
schema_version |
✓ | = "1.0" |
zclid |
✓ | UUID |
order_id_hash |
✓ | HMAC-SHA-256 · [a-f0-9]{64} |
currency |
✓ | ISO 4217 · EUR |
occurred_at |
✓ | ISO 8601 · UTC |
status |
✓ | placed | paid | cancelled | partially_refunded | refunded |
refund_amount_minor |
✓ | integer ≥ 0 · Σ · monotonic |
totals |
✓ | object · integer · gross |
items |
✓ | array[1..100] |
order_locale |
— | BCP 47 |
expected_delivery_date |
— | YYYY-MM-DD |
| items[] | Υποχρεωτικά πεδία | V1 |
|---|---|---|
merchant_item_id |
✓ | feed.ITEM_ID · stable |
quantity |
✓ | integer · 1..1000 |
unit_price_gross_minor |
✓ | integer ≥ 0 |
line_total_gross_minor |
✓ | unit_price_gross_minor × quantity |
item_group_id |
— | string |
variant_id |
— | string |
name |
— | string · PRODUCT_NAME · PII = 0 |
gtin |
— | [0-9]{8,14} |
totals · EUR · integer
totals.items_gross_minor = sum(items[].line_total_gross_minor)
totals.order_total_gross_minor = totals.items_gross_minor - totals.discount_minor + totals.shipping_gross_minor + totals.fees_gross_minor
line_total_gross_minor = unit_price_gross_minor × quantity
Κανονική υπογραφή Σύνδεσμος προς την ενότητα Κανονική υπογραφή
Αν δεν έχετε αποθηκεύσει το αρχικό μυστικό κλειδί, χρησιμοποιήστε την επιλογή «Ανάκτηση μυστικού κλειδιού» και αποθηκεύστε αμέσως με ασφάλεια το νέο κλειδί.
| HTTP | V1 |
|---|---|
Content-Type |
application/json |
X-Zoneo-Integration-ID |
zci_... |
X-Zoneo-Timestamp |
Unix · UTC |
X-Zoneo-Nonce |
CSPRNG · unique · len ≥ 16 |
Idempotency-Key |
order:{hash}:{status} |
X-Zoneo-Signature |
v1=HMAC_SHA256_HEX |
HMAC-SHA-256 · canonical request
UPPERCASE_HTTP_METHOD
/exact/request/path
unix_timestamp
nonce
idempotency_key
sha256_hex_of_exact_raw_body
body_hash = SHA256(raw_body)
signature = HMAC_SHA256(api_secret, canonical_request)
X-Zoneo-Signature = "v1=" + lowercase_hex(signature)
S2S · PHP
<?php
$path = '/api/v1/conversions';
$body = json_encode($payload, JSON_THROW_ON_ERROR | JSON_UNESCAPED_SLASHES);
$timestamp = time();
$nonce = bin2hex(random_bytes(16));
$idempotencyKey = 'order:'.$orderIdHash.':'.$payload['status'];
$canonical = implode("\n", [
'POST',
$path,
(string) $timestamp,
$nonce,
$idempotencyKey,
hash('sha256', $body),
]);
$signature = hash_hmac('sha256', $canonical, $_ENV['ZONEO_API_SECRET']);
$headers = [
'Content-Type: application/json',
'X-Zoneo-Integration-ID: '.$_ENV['ZONEO_INTEGRATION_ID'],
'X-Zoneo-Timestamp: '.$timestamp,
'X-Zoneo-Nonce: '.$nonce,
'Idempotency-Key: '.$idempotencyKey,
'X-Zoneo-Signature: v1='.$signature,
];
$curl = curl_init('https://zoneo.gr/api/v1/conversions');
curl_setopt_array($curl, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $body,
CURLOPT_TIMEOUT => 10,
]);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);
curl_close($curl);
Καταχωρήθηκε → Επιστράφηκε Σύνδεσμος προς την ενότητα Καταχωρήθηκε → Επιστράφηκε
Για πληρωμή, ακύρωση και σωρευτικές επιστροφές χρησιμοποιήστε τα ίδια zclid και order_id_hash. Μην αλλάζετε τα τελικά σύνολα και τα είδη.
order_v1 · lifecycle
placed -> paid | cancelled | partially_refunded | refunded
paid -> partially_refunded | refunded
partially_refunded -> refunded
cancelled, refunded -> terminal
0 <= refund_amount_minor <= totals.order_total_gross_minor
new_refund_amount_minor >= previous_refund_amount_minor
Idempotency-Key · retry
nonce₁ != nonce₂
retry = nonce₂ + Idempotency-Key₁ + SHA256(JSON₁)
Idempotency-Key₁ + SHA256(JSON₁) -> HTTP 200
Idempotency-Key₁ + SHA256(JSON₂) -> HTTP 409 idempotency_conflict
Sandbox V1 Σύνδεσμος προς την ενότητα Sandbox V1
Επικολλήστε JSON V1 για ασφαλή έλεγχο πεδίων, συνόλων και αντιστοίχισης ροής χωρίς δημιουργία παραγγελίας ή επίδραση στη χρέωση.
https://zoneo.gr/api/v1/conversions/sandbox
Προαιρετική μέτρηση μέσω JavaScript Σύνδεσμος προς την ενότητα Προαιρετική μέτρηση μέσω JavaScript
Η βιβλιοθήκη αποθηκεύει το zclid μετά τη συγκατάθεση και στέλνει μόνο το αρχικό συμβάν placed. Στείλτε τις επόμενες καταστάσεις με ασφάλεια μέσω S2S.
Η συγκατάθεση είναι απενεργοποιημένη από προεπιλογή. Η συνάρτηση consent πρέπει να επιστρέφει true μόνο μετά την έγκυρη συγκατάθεση του χρήστη για αναλυτικά στοιχεία.
Φόρτωση και αρχικοποίηση
<script src="https://zoneo.gr/integrations/zoneo-conversion-v1.js"></script>
<script>
const zoneo = window.ZoneoConversions.init({
integrationId: 'zci_...',
apiBase: 'https://zoneo.gr/api/v1/conversions',
consent: () => analyticsConsent === true
})
zoneo.track({
order_id_hash: 'SERVER_HMAC_SHA256',
currency: 'EUR',
occurred_at: new Date().toISOString(),
status: 'placed',
totals: {
items_gross_minor: 12990,
discount_minor: 0,
shipping_gross_minor: 0,
fees_gross_minor: 0,
tax_minor: 2165,
order_total_gross_minor: 12990
},
items: [{
merchant_item_id: 'ITEM_ID_FROM_FEED',
quantity: 1,
unit_price_gross_minor: 12990,
line_total_gross_minor: 12990
}]
})
</script>
Υγεία ενσωμάτωσης Σύνδεσμος προς την ενότητα Υγεία ενσωμάτωσης
Αποδεκτά και απορριφθέντα συμβάντα των τελευταίων 7 ημερών.
HTTP 201 · JSON
{
"data": {
"conversion_reference": "6bfca33e-3ac7-48dc-a733-c1f313853269",
"status": "placed",
"source": "s2s",
"verification": "hmac_current",
"schema_version": "1.0",
"payload_contract": "order_v1",
"totals": {
"items_gross_minor": 14000,
"discount_minor": 1500,
"shipping_gross_minor": 390,
"fees_gross_minor": 100,
"tax_minor": 2165,
"order_total_gross_minor": 12990
},
"refund_amount_minor": 0,
"net_revenue_minor": 12990,
"items": {
"count": 1,
"quantity_total": 2,
"matched_count": 1,
"match_status": "complete"
},
"totals_reconciled": true,
"warnings": [],
"currency": "EUR",
"created": true,
"idempotent": false,
"deduplicated": false,
"provisional": false,
"billing_impact": false
}
}
HTTP 4xx · JSON
{
"error": {
"code": "order_total_mismatch",
"field": "totals.order_total_gross_minor",
"details": {
"expected_minor": 12990,
"received_minor": 13000
}
}
}
invalid_signature
stale_timestamp
replayed_nonce
pii_not_allowed
items_total_mismatch
order_total_mismatch
currency_mismatch
click_not_eligible
store_or_market_mismatch
not_last_zoneo_click
attribution_window_expired
invalid_state_transition
order_definition_conflict
refund_amount_decreased
order_attribution_conflict
Προστασία δεδομένων Σύνδεσμος προς την ενότητα Προστασία δεδομένων
Οι πιο πρόσφατες παραγγελίες μόνο για αναλυτικούς σκοπούς. Δεν εμφανίζονται αρχικά αναγνωριστικά ή προσωπικά δεδομένα.
Στον διακομιστή, δημιουργήστε ένα σταθερό αποτύπωμα HMAC-SHA-256 του εσωτερικού ID παραγγελίας, χρησιμοποιώντας ξεχωριστό κλειδί. Μην στέλνετε το ακατέργαστο ID ή προσωπικά δεδομένα.
Οι παραγγελίες, τα έσοδα και οι παράγωγες μετρήσεις εμφανίζονται μόνο όταν η μέτρηση μετατροπών είναι ενεργή. Χρησιμοποιούνται μόνο για ανάλυση και δεν αλλάζουν τη χρέωση CPC.
Πώς να συνδέσετε τη μέτρηση
Συνιστούμε το API server-to-server. Η JavaScript είναι μόνο προαιρετική εναλλακτική διαδρομή αναλυτικών στοιχείων και λειτουργεί μόνο μετά τη χορήγηση συγκατάθεσης για αναλυτικά στοιχεία.