Geliştirici Merkezi
Kredi Kartı ve Ödeme Linki ile tahsilat. Tek entegrasyon yöntemi: PayStripet Checkout (Ödeme) Sayfası.
Adım Adım Entegrasyon
Kredi Kartı Entegrasyonu
Checkout (Ödeme) Sayfasına Yönlendirme
- Başvuru yapın (Başvuru Formu); onaylanınca mağaza panelinizde Mağaza No, Publishable Key ve Secret Key oluşur. Aşağıdaki örneklerde bu değerleri kendinizinkilerle değiştirin.
- Müşteri sitenizde "Öde" butonuna basar.
- Sunucunuz sipariş bilgisini (tutar, sipariş no, ürün, sipariş özeti) Secret Key ile imzalayıp bir
tokenüretir (önerilir; isterseniz sadecepk+amount+orderparametresi de yeterli). İsteğe bağlı olarakorder_summary(sipariş özeti),product_image(ürün görseli) vesite_logo(site logonuz) bağlantılarını da ekleyin; ödeme sayfasında logo üstte, ürün görseli sipariş özetinde görünür. - Müşteriyi
/checkout?pk=…&token=…adresine yönlendirirsiniz. - Müşteri e-posta, telefon ve kart bilgisini PayStripet checkout sayfasında girer, bankanın 3D Secure SMS doğrulamasını yapar.
- Müşteri
return_urladresinizemp_status, mp_order, mp_tid, mp_tokenile döner; sipariş durumunu webhook ile kesinleştirin. - Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
| Dosya / Sayfa | Nereye? | Ne yapar? |
|---|---|---|
odeme.php | Sepet / sipariş özeti sayfanızdaki "Ödeme Yap" butonunun gittiği yer (örn. https://siteniz.com/odeme.php) | Siparişi veritabanınıza "ödeme bekliyor" olarak kaydeder, token üretir ve müşteriyi PayStripet ödeme sayfasına yönlendirir. Aşağıdaki PHP / Node.js / Python kodu bu dosyaya yazılır. |
siparis-sonuc.php | return_url olarak verdiğiniz adres (örn. https://siteniz.com/siparis-sonuc) | Müşteri ödeme sonrası buraya döner. mp_status değerine göre "Teşekkürler" veya "Ödeme başarısız" mesajı gösterin. Siparişi burada değil, webhook ile kesinleştirin. |
paystripet-webhook.php | Sunucunuzda herkese açık bir adres; Panel → Ayarlar → İşyeri Bildirimleri alanına yazılır | İmzayı doğrular ve siparişi "ödendi" / "iptal" olarak günceller. |
<?php
$pk = 'pk_live_XXXXXXXXXXXXXXXX';
$secret = 'sk_live_XXXXXXXXXXXXXXXX'; // yalnızca sunucuda
$payload = ['amount' => 149.90, 'order' => 'ORD-' . time(), 'currency' => 'TRY',
'product' => 'Örnek Ürün', 'order_summary' => '1 adet Örnek Ürün', 'product_image' => 'https://siteniz.com/img/urun.jpg', 'site_logo' => 'https://siteniz.com/img/logo.png'];
$b64 = fn($x) => rtrim(strtr(base64_encode($x), '+/', '-_'), '=');
$h = $b64(json_encode(['alg' => 'HS256', 'typ' => 'JWT']));
$b = $b64(json_encode($payload, JSON_UNESCAPED_UNICODE));
$token = "$h.$b." . $b64(hash_hmac('sha256', "$h.$b", $secret, true));
header('Location: https://paystripet.com/checkout?pk=' . urlencode($pk) . '&token=' . urlencode($token) . '&return_url=' . urlencode('https://siteniz.com/siparis-sonuc'));# Token olmadan, parametrelerle ödeme bağlantısı (tarayıcıda açılır)
curl -I "https://paystripet.com/checkout?pk=pk_live_XXXXXXXXXXXXXXXX&amount=149.90&order=ORD-1001¤cy=TRY&product_image=https%3A%2F%2Fsiteniz.com%2Fimg%2Furun.jpg&site_logo=https%3A%2F%2Fsiteniz.com%2Fimg%2Flogo.png&return_url=https%3A%2F%2Fsiteniz.com%2Fsiparis-sonuc"
# İmzalı token (bash + openssl)
b64(){ openssl base64 -A | tr '+/' '-_' | tr -d '='; }
H=$(printf '{"alg":"HS256","typ":"JWT"}' | b64)
B=$(printf '{"amount":149.90,"order":"ORD-1001","currency":"TRY","product_image":"https://siteniz.com/img/urun.jpg","site_logo":"https://siteniz.com/img/logo.png"}' | b64)
S=$(printf '%s' "$H.$B" | openssl dgst -sha256 -hmac 'sk_live_XXXXXXXXXXXXXXXX' -binary | b64)
echo "https://paystripet.com/checkout?pk=pk_live_XXXXXXXXXXXXXXXX&token=$H.$B.$S"const crypto = require('crypto');
const pk = 'pk_live_XXXXXXXXXXXXXXXX', secret = 'sk_live_XXXXXXXXXXXXXXXX'; // yalnızca sunucuda
const b64 = (x) => Buffer.from(x).toString('base64url');
const h = b64(JSON.stringify({ alg: 'HS256', typ: 'JWT' }));
const b = b64(JSON.stringify({ amount: 149.90, order: 'ORD-' + Date.now(), currency: 'TRY', order_summary: '1 adet Örnek Ürün', product_image: 'https://siteniz.com/img/urun.jpg', site_logo: 'https://siteniz.com/img/logo.png' }));
const s = crypto.createHmac('sha256', secret).update(h + '.' + b).digest('base64url');
const url = 'https://paystripet.com/checkout?pk=' + encodeURIComponent(pk) + '&token=' + `${h}.${b}.${s}` + '&return_url=' + encodeURIComponent('https://siteniz.com/siparis-sonuc');
// Express: res.redirect(url);import base64, hashlib, hmac, json, time, urllib.parse
pk, secret = 'pk_live_XXXXXXXXXXXXXXXX', 'sk_live_XXXXXXXXXXXXXXXX' # yalnızca sunucuda
b64 = lambda x: base64.urlsafe_b64encode(x).rstrip(b'=').decode()
h = b64(json.dumps({'alg': 'HS256', 'typ': 'JWT'}).encode())
b = b64(json.dumps({'amount': 149.90, 'order': f'ORD-{int(time.time())}', 'currency': 'TRY', 'product_image': 'https://siteniz.com/img/urun.jpg', 'site_logo': 'https://siteniz.com/img/logo.png'}).encode())
s = b64(hmac.new(secret.encode(), f'{h}.{b}'.encode(), hashlib.sha256).digest())
url = 'https://paystripet.com/checkout?' + urllib.parse.urlencode({'pk': pk, 'token': f'{h}.{b}.{s}', 'return_url': 'https://siteniz.com/siparis-sonuc'})
# Flask: return redirect(url)Diğer
Ödeme Linki ile Tahsilat
- Başvuru yapın (Başvuru Formu); onaylanınca mağaza panelinizde Mağaza No, Publishable Key ve Secret Key oluşur. Aşağıdaki örneklerde bu değerleri kendinizinkilerle değiştirin.
- Panel → Ödeme Linkleri → + Link Oluştur ile tutar, para birimi ve ürün girin.
- Oluşan linki veya QR kodunu WhatsApp, e-posta ya da sosyal medyada paylaşın.
- Müşteri linkten açık yöntemlerinizle öder; link ödenince otomatik kapanır.
- Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
| Dosya / Sayfa | Nereye? | Ne yapar? |
|---|---|---|
Kod gerekmez | Panel → Ödeme Linkleri | Link oluşturup WhatsApp / e-posta / sosyal medyada paylaşın. Sitenizde göstermek isterseniz linki bir butonun href değerine koymanız yeterli. |
Ödeme Sonucu Bildirimi (Webhook)
- Başvuru yapın (Başvuru Formu); onaylanınca mağaza panelinizde Mağaza No, Publishable Key ve Secret Key oluşur. Aşağıdaki örneklerde bu değerleri kendinizinkilerle değiştirin.
- Sunucunuzda bildirim alacak bir adres hazırlayın (örn.
https://siteniz.com/paystripet-webhook). - Panel → Ayarlar → İşyeri Bildirimleri alanına bu adresi kaydedip aktif edin.
- Gelen her istekte
X-PayStripet-Signature: sha256=…başlığını, ham gövdenin Secret Key ile HMAC-SHA256 (hex) değeriyle karşılaştırın. - İmza doğruysa
statusalanına göre siparişi güncelleyin (success / pending / rejected / refunded) ve200dönün. - Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
| Dosya / Sayfa | Nereye? | Ne yapar? |
|---|---|---|
paystripet-webhook.php | Sitenizin kök dizini veya /api altı (örn. https://siteniz.com/paystripet-webhook.php). Oturum/giriş kontrolü OLMAMALI, POST kabul etmeli. | Aşağıdaki kodu bu dosyaya yapıştırın; adresi Panel → Ayarlar → İşyeri Bildirimleri alanına kaydedip "Aktif" yapın. |
Sipariş tablonuz | Veritabanınız | order_id ile siparişi bulup status alanına göre güncelleyin. Aynı bildirim birden fazla gelebilir; daha önce işlenmişse tekrar işlemeyin. |
<?php
$secret = 'sk_live_XXXXXXXXXXXXXXXX';
$body = file_get_contents('php://input');
$sig = $_SERVER['HTTP_X_PAYSTRIPET_SIGNATURE'] ?? '';
if (!hash_equals('sha256=' . hash_hmac('sha256', $body, $secret), $sig)) { http_response_code(401); exit; }
$e = json_decode($body, true); // status, order_id, tid, amount, currency, method
// siparişi güncelleyin
http_response_code(200); echo 'OK';# Kendi webhook adresinizi imzalı örnek istekle test edin
BODY='{"event":"payment.result","status":"success","order_id":"SIP-1001","amount":149.9,"currency":"TRY"}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac 'sk_live_XXXXXXXXXXXXXXXX' | sed 's/^.* //')
curl -X POST "https://siteniz.com/paystripet-webhook" -H 'Content-Type: application/json' -H "X-PayStripet-Signature: sha256=$SIG" -d "$BODY"const crypto = require('crypto'), express = require('express');
const secret = 'sk_live_XXXXXXXXXXXXXXXX', app = express();
app.post('/paystripet-webhook', express.raw({ type: 'application/json' }), (req, res) => {
const sig = 'sha256=' + crypto.createHmac('sha256', secret).update(req.body).digest('hex');
const got = req.get('X-PayStripet-Signature') || '';
if (sig.length !== got.length || !crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(got))) return res.sendStatus(401);
const e = JSON.parse(req.body); // status, order_id, tid, amount, currency
res.send('OK');
});
app.listen(3000);import hashlib, hmac, json
from flask import Flask, request
secret, app = 'sk_live_XXXXXXXXXXXXXXXX', Flask(__name__)
@app.post('/paystripet-webhook')
def hook():
sig = 'sha256=' + hmac.new(secret.encode(), request.get_data(), hashlib.sha256).hexdigest()
if not hmac.compare_digest(sig, request.headers.get('X-PayStripet-Signature', '')):
return '', 401
e = json.loads(request.get_data()) # status, order_id, tid, amount, currency
return 'OK'Ödeme Yöntemleri
Başvuru sırasında kullanmak istediğiniz yöntemleri seçersiniz: Kredi Kartı, Havale/EFT ve Link ile Ödeme. PayStripet yöneticisi onaylarken hangi yöntemlerin açılacağını belirler; sonradan da açıp kapatabilir.
- Tek API anahtarı tüm yöntemlerde kullanılır; yalnızca onaylı yöntemler çalışır.
- Kapalı bir yöntemin sayfası veya API'si
"… yöntemi bu üye işyeri için aktif değil."hatasıyla reddedilir. - Mağaza paneliniz (menü, işlem filtreleri, entegrasyon dokümanı) yalnızca açık yöntemlere göre oluşur.
API Anahtarları
Mağaza Paneli → API Anahtarları / Entegrasyon bölümünden alın:
| Alan | Zorunlu | Açıklama |
|---|---|---|
merchant_no (Mağaza No) | — | Üye işyeri numaranız. |
publishable_key (pk / api_key) | — | Herkese açık anahtar; ödeme sayfası adreslerinde ve formlarda kullanılır. |
secret_key | — | GİZLİ. Sadece sunucunuzda tutun; imza (hash), webhook ve mp_token doğrulamasında kullanılır. |
return_url adresi https olmalı ve bu alan adında bulunmalıdır.Para Birimleri
Ödeme hangi para biriminde gönderilirse o para biriminde alınır, kaydedilir ve bakiyenize o para biriminde eklenir (TL'ye çevrilmez). Desteklenen kodlar: TRY (₺), USD ($), EUR (€), GBP (£), RUB (₽). currency gönderilmezse TRY kabul edilir; TL yazımı da TRY sayılır.
- Checkout sayfası (
/checkout):¤cy=EURparametresi veya token/data içindecurrencyalanı. - Kart: bankaya giden istekte
currencygelen para birimiyle iletilir. - Dönüş alanları,
mp_token, postMessage ve webhook'tacurrencyalanı bulunur. Mağaza panelinde bakiye ve para çekme para birimine göre ayrı tutulur.
GET https://paystripet.com/checkout?pk=PUBLISHABLE_KEY&amount=49.90¤cy=EUR&order=SIP-1002
Kredi Kartı — Checkout (Ödeme) Sayfası
Müşteriyi PayStripet ödeme sayfasına yönlendirin; kart bilgisi PayStripet'de girilir, banka 3D Secure (SMS) akışı çalışır.
GET https://paystripet.com/checkout?pk=PUBLISHABLE_KEY&amount=149.90&order=SIP-1001&return_url=https%3A%2F%2Fsiteniz.com%2Fsonuc
| Alan | Zorunlu | Açıklama |
|---|---|---|
pk | Evet | Publishable key |
amount | Evet | Tutar. Sayfada %2,09 hizmet bedeli eklenmiş toplam gösterilir. |
currency | Hayır | TRY (varsayılan), USD, EUR, GBP, RUB |
order | Hayır | Sipariş numaranız |
product | Hayır | Ürün adı |
order_summary | Hayır | Sipariş özeti metni (örn. "2 adet Spor Ayakkabı, 42 numara"). Checkout sayfasındaki sipariş özetinde gösterilir. |
product_image | Hayır | Ürün görselinin bağlantısı (https). Checkout sayfasında sipariş özetinde gösterilir. |
site_logo | Hayır | Site logonuzun bağlantısı (https). Checkout sayfasının üst kısmında gösterilir. |
return_url | Hayır | Ödeme sonrası dönüş adresi (bkz. Dönüş) |
token / data | Hayır | Yukarıdaki alanları imzalı token (önerilir) veya data parametresiyle gönderme |
Görsel alanları URL parametresi olarak veya imzalı token/data içinde gönderilebilir; gönderilmezse sayfa görselsiz, normal şekilde açılır.
GET https://paystripet.com/checkout?pk=PUBLISHABLE_KEY&amount=149.90&order=SIP-1001&product=Spor%20Ayakkab%C4%B1&order_summary=1%20adet%2C%2042%20numara&product_image=https%3A%2F%2Fsiteniz.com%2Fimg%2Furun.jpg&site_logo=https%3A%2F%2Fsiteniz.com%2Fimg%2Flogo.png&return_url=https%3A%2F%2Fsiteniz.com%2Fsonuc
{"amount":149.90,"order":"SIP-1001","product":"Spor Ayakkabı","order_summary":"1 adet Spor Ayakkabı, 42 numara","product_image":"https://siteniz.com/img/urun.jpg","site_logo":"https://siteniz.com/img/logo.png"} ← token / data içeriği örneği Müşteri ödeme öncesi "Ödeme sözleşmesi şartlarını okudum, onaylıyorum" kutusunu işaretler.
Havale/EFT — Ödeme Sayfası
Checkout sayfasıyla aynı tasarım ve aynı parametrelerle çalışır; tek fark adrestir: /bank-transfer. Müşteri işyeri logosunu, ürün görselini, tutarı ve sipariş özetini görür; e-posta ve telefonunu girer, gösterilen PayStripet IBAN'ına havale yapar, gönderen adını yazar ve dekontu yükleyerek (zorunlu) "Ödemeyi Yaptım, Bildir" der.
GET https://paystripet.com/bank-transfer?pk=PUBLISHABLE_KEY&amount=149.90&order=SIP-1001&product=Spor%20Ayakkab%C4%B1&order_summary=1%20adet&product_image=https%3A%2F%2Fsiteniz.com%2Fimg%2Furun.jpg&site_logo=https%3A%2F%2Fsiteniz.com%2Fimg%2Flogo.png&return_url=https%3A%2F%2Fsiteniz.com%2Fsonuc
- Bildirim sonrası işlem pending (onay bekliyor) olarak açılır ve webhook ile bildirilir.
- Ödeme hesaba ulaşınca yönetici (Havale/EFT Onay) veya üye işyeri (Panel → İşlemler → Onayla) onaylar; sonuç
success/rejectedolarak tekrar webhook ile gelir. - Sayfada tek banka gösterilir: ödeme para birimindeki, sırası en önde olan ve kalan kotası tutarı karşılayan IBAN. Kota dolunca sıradaki IBAN'a otomatik geçilir. O para biriminde IBAN yoksa sayfa açılmaz.
- Havale/EFT yönteminin üye işyerinde açık olması gerekir.
Ödeme Linkleri
Mağaza panelinizden (Ödeme Linkleri → + Link Oluştur) tutar, ürün ve görsel girerek tek kullanımlık ödeme linki ve QR kodu üretin; WhatsApp, e-posta veya sosyal medyada paylaşın. Son kullanma süresi tanımlanabilir. Bu özellik Link ile Ödeme yöntemi açık işyerlerinde çalışır.
Dönüş (return_url) Parametreleri
Checkout sayfasından (/checkout) müşteri şu parametrelerle return_url'e döner:
https://siteniz.com/sonuc?mp_status=success|pending|failed&mp_order=SIP-1001&mp_tid=TXN…&mp_token=JWT
mp_token, secret_key ile imzalı bir HS256 JWT'dir (status, order, tid, amount, currency, ts). Siparişi onaylamadan önce imzayı doğrulayın veya webhook'u bekleyin.
Webhook Bildirimi (sunucudan sunucuya)
Panel → Ayarlar → Firma Ayarları → İşyeri Bildirimleri alanına URL'nizi kaydedin. Her durum değişikliğinde (onay, red, iade) JSON POST gönderilir:
POST https://siteniz.com/bildirim.php
X-PayStripet-Signature: sha256=<hex( HMAC_SHA256( ham_govde , secret_key ) )>
{"event":"payment.result","tid":"TXN…","order_id":"SIP-1001","status":"success",
"method":"card|transfer","amount":149.9,"currency":"TRY","customer":"…","created_at":"…","ts":1760000000} <?php
$body = file_get_contents('php://input');
$sig = 'sha256=' . hash_hmac('sha256', $body, $secretKey);
if (!hash_equals($sig, $_SERVER['HTTP_X_PAYSTRIPET_SIGNATURE'] ?? '')) { http_response_code(401); exit; }
$evt = json_decode($body, true); // $evt['status'] → siparişi güncelleyin
Durumlar & Hata Kodları
| Alan | Zorunlu | Açıklama |
|---|---|---|
success | — | Ödeme onaylandı |
pending | — | Havale/EFT bildirimi alındı, onay bekliyor |
failed | — | Banka reddetti / hata |
rejected | — | İşlem reddedildi / iptal edildi |
refunded | — | İade edildi |
Güvenlik & Limitler
Bot ve kart deneme (carding) saldırılarına karşı müşteriye görünmeyen korumalar devrededir:
- Kart deneme sınırı: aynı IP'den 10 dakikada 8, saatte 25; aynı kart numarasıyla 10 dakikada 4, günde 10 deneme.
- İstek sınırı: Ödeme ve başvuru istekleri IP başına dakikalık/saatlik sınırlıdır. Aşıldığında HTTP
429döner. - Tek kullanımlık kodlar: ödeme sayfası güvenlik kodu yalnızca bir kez kullanılabilir; tekrar eden istek
409ile reddedilir. - Eşzamanlı istek kilidi: aynı kart veya aynı sipariş için aynı anda gelen ikinci istek reddedilir (
LOCKED/409). - Giriş kilidi: mağaza ve yönetici girişinde aynı hesaba 15 dakikada 5, aynı IP'den 15 hatalı denemede giriş 15 dakika kilitlenir.