Payyex Geliştirici Dokümantasyonu

Payyex ödeme altyapısını projelerinize entegre etmenin en kolay yolu. İster hazır ürünlerinizi satın, ister dinamik tutarlarla ödeme alın. Modern REST API ve hazır Checkout sayfalarımızla dakikalar içinde ödeme almaya başlayın.


Entegrasyon Adımları

1

Payyex Hesabı Oluşturun

Payyex paneline kayıt olun ve hesabınızı doğrulayın.

2

API Anahtarınızı Alın

Profil > API Ayarları bölümünden API anahtarınızı kopyalayın.

3

Entegrasyon Yöntemini Seçin

Hosted Checkout veya Quick Checkout yöntemlerinden birini seçin.

4

Test Edin ve Yayına Alın

Entegrasyonunuzu test edin, her şey hazırsa canlıya alın.


Hosted Checkout

En basit entegrasyon yöntemi. Panelden ürününüzü oluşturun, size verilen linki sitenize ekleyin veya müşterinize gönderin.

Sandbox davranışı: Bayi panelinde Sandbox Modu aktifse kart ödemeleri Payyex test ortamında çalışır ve gerçek tahsilat oluşmaz. Test sonucu Payyex sandbox ekranlarından seçilir.
Yönlendirme URL notu: Hosted Checkout akışında success_url ve cancel_url değerleri URL'in query parametresi olarak verilmelidir. Form POST gövdesindeki aynı isimli alanlar Hosted Checkout yönlendirmesi için kullanılmaz.

URL Yapısı

https://payyex.com/checkout/{slug}/{id}?success_url={url}&cancel_url={url}
Parametre Tip Zorunlu Açıklama
slug string EVET Ürünün SEO dostu link yapısı.
id integer EVET Ürün ID numarası.
success_url url HAYIR Ödeme başarılı olduğunda yönlendirilecek URL.
cancel_url url HAYIR Ödeme iptal edildiğinde veya hata alındığında yönlendirilecek URL.

Quick Checkout (Dinamik Tutar)

Panelden ürün oluşturmanıza gerek kalmadan, dinamik tutarlarda ödeme almak için kullanılır. Güvenli entegrasyonda istekler api_id, ts ve signature alanları ile başlatılır.

Quick Checkout Sandbox: Sandbox entegrasyonunda da aynı imzalı akış kullanılır. Yalnızca Sandbox API erişiminize ait api_id ve sunucunuzda tuttuğunuz gizli API anahtarı ile imza üretmeniz gerekir.
Güvenlik Uyarısı: Quick Checkout isteğini her zaman kendi backend'inizde imzalayın. Ham api_key değerini tarayıcıya, mobil istemciye, JavaScript dosyasına veya herkese açık depolara koymayın. Tarayıcı tabanlı Quick Checkout kullanıyorsanız ilgili API erişiminde api_ip alanını 0.0.0.0 bırakın; sabit IP kısıtı verilirse müşteri isteği engellenir.
Döviz Desteği: currency parametresi ile USD, EUR, GBP gibi farklı para birimleri gönderebilirsiniz. Ödeme gönderdiğiniz tutar ve para birimi ile işlenir.
Örnek: 100 USD gönderirseniz ödeme 100 USD olarak açılır; TRY karşılığı yalnızca minimum tutar ve limit kontrollerinde kullanılır.

HTML Form Entegrasyonu (Önerilen)

POST
<!-- Payyex Quick Checkout Form -->
<form action="https://payyex.com/checkout/quick" method="POST">
    <input type="hidden" name="api_id" value="12">
    <input type="hidden" name="amount" value="200.00">
    <input type="hidden" name="currency" value="TRY">
    <input type="hidden" name="description" value="Siparis #12345">
    <input type="hidden" name="order_id" value="ORDER-12345">
    <input type="hidden" name="success_url" value="https://yoursite.com/payment/success">
    <input type="hidden" name="cancel_url" value="https://yoursite.com/payment/error">
    <input type="hidden" name="ts" value="1710000000">
    <input type="hidden" name="signature" value="HMAC_SHA256_SIGNATURE">
    <button type="submit">Odeme Yap</button>
</form>

PHP Entegrasyon Örneği

PHP
<?php
$apiId = 12;
$apiKey = 'YOUR_SECRET_API_KEY';
$amount = '200.00';
$currency = 'TRY';
$description = 'Sepet Odemesi';
$orderId = 'ORDER-12345';
$successUrl = 'https://yoursite.com/payment/success';
$cancelUrl = 'https://yoursite.com/payment/error';
$timestamp = (string) time();

$payload = [
    'api_id' => (string) $apiId,
    'amount' => $amount,
    'currency' => strtoupper($currency),
    'description' => $description,
    'order_id' => $orderId,
    'success_url' => $successUrl,
    'cancel_url' => $cancelUrl,
    'ts' => $timestamp,
];
ksort($payload);
$signature = hash_hmac('sha256', http_build_query($payload, '', '&', PHP_QUERY_RFC3986), $apiKey);

 echo '<form id="payForm" action="https://payyex.com/checkout/quick" method="POST">';
 foreach ($payload as $key => $value) {
     echo '<input type="hidden" name="' . htmlspecialchars($key, ENT_QUOTES, 'UTF-8') . '" value="' . htmlspecialchars($value, ENT_QUOTES, 'UTF-8') . '">';
 }
 echo '<input type="hidden" name="signature" value="' . htmlspecialchars($signature, ENT_QUOTES, 'UTF-8') . '">';
 echo '</form>';
 echo '<script>document.getElementById("payForm").submit();</script>';
?>

Geri Dönüş Parametreleri (Callback)

Ödeme işlemi tamamlandığında, müşteriyi success_url veya cancel_url adresinize yönlendirirken URL sonuna aşağıdaki parametreleri ekleriz:

Durum URL Parametreleri Örnek
BAŞARILI
status = success
transaction_id = {id}
order_id = {sizin_order_id} (gönderildiyse)
amount = {tutar}
currency = {para_birimi}
ts = {unix_timestamp}
hash = {hmac_sha256}
epin = {code} (varsa)
https://site.com/callback?status=success&transaction_id=TXN987654&order_id=ORDER-12345&amount=200.00¤cy=TRY&ts=1710000000&hash=HMAC_SHA256
HATA / İPTAL
status = error
message = {hata_mesaji}
order_id = {sizin_order_id} (gönderildiyse)
amount = {tutar}
currency = {para_birimi}
ts = {unix_timestamp}
hash = {hmac_sha256}
https://site.com/error?status=error&message=Bakiye+yetersiz&order_id=ORDER-12345&amount=200.00¤cy=TRY&ts=1710000000&hash=HMAC_SHA256

3 Adımda Kopyala-Yapıştır Entegrasyon (PHP)

EASY
<?php
function startQuickCheckout(): void
{
    $apiId = 12;
    $apiKey = 'YOUR_SECRET_API_KEY';
    $amount = '200.00';
    $currency = 'TRY';
    $description = 'Sepet Odemesi';
    $orderId = 'ORD-' . time() . '-' . random_int(1000, 9999);
    $successUrl = 'https://yoursite.com/payment/success.php';
    $cancelUrl = 'https://yoursite.com/payment/error.php';
    $timestamp = (string) time();

    $payload = [
        'api_id' => (string) $apiId,
        'amount' => $amount,
        'currency' => strtoupper($currency),
        'description' => $description,
        'order_id' => $orderId,
        'success_url' => $successUrl,
        'cancel_url' => $cancelUrl,
        'ts' => $timestamp,
    ];
    ksort($payload);
    $signature = hash_hmac('sha256', http_build_query($payload, '', '&', PHP_QUERY_RFC3986), $apiKey);

    echo '<form id="payyexQuickForm" action="https://payyex.com/checkout/quick" method="POST">';
    foreach ($payload as $key => $value) {
        echo '<input type="hidden" name="' . htmlspecialchars($key, ENT_QUOTES, 'UTF-8') . '" value="' . htmlspecialchars($value, ENT_QUOTES, 'UTF-8') . '">';
    }
    echo '<input type="hidden" name="signature" value="' . htmlspecialchars($signature, ENT_QUOTES, 'UTF-8') . '">';
    echo '</form>';
    echo '<script>document.getElementById("payyexQuickForm").submit();</script>';
}
?>

Kimlik Doğrulama

Tüm API isteklerinde kimlik doğrulama için api-key header'ı kullanmanız gerekmektedir. API anahtarınızı Payyex panelinden Profil > API Ayarları bölümünden alabilirsiniz.

API Anahtarı Kullanımı

Parametre Tip Açıklama
api-key (header) string Payyex panelinden aldığınız benzersiz API anahtarınız.
Önemli: API anahtarınızı asla istemci tarafında (JavaScript, mobil uygulama) açık şekilde kullanmayın. Anahtarınızı sunucu tarafında saklayın ve gizli tutun.

Quick Checkout ile Ödeme Oluşturma

Dinamik tutarlarla ödeme almak için Quick Checkout endpoint'ini kullanabilirsiniz. Bu endpoint /api altında değildir; doğrudan /checkout/quick adresine form-POST yapılır.

Not: Quick Checkout akışında api_id, ts ve signature zorunludur. api_key artık istek parametresi olarak gönderilmez; sadece sunucu tarafında imza üretmek için kullanılır.

Endpoint

POST
POST https://payyex.com/checkout/quick

İstek Parametreleri

Parametre Tip Zorunlu Açıklama
api_id integer EVET Panel > API Ayarları bölümündeki API erişim kimliği.
ts unix timestamp EVET İsteğin üretildiği an. Varsayılan imza süresi 30 dakikadır.
signature string EVET `api_id, amount, currency, description, order_id, success_url, cancel_url, ts` alanlarının HMAC-SHA256 imzası. Gizli API anahtarı sadece sunucuda kullanılır.
amount decimal EVET Ödeme tutarı (örn: 200.00). Canlı işlemlerde sistemde tanımlı minimum TRY tutarının altı reddedilir.
currency string EVET Para birimi: TRY, USD, EUR, GBP. Ödeme gönderilen para birimiyle oluşturulur; TRY karşılığı minimum tutar ve limit kontrollerinde kullanılır.
order_id string EVET Harici sipariş referansınız. İmzalı akışta zorunludur.
description string HAYIR Ödeme açıklaması (örn: Sipariş #123)
success_url url EVET Başarılı ödeme sonrası yönlendirme URL'i. Üretimde HTTPS zorunludur.
cancel_url url EVET Başarısız/iptal ödeme sonrası yönlendirme URL'i. Üretimde HTTPS zorunludur.

Sandbox API (Test Ortamı)

Sandbox ortamı ile canlı sisteme dokunmadan entegrasyonunuzu uçtan uca test edebilirsiniz. Sandbox anahtarları sadece test için çalışır ve gerçek tahsilat oluşturmaz.

En kritik nokta: Mevcut entegrasyon kodunuzu değiştirmeden, sadece api-key değerini sandbox anahtarına çevirerek test yapabilirsiniz. Endpoint ve request body yapısı canlı ile aynıdır.
Kurulum: Panel > API Ayarları bölümünden önce Sandbox Modu = Aktif yapın, ardından Sandbox (Test) tipinde API anahtarı oluşturun.

Sandbox'ta Desteklenen Endpointler

Method Endpoint Açıklama
POST /api/pay/credit_card Kart sandbox akışı. Dönüşte redirect_url ile test checkout ekranına gider.
POST /api/sale/webhook/verify Canlı + sandbox callback doğrulama (Quick Checkout fallback dahil).
POST /api/sale/info ve /api/sale/info/transaction Sandbox başarılı ödemeyi sorgulama.

Sandbox Kart Testi (Senaryo Seçimi)

Asıl test yöntemi: /api/pay/credit_card çağrısından dönen redirect_url ekranında 3D Onay, 3D Ret veya Bakiye Yetersiz butonlarından birini seçerek sonucu siz belirlersiniz.

Kart numaralarıyla otomatik senaryo eşleştirme sadece alternatif (legacy) test yoludur; zorunlu değildir.
Kart Numarası (Opsiyonel) Kartla Test Edilirse Not
4111 1111 1111 1111 successful Visa onaylı ödeme.
4012 0000 0000 0081 successful Visa debit onaylı ödeme.
5200 0000 0000 0007 successful Mastercard onaylı ödeme.
5100 0000 0000 0008 successful Mastercard debit onaylı ödeme.
3700 0000 0000 002 successful American Express onaylı ödeme; 4 haneli CVV kullanın.
4000 0000 0000 3220 3DS 3DS challenge senaryosu. Sandbox OTP/parola: Checkout1!
4000 0000 0000 3238 3DS 3DS frictionless onay senaryosu.
4000 0000 0000 3246 failed 3DS doğrulama başarısız senaryosu.
4000 0000 0000 3253 failed 3DS timeout senaryosu.
4000 0000 0000 0002 failed Yetersiz bakiye senaryosu.
4000 0000 0000 0010 failed Süresi dolmuş kart senaryosu.
4000 0000 0000 0028 failed İşlem reddi senaryosu.
4000 0000 0000 0036 failed Geçersiz kart senaryosu.
4000 0000 0000 0044 failed Kayıp/çalıntı kart senaryosu.
4000 0000 0000 0051 failed Limit aşıldı senaryosu.
5000 0000 0000 0009 failed Mastercard ret senaryosu.
4000 0000 0000 0069 failed Gateway timeout senaryosu.
4000 0000 0000 0077 failed Processing error senaryosu.
Kart formu notu: Kartla test yolunu kullanırsanız son kullanma tarihi gelecekte olmalı ve CVV alanı numerik olmalıdır; geçmiş tarih girilirse sandbox sonucu failed olur.

Sandbox Notları

1. Tüm sandbox isteklerinde kimlik doğrulama api-key header'ı ile yapılır; canlı key yerine sandbox key kullanmanız yeterlidir.

2. Sandbox ödemeler panelde Sandbox rozetiyle görünür; canlı bakiyeyi, net kazancı ve gerçek tahsilatı etkilemez.

3. Kart testlerinde başarılı, ret, 3DS ve hata senaryoları yukarıdaki kartlarla simüle edilir.

4. Papara sandbox desteği şu an yoktur; kredi kartı sandbox testleri aktiftir.


Webhook (Bildirimler)

Ödeme işlemleri tamamlandığında sunucunuza otomatik bildirim göndermek için webhook URL'inizi tanımlayabilirsiniz. Webhook'lar, ödeme durumu değişikliklerini gerçek zamanlı olarak almanızı sağlar.

Webhook Ayarları

Webhook URL'inizi Payyex Paneli > Profil > API Ayarları bölümünden tanımlayabilirsiniz.

Global ödeme bildirimi URL'i

POST https://payyex.com/api/public/payment/notification

Harici ödeme panelinde global bildirim URL'i istenirse bu adres kullanılabilir. Ödeme başına gönderilen bildirim URL'leri ayrıca otomatik oluşturulur.

İpucu: Webhook URL'iniz HTTPS protokolü kullanmalı ve 200 HTTP durum kodu döndürmelidir.

Webhook Payload Örneği

{
    "order_id": "ORD-12345",
    "hash": "5c3d2b3b0a1d9f...",
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "status": "successful",
    "message": "successful",
    "type": "credit_card",
    "amount": 200.00,
    "currency": "TRY",
    "transaction_id": "a1258260-0331-49ad-ad86-5e9f_313"
}
Temel Güvenlik Kuralı: Webhook isteği tek başına ödeme onayı olarak değerlendirilmemelidir. Aşağıdaki doğrulama endpoint'i çağrılmalı; yalnızca is_valid=true ve official_status=successful sonucu alındığında sipariş başarılı duruma geçirilmelidir.
Kritik Entegrasyon Kuralları:
1) Webhook isteği alındığında uç noktanızın hızlı şekilde 200 OK dönmesi, asıl işleme adımlarının arka planda yürütülmesi önerilir.
2) success_url/cancel_url sadece kullanıcı yönlendirme bilgisidir; ödeme kesinlik kriteri değildir.
3) Gelen webhook verisi (order_id, uuid, status, hash) /api/sale/webhook/verify endpoint'i üzerinden doğrulanmalıdır.
4) Karar kuralı: is_valid=true ve official_status=successful birlikte sağlanıyorsa sipariş başarılıya alınmalıdır; diğer tüm durumlarda başarılıya alınmamalıdır.
5) Webhook aynı sipariş için birden fazla kez gelebileceğinden uuid veya order_id bazlı idempotent kontrol zorunludur.
6) /api/sale/verify ve /api/sale/verify/transaction kart/papara akışında manuel onay amacıyla kullanılmaz; ilgili akış için doğru endpoint /api/sale/webhook/verify'dir.
7) mode alanı (api_cc_pos, quick_checkout_fallback, sandbox) bilgilendirme amaçlıdır; operasyonel karar alanları is_valid ve official_status olmalıdır.

Webhook Doğrulama Endpoint'i

POST https://payyex.com/api/sale/webhook/verify

Header: api-key: YOUR_API_KEY

{
    "order_id": "ORD-12345",
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "status": "successful",
    "hash": "5c3d2b3b0a1d9f..."
}
{
    "success": true,
    "is_valid": true,
    "payment_confirmed": true,
    "official_status": "successful",
    "status_match": true,
    "hash_match": true,
    "order_id": "ORD-12345",
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "mode": "quick_checkout_fallback"
}

Not: Quick Checkout akışlarında doğrulama sonucu mode=quick_checkout_fallback dönebilir. Bu beklenen davranıştır.

Webhook Durumları

status Açıklama
successful Ödeme başarıyla tamamlandı.
failed Ödeme başarısız oldu.