https://api.arvonapay.comGerçek müşteri kaydı.
Sabit işlem tutarı.
Doğrulanmış sonuç.
Merchant kodu: xxxxpays. Entegrasyon, müşteriyi ArvonaPay kontrollerinden geçirir ve etkin mağazadaki sabit tutarlı ödeme bağlantısına yönlendirir.
Karşı taraftan gereken bilgiler
- API isteklerini gönderen sunucunun sabit çıkış IPv4/IPv6 adresleri. Müşterinin cihaz IP’si izin listesine alınmaz. Tam IP adresi gerekir; CIDR veya joker karakter kabul edilmez.
- Ödeme sonuçlarını kabul edecek herkese açık HTTPS callback adresi; 443 portu ve geçerli TLS sertifikası.
- İşlem para birimi, min/max tutar ve beklenen hacim; kur ve komisyon koşulları ArvonaPay tarafından firma profilinde tanımlanır. İlk mağaza testi AED üzerinden yapılır.
IP ve callback tanımlandıktan sonra merchant etkinleştirilir ve sunucu tarafında kullanılacak avp_test_… anahtarı sağlanır. Gerekli kapsamlar: payments:create ve payments:read. Callback imza sırrı API anahtarından ayrıdır. Portal kullanıcı hesabı gerekiyorsa ayrıca açılır.
POST /v1/store-paymentsxxxxpaysapplication/json · UTF-8İstekten bildirime.
- xxxxpays kendi veritabanındaki gerçek müşteri kaydından işlem isteği oluşturur.
- ArvonaPay API anahtarı, merchant etkinliği ve izinli sunucu IP adresini kontrol eder.
- Müşteri alanları, risk/engel listesi, tutar/limit ve kur koşulları değerlendirilir.
- İşlem, ArvonaPay tarafında etkin ve uygun mağazaya bağlanır. Bu sürümde bağlı mağaza Dynostech / Trainexa LLC; mağaza para birimi AED’dir.
- Mağaza ürün eşleştirir, gerekli sipariş indirimini hesaplar ve ödeme bağlantısını hazırlar.
- xxxxpays sorgudan gelen bağlantıyı müşteriye açar.
- Sunucudan doğrulanmış sonuç ArvonaPay tarafından imzalı callback ile xxxxpays’e gönderilir.
ArvonaPay’de şu an tek bağlı mağaza vardır. Yeni mağazalar kendi adaptörü ve kabul testleri tamamlanınca eklenir. Merchant ürün, araç veya ECU bilgisi göndermez.
Bilgiler xxxxpays kaydından gelir.
| Alan | Zorunlu | Kural |
|---|---|---|
customer.username | Evet | Merchant’ın müşteri kullanıcı adı, en fazla 120 karakter. |
customer.firstName | Evet | Gerçek müşteri adı, en fazla 120 karakter. |
customer.lastName | Evet | Gerçek müşteri soyadı, en fazla 120 karakter. |
customer.email | Evet | Müşteri kaydındaki geçerli e-posta, en fazla 254 karakter. |
customer.id | Hayır | Merchant’ın sabit müşteri kimliği. Gönderilmezse kullanıcı adı sabit müşteri referansı olur. |
customer.ip | Hayır | Müşteri cihaz IP’si; merchant sunucu IP izin listesinden bağımsızdır. |
customer.country | Politikaya göre | İki harfli ülke kodu. |
Rastgele ad, e-posta veya kullanıcı adı üretmeyin. Eksik zorunlu alanlar otomatik doldurulmaz; istek reddedilir. Bu alanlar merchant kaydının beyanıdır; bir resmî kimlik doğrulama servisi çağrısı değildir. Müşteri bilgileri şifreli saklanır, yetkili işlem ayrıntısında görünür; toplu listelere veya callback gövdesine eklenmez.
Sabit tutarla işlem açın.
POST https://api.arvonapay.com/v1/store-payments
Authorization: Bearer <XXXXPAYS_SANDBOX_API_KEY>
Idempotency-Key: xxxxpays-order-0001
Content-Type: application/json
{
"reference": "xxxxpays-order-0001",
"amount": "300.00",
"currency": "AED",
"customer": {
"username": "{{customer_username}}",
"firstName": "{{customer_first_name}}",
"lastName": "{{customer_last_name}}",
"email": "{{customer_email}}"
}
}{{customer_…}} değerleri yer tutucudur; gerçek entegrasyonda xxxxpays müşteri kaydındaki karşılıklarıyla değiştirilir. Tutar ondalık metin olarak gönderilir. Referans firma içinde benzersizdir. Merchant kimliği API anahtarından belirlenir; gövdede merchantId gönderilmez.
Idempotency-Key: 8–128 karakter; harf, rakam ve - _ . :. Ağ hatasında aynı gövde ve aynı anahtarla tekrar edin. Aynı anahtarla farklı içerik 409 IDEMPOTENCY_CONFLICT döndürür. Aynı referans için yeni anahtar üretip yeni işlem açmayın.
{
"id": "11111111-1111-4111-8111-111111111111",
"reference": "xxxxpays-order-0001",
"amount": "300.00",
"currency": "AED",
"status": "PENDING",
"environment": "sandbox",
"checkout": {
"state": "QUEUED",
"chargeAmount": "300.00",
"chargeCurrency": "AED",
"url": null,
"livePayment": false
}
}Yanıt kısaltılmış şema örneğidir; gerçek işlem kimliği ve zaman alanları sunucudan alınır.
Bağlantı hazır olunca yönlendirin.
GET https://api.arvonapay.com/v1/payments/{id}
Authorization: Bearer <XXXXPAYS_SANDBOX_API_KEY>İşlemi 3–5 saniye arayla sorgulayın. checkout.state=READY ve boş olmayan checkout.url geldiğinde müşteriyi bu URL’ye yönlendirin. URL’yi tahmin etmeyin veya kendiniz üretmeyin; yalnız API yanıtındaki değeri kullanın. Bağlantı işlem yetkisi taşır, herkese açık sayfalara veya günlüklere konmaz.
| Durum | Uygulamanın davranışı |
|---|---|
| QUEUED | Bağlantı hazırlanıyor; sorgulamaya devam edin. |
| READY | checkout.url ile müşteriyi yönlendirin; ödeme henüz başarılı değildir. |
| SUCCEEDED | Doğrulanmış başarılı sandbox sonucu. Merchant işlemini tek kez güncelleyin. |
| FAILED / REJECTED | Başarısız sonuç veya uygun ürün eşleşmesi yok; başarı kaydı oluşturmayın. |
| EXPIRED | İşlem süresi doldu. Eski ödeme bağlantısını kullanmayın. |
Ödeme sonucunda üst düzey status esas alınır; checkout.state mağaza hazırlığını ve sonucunu açıklar. Tarayıcıdan dönüş veya sayfanın açılması tek başına başarı kanıtı değildir. Mağaza akışında genel /v1/sandbox/payments/{id}/complete ucu kullanılamaz; sonuç mağaza ekranındaki test onayından gelmelidir.
İşlem tutarı korunur.
Ürün liste toplamı 306.00 AED Hesaplanan indirim 6.00 AED Nihai işlem tutarı 300.00 AED
Önce tam tutarlı ürün veya paket aranır. Tam eşleşme yoksa gerçek katalog ürünlerinin toplamı ile sabit hedef arasındaki fark, en fazla %20 sınırında gerçek sipariş indirimi olarak hesaplanır. Çark bu indirimi gösterir. Ürün fiyatları yükseltilmez ve merchant tutarına ikinci indirim uygulanmaz. Sınırlar içinde ürün bulunamazsa işlem başarısız olur.
Merchant TRY gibi başka para birimi kullanacaksa önceden firma fiyatlandırma profilinde AED tahsilat birimi ve günün kuru tanımlanır. Özgün tutar ve para birimi callback’te korunur. Örnek: 3.750 TRY → 300 AED; mağazada 300 AED eşleşir, merchant kaydı ve bildirimi 3.750 TRY kalır.
Sonucu imzayla doğrulayın.
Sonuç, firma ayarına tanımlanan HTTPS URL’ye POST application/json olarak gönderilir. Adres işlem gövdesinden alınmaz.
X-Arvona-Event-Id: <event-id>
X-Arvona-Timestamp: <Unix saniyesi>
X-Arvona-Signature: <küçük harf hex HMAC-SHA256>
{
"id": "22222222-2222-4222-8222-222222222222",
"type": "payment.succeeded",
"createdAt": "2026-10-19T20:00:00.000Z",
"data": {
"id": "11111111-1111-4111-8111-111111111111",
"reference": "xxxxpays-order-0001",
"amount": "300.00",
"currency": "AED",
"status": "SUCCEEDED",
"environment": "sandbox"
}
}Örnek kısaltılmıştır; data tam ödeme nesnesidir. Bildirim türleri: payment.succeeded, payment.failed, payment.expired. İmza ham HTTP gövdesi üzerinden doğrulanır; JSON’u yeniden serileştirmeyin.
HMAC-SHA256(callback_secret, timestamp + "." + rawBody)
import {createHmac, timingSafeEqual} from 'node:crypto';
export function verifyCallback(rawBody, headers, secret) {
const time = headers['x-arvona-timestamp'];
const signature = headers['x-arvona-signature'];
if (!/^\d{10}$/.test(time || '') || !/^[a-f0-9]{64}$/.test(signature || '')) return false;
if (Math.abs(Date.now() / 1000 - Number(time)) > 300) return false;
const expected = createHmac('sha256', secret).update(time + '.').update(rawBody).digest();
return timingSafeEqual(expected, Buffer.from(signature, 'hex'));
}
- İmzayı, ±5 dakika zaman aralığını ve header/body olay kimliğinin aynı olduğunu doğrulayın.
- Merchant referansını, özgün tutarı, para birimini ve sandbox ortamını kendi kaydınızla karşılaştırın.
- Olay kimliğini benzersiz kaydedin; sipariş güncellemesiyle aynı veritabanı işleminde tamamlayın.
- Kalıcı kayıt tamamlandığında
HTTP 200dönün. Daha önce işlenmiş olaya da 200 dönün. - Gönderim zaman aşımı 5 saniye; 2xx dışı cevaplar tekrar edilir. En fazla 8 deneme, 30 saniyeden 1 saate artan bekleme. Her denemede timestamp/imza yenilenir, olay kimliği korunur.
Callback endpoint’iniz imza doğrulaması sonrasında kısa yanıt vermelidir; örneğin {"received":true}. Ağ kesintilerinde bildirim birden çok kez gelebilir. İmza doğrulama ile tekil olay kontrolü birlikte uygulanır.
Kontrol edilecek durumlar.
| Kod | Yapılacak işlem |
|---|---|
| 401 INVALID_API_KEY | Anahtarın ve merchant’ın etkinliğini kontrol edin. |
| 403 IP_NOT_ALLOWED | İstek gönderen sunucunun gerçek çıkış IP’sini izin listesine ekletin. |
| 400 CUSTOMER_PROFILE_REQUIRED | Kullanıcı adı, ad, soyad ve e-postayı müşteri kaydından tamamlayın. |
| 400 INVALID_EMAIL / VALIDATION_ERROR | Alan biçimi ve uzunluğunu düzeltin. |
| 403 RISK_REJECTED | İstek risk kurallarından geçmedi; farklı anahtarla tekrar açmayın. |
| 409 FX_RATE_MISSING | Firma kur profilinin ve günün doğrudan kurunun tanımlanmasını bekleyin. |
| 409 IDEMPOTENCY_CONFLICT | Aynı anahtar için gövdeyi değiştirmeyin. |
| 429 RATE_LIMITED | Retry-After başlığına uyun. Anahtar başına 300, IP başına 600 istek/dakika. |
| 503 STORE_DISABLED / STORE_UNAVAILABLE / NO_ROUTE | Yeni işlem açmadan bağlantı ve yönlendirme durumunu kontrol edin; geçici hatada aynı anahtar/gövdeyle sınırlı tekrar yapın. |
Hata yanıtındaki error.requestId değerini destek incelemesi için saklayın. Kart/PAN, CVV ve T.C. kimlik numarası bu entegrasyonun alanları değildir.
Bağlantı açılmadan önce.
- İzinli IP + doğru API anahtarıyla başarılı istek.
- İzin dışı IP’den aynı anahtarın 403 dönmesi.
- Eksik müşteri alanlarının reddi; gönderilen müşteri kaydının korunması.
- Aynı isteğin eşzamanlı tekrarında tek ödeme ve tek mağaza işi.
- 306 − 6 = 300 AED eşleşmesi ve çark tutarının korunması.
- Başarılı, başarısız ve süresi dolan test işlemleri.
- Yanlış callback imzasının reddi; aynı olayın ikinci kez işlenmemesi.
- Callback alıcısı 5xx verdiğinde tekrar ve ardından 200 teslimatı.
- Başka merchant’ın işlem kimliğine erişimin engellenmesi.