Shoppiyen Geliştirici Dokümantasyonu

Shoppiyen ö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

Shoppiyen Hesabı Oluşturun

Shoppiyen 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 Hosted Checkout kart ve havale akışları gerçek ödeme servisine gitmez; test sonucu 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.
Hosted Checkout + Havale/EFT: Bayinizde api_perm_bank_transfer=1 ve pm_bank_transfer=1 birlikte açık olmalıdır.

URL Yapısı

https://shoppiyen.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. Sistem otomatik olarak güncel Google Finance kuru üzerinden TRY'ye çevirir.
Örnek: 100 USD gönderirseniz, anlık kurla (örn: 34.50) hesaplanarak 3450 TRY olarak işlenir.
Quick Checkout + Havale/EFT: Bayinizde api_perm_bank_transfer=1 ve pm_bank_transfer=1 ise müşteri Quick Checkout ekranında Havale/EFT seçebilir. Ödeme bekleme sayfasında izlenir; onaylandığında success_url, başarısız olduğunda cancel_url adresine yönlendirilir.
Not: Entegrasyonu yapan taraf olarak bank_id veya bank-sender-name göndermeniz gerekmez. Bu bilgiler, müşteri Quick Checkout sayfasında Havale/EFT seçtiğinde ekrandan alınır.

HTML Form Entegrasyonu (Önerilen)

POST
<!-- Shoppiyen Quick Checkout Form -->
<form action="https://shoppiyen.com/checkout/quick" method="POST">
    <input type="hidden" name="api_id" value="12">
    <input type="hidden" name="amount" value="150.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 = '150.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://shoppiyen.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=150.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=150.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 = '150.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="shoppiyenQuickForm" action="https://shoppiyen.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("shoppiyenQuickForm").submit();</script>';
}
?>

Kimlik Doğrulama

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

API Anahtarı Kullanımı

Parametre Tip Açıklama
api-key (header) string Shoppiyen 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://shoppiyen.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: 150.00)
currency string EVET Para birimi: TRY, USD, EUR, GBP. TRY dışındaki para birimleri otomatik olarak güncel kurla TRY'ye çevrilir.
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.

Havale/EFT (Bank Transfer)

Müşterilerinizin banka havalesi veya EFT ile ödeme yapmasını sağlayın. Sistem, gelen ödemeleri otomatik olarak eşleştirir ve anında onaylar.

Otomatik Eşleştirme: FAST ödemeleri otomatik olarak eşleştirilir. Gönderici adı + tutar eşleşirse anında onaylanır.

Tüm isteklerde api-key header'ı zorunludur.

1. Banka Gruplarını Listele

GET
GET https://shoppiyen.com/api/pay/bank_transfer/bank-group/list

Kullanılabilir banka gruplarını döndürür.

Örnek Yanıt:
{
    "result": [
        { "id": 1, "name": "Varsayılan" },
        { "id": 7, "name": "Halkbank" }
    ]
}

2. Gruba Ait Bankaları Getir

GET
GET https://shoppiyen.com/api/pay/bank_transfer/get/banks/{bank_group_id}
Örnek Yanıt:
{
    "result": [
        {
            "bta_id": 5,
            "bta_name": "Halkbank",
            "bta_fullname": "SHOPPIYEN A.Ş.",
            "bta_iban": "TR39 0001 2001 3100 0010 1025 75",
            "bta_description": "Havale açıklamasına sipariş numaranızı yazın"
        }
    ]
}

3. Havale/EFT Ödemesi Oluştur

POST
POST https://shoppiyen.com/api/pay/bank_transfer
İstek Parametreleri:
Parametre Tip Zorunlu Açıklama
bank_idintegerEVETBanka ID (bta_id)
amountdecimalEVETTutar (örn: 150.00)
currencystringEVETPara birimi: TRY, USD, EUR
order_idstringEVETSipariş numarası
customer_namestringEVETMüşteri adı soyadı
client_ipstringEVETMüşteri IP adresi
Başarılı Yanıt:
{
    "message": "successful",
    "payment_id": "550e8400-e29b-41d4-a716-446655440000",
    "order_id": "ORD-12345"
}

Dönen payment_id değeri UUID formatındadır. Bu değeri durum kontrolünde kullanacaksanız /api/pay/bank_transfer/uuid/{payment_id} endpoint'ini çağırın. /api/pay/bank_transfer/control/{payment_id} endpoint'i ise canlıda havale takip numarası (br_tracking_no) bekler.

Quick Checkout havale/EFT onay callback'lerinde de status, order_id, uuid, hash, type=bank_transfer, amount, currency ve transaction_id alanları gönderilir. Güvenli onay için /api/sale/webhook/verify kullanılmalıdır.

4. Ödeme Durumu Kontrol

GET
GET https://shoppiyen.com/api/pay/bank_transfer/control/{payment_id}

veya UUID ile:

GET https://shoppiyen.com/api/pay/bank_transfer/uuid/{uuid}

Canlıda payment_id alanına havale takip numarası (br_tracking_no) gönderilmelidir.

Yanıt:
{
    "result": {
        "br_tracking_no": "BT-1706789012-ABC123",
        "br_name": "Ahmet Yılmaz",
        "br_price": 150.00,
        "br_currency": "TRY",
        "br_bank_name": "Halkbank",
        "br_iban": "TR39...",
        "sale_status": 1,  // 0=Bekliyor, 1=Onaylandı, 2=İptal
        "sale_date": 1706789012
    }
}

Ödeme Durum Kodları

0 Bekliyor - Ödeme henüz onaylanmadı
1 Onaylandı - Ödeme başarıyla tamamlandı
2 İptal/Başarısız - Ödeme reddedildi veya iptal edildi

PHP Entegrasyon Örneği

PHP
<?php
$apiKey = "YOUR_API_KEY";
$baseUrl = "https://shoppiyen.com/api";

// 1. Bankaları çek
$banks = json_decode(file_get_contents(
    $baseUrl . "/pay/bank_transfer/get/banks/7",
    false, stream_context_create(['http' => [
        'header' => "api-key: " . $apiKey
    ]])
));

// 2. Ödeme oluştur
$payment = [
    'bank_id' => $banks->result[0]->bta_id,
    'amount' => 150.00,
    'currency' => 'TRY',
    'order_id' => 'ORD-123',
    'customer_name' => 'Ahmet Yılmaz',
    'client_ip' => $_SERVER['REMOTE_ADDR']
];

$response = json_decode(file_get_contents($baseUrl . "/pay/bank_transfer", false,
    stream_context_create(['http' => [
        'method' => 'POST',
        'header' => "api-key: " . $apiKey . "\r\nContent-Type: application/json",
        'content' => json_encode($payment)
    ]])
));

// 3. Banka bilgisi bankalar endpointinden alınır, create yanıtı kayıt kimliği döner
echo "IBAN: " . $banks->result[0]->bta_iban . PHP_EOL;
echo "Payment ID: " . $response->payment_id . PHP_EOL;
echo "Order ID: " . $response->order_id;
?>

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.
GET /api/pay/bank_transfer/bank-group/list Sandbox banka gruplarını listeler.
GET /api/pay/bank_transfer/get/banks/{bank_group_id} Sandbox test IBAN listesi döner.
POST /api/pay/bank_transfer Sandbox havale oluşturur. Canlıdaki aynı alanlarla çalışır. Varsayılan sonuç successful; isterseniz opsiyonel sandbox_result ile pending/failed simüle edebilirsiniz.
GET /api/pay/bank_transfer/control/{payment_id}?sandbox_result=successful|failed Opsiyonel ileri test endpointidir. Pending sandbox havaleyi başarılı/başarısız duruma geçirir ve callback tetikler.
GET /api/pay/bank_transfer/uuid/{uuid} Sandbox havaleyi UUID ile sorgular.
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
4242 4242 4242 4242 successful Buton yerine kartla test yaparsanız başarılı döner.
5555 5555 5555 4444 successful Buton yerine kartla test yaparsanız başarılı döner.
4000 0000 0000 0002 failed Buton yerine kartla test yaparsanız kart reddi döner.
4000 0000 0000 9995 failed Buton yerine kartla test yaparsanız yetersiz bakiye döner.
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 Havale/EFT Ödeme Oluşturma Örneği

cURL
curl -X POST "https://shoppiyen.com/api/pay/bank_transfer" \
  -H "api-key: YOUR_SANDBOX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "bank_id": 99001,
    "amount": "150.00",
    "currency": "TRY",
    "order_id": "SBX-BT-1001",
    "client_ip": "1.1.1.1",
    "customer_name": "Test Kullanici",
    "customer_email": "test@example.com",
    "customer_phone": "905555555555"
  }'
Opsiyonel simülasyon: Eğer akışınızda pending/failed senaryosu test etmek isterseniz, sadece test amaçlı sandbox_result alanını ekleyebilirsiniz. Zorunlu değildir.
Yetki farkı (önemli): API üzerinden havale/EFT için api_perm_bank_transfer=1 yeterlidir (ve callback URL aktif olmalıdır). Hosted/Quick Checkout ekranında havale seçeneğinin görünmesi için buna ek olarak pm_bank_transfer=1 da açık olmalıdır.

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 canlı satış kayıtlarından ayrıdır; canlı bakiyeyi ve gerçek tahsilatı etkilemez.

3. Papara sandbox desteği şu an yoktur; kredi kartı ve havale/EFT 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 Shoppiyen Paneli > Profil > API Ayarları bölümünden tanımlayabilirsiniz.

İ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": 150.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://shoppiyen.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.