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ı
Shoppiyen Hesabı Oluşturun
Shoppiyen paneline kayıt olun ve hesabınızı doğrulayın.
API Anahtarınızı Alın
Profil > API Ayarları bölümünden API anahtarınızı kopyalayın.
Entegrasyon Yöntemini Seçin
Hosted Checkout veya Quick Checkout yöntemlerinden birini seçin.
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.
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.
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.
api_id ve sunucunuzda tuttuğunuz gizli API anahtarı ile imza üretmeniz gerekir.
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.
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.
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.
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. |
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.
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
POSTPOST 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.
Tüm isteklerde api-key header'ı zorunludur.
1. Banka Gruplarını Listele
GETGET 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
GETGET 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
POSTPOST https://shoppiyen.com/api/pay/bank_transfer
İstek Parametreleri:
| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
| bank_id | integer | EVET | Banka ID (bta_id) |
| amount | decimal | EVET | Tutar (örn: 150.00) |
| currency | string | EVET | Para birimi: TRY, USD, EUR |
| order_id | string | EVET | Sipariş numarası |
| customer_name | string | EVET | Müşteri adı soyadı |
| client_ip | string | EVET | Müş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
GETGET 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.
api-key değerini sandbox anahtarına çevirerek test yapabilirsiniz.
Endpoint ve request body yapısı canlı ile aynıdır.
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 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. |
failed olur.
Sandbox Havale/EFT Ödeme Oluşturma Örneği
cURLcurl -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"
}'
sandbox_result alanını ekleyebilirsiniz. Zorunlu değildir.
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.
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"
}
is_valid=true ve official_status=successful sonucu alındığında sipariş başarılı duruma geçirilmelidir.
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. |