Geliştiriciler

Geliştirici Merkezi

Kart, Havale/EFT, Kripto ve Ödeme Linki ile tahsilat. Barındırılan ödeme sayfaları veya kendi formunuzdan Doğrudan POST.

Adım Adım Entegrasyon

Henüz üye değil misiniz? 1) Başvuru formunu doldurun ve kullanmak istediğiniz ödeme yöntemlerini seçin. 2) Başvurunuz onaylanınca mağaza panelinize giriş yapın; Mağaza No, Publishable Key ve Secret Key otomatik oluşur. 3) Aşağıdan yönteminizi seçip adımları uygulayın — paneldeki kodlar sizin anahtarlarınızla hazır gelir. Üyeyseniz doğrudan panelinizdeki Entegrasyon ve API menüsünü kullanın.

Kredi Kartı Entegrasyonu

Ödeme Sayfasına Yönlendirme
Adım Adım Kurulum
  1. 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.
  2. Müşteri sitenizde "Öde" butonuna basar.
  3. Sunucunuz sipariş bilgisini (tutar, sipariş no, müşteri) Secret Key ile imzalayıp bir token üretir (önerilir; isterseniz sadece pk + amount + order parametresi de yeterli).
  4. Müşteriyi /checkout?pk=…&token=… adresine yönlendirirsiniz.
  5. Müşteri kart bilgisini MoneyPayz sayfasında girer, bankanın 3D Secure SMS doğrulamasını yapar.
  6. Müşteri return_url adresinize mp_status, mp_order, mp_tid, mp_token ile döner; sipariş durumunu webhook ile kesinleştirin.
  7. Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
Sitenize Nasıl Eklenir?
Dosya / SayfaNereye?Ne yapar?
odeme.phpSepet / 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 MoneyPayz ödeme sayfasına yönlendirir. Aşağıdaki PHP / Node.js / Python kodu bu dosyaya yazılır.
siparis-sonuc.phpreturn_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.
moneypayz-webhook.phpSunucunuzda 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(), 'name' => 'Ahmet Yılmaz', 'email' => 'ahmet@ornek.com', 'currency' => 'TRY'];
$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://moneypayz.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://moneypayz.com/checkout?pk=pk_live_XXXXXXXXXXXXXXXX&amount=149.90&order=ORD-1001&currency=TRY&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"}' | b64)
S=$(printf '%s' "$H.$B" | openssl dgst -sha256 -hmac 'sk_live_XXXXXXXXXXXXXXXX' -binary | b64)
echo "https://moneypayz.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', email: 'ahmet@ornek.com' }));
const s = crypto.createHmac('sha256', secret).update(h + '.' + b).digest('base64url');
const url = 'https://moneypayz.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'}).encode())
s = b64(hmac.new(secret.encode(), f'{h}.{b}'.encode(), hashlib.sha256).digest())
url = 'https://moneypayz.com/checkout?' + urllib.parse.urlencode({'pk': pk, 'token': f'{h}.{b}.{s}', 'return_url': 'https://siteniz.com/siparis-sonuc'})
# Flask: return redirect(url)
iframe ile Gömülü Ödeme
Adım Adım Kurulum
  1. 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.
  2. Ödeme sayfanıza aşağıdaki <iframe> kodunu ekleyin (adres yönlendirmedeki ile aynıdır).
  3. Aynı sayfaya sonucu dinleyen küçük JavaScript kodunu ekleyin (postMessage).
  4. Müşteri ödemeyi iframe içinde tamamlar; siteniz sonucu (status, order, tid, token) anında alır.
  5. Siparişi kesin olarak webhook bildirimiyle onaylayın.
  6. Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
Sitenize Nasıl Eklenir?
Dosya / SayfaNereye?Ne yapar?
odeme.php (veya ödeme adımı sayfanız)Siparişin ödeme adımını gösterdiğiniz sayfa — HTML içinde, ödeme kutusunun görünmesini istediğiniz yere<iframe> kodunu yapıştırın; tutar ve sipariş no'yu sunucunuzda dinamik basın.
Aynı sayfanın en altı (</body> öncesi)Sonuç dinleyici <script> koduÖdeme bitince status = success ise teşekkür sayfanıza, failed ise tekrar denemeye yönlendirin.
moneypayz-webhook.phpPanel → Ayarlar → İşyeri BildirimleriSiparişi kesin olarak onaylar.
Kendi Formunuzdan POST
Adım Adım Kurulum
  1. 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.
  2. Sitenizde kendi kart formunuzu hazırlayın (kart sahibi, numara, son kullanma, CVV).
  3. Sunucunuzda hash imzasını üretin: merchant_no|order_id|amount|currency|installment|ok_url|fail_url|rnd → HMAC-SHA256 (Secret Key) → base64.
  4. Formu POST /direct-post adresine gönderin; müşteri bankanın 3D Secure ekranına yönlenir.
  5. Sonuç ok_url / fail_url adresinize form POST olarak gelir; dönüş imzasını (merchant_no|order_id|status|tid|amount|rnd) doğrulayın.
  6. ok_url ve fail_url https olmalı ve kayıtlı alan adınızda bulunmalıdır.
  7. Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
Sitenize Nasıl Eklenir?
Dosya / SayfaNereye?Ne yapar?
odeme.phpKart formunu gösterdiğiniz kendi ödeme sayfanız (HTTPS zorunlu)Sunucuda hash üretir, kart formunu action="/direct-post" ile basar. Kart bilgisini kendi veritabanınıza KAYDETMEYİN.
odeme/basarili.phpok_url (örn. https://siteniz.com/odeme/basarili)Bankadan dönüşte POST ile gelen alanların imzasını doğrular, siparişi "ödendi" yapar.
odeme/hata.phpfail_url (örn. https://siteniz.com/odeme/hata)error_code / error_message gösterir, müşteriye tekrar deneme sunar.
moneypayz-webhook.phpPanel → Ayarlar → İşyeri BildirimleriYedek/kesin onay için.
<?php
$merchantNo = 'MAGAZA_NO'; $apiKey = 'pk_live_XXXXXXXXXXXXXXXX'; $secret = 'sk_live_XXXXXXXXXXXXXXXX';
$orderId = 'SIP-' . time(); $amount = '149.90'; $currency = 'TRY'; $inst = '1';
$ok = 'https://siteniz.com/odeme/basarili'; $fail = 'https://siteniz.com/odeme/hata'; $rnd = bin2hex(random_bytes(8));
$hash = base64_encode(hash_hmac('sha256', implode('|', [$merchantNo, $orderId, $amount, $currency, $inst, $ok, $fail, $rnd]), $secret, true));
// Bu değerleri formunuza hidden alan olarak koyun; form action="https://moneypayz.com/direct-post"

// Dönüş sayfasında (ok_url / fail_url) imza doğrulama:
$p = $_POST;
$valid = hash_equals(base64_encode(hash_hmac('sha256', implode('|', [$p['merchant_no'], $p['order_id'], $p['status'], $p['tid'], $p['amount'], $p['rnd']]), $secret, true)), $p['hash'] ?? '');
RND=$(date +%s%N)
SIG=$(printf '%s' "MAGAZA_NO|SIP-1001|149.90|TRY|1|https://siteniz.com/odeme/basarili|https://siteniz.com/odeme/hata|$RND" | openssl dgst -sha256 -hmac 'sk_live_XXXXXXXXXXXXXXXX' -binary | openssl base64 -A)
curl -X POST "https://moneypayz.com/direct-post" \
  -d merchant_no=MAGAZA_NO -d api_key=pk_live_XXXXXXXXXXXXXXXX -d order_id=SIP-1001 -d amount=149.90 -d currency=TRY -d installment=1 \
  -d ok_url=https://siteniz.com/odeme/basarili -d fail_url=https://siteniz.com/odeme/hata -d rnd=$RND -d hash="$SIG" \
  -d card_holder='ALI VELI' -d card_number=4111111111111111 -d exp=12/30 -d cvv=123
const crypto = require('crypto');
const merchantNo = 'MAGAZA_NO', apiKey = 'pk_live_XXXXXXXXXXXXXXXX', secret = 'sk_live_XXXXXXXXXXXXXXXX';
const f = { merchant_no: merchantNo, api_key: apiKey, order_id: 'SIP-' + Date.now(), amount: '149.90', currency: 'TRY', installment: '1',
  ok_url: 'https://siteniz.com/odeme/basarili', fail_url: 'https://siteniz.com/odeme/hata', rnd: crypto.randomBytes(8).toString('hex') };
f.hash = crypto.createHmac('sha256', secret).update([f.merchant_no, f.order_id, f.amount, f.currency, f.installment, f.ok_url, f.fail_url, f.rnd].join('|')).digest('base64');
// f alanlarını formunuza hidden input olarak basın; form action="https://moneypayz.com/direct-post"

// Dönüş doğrulama (Express, urlencoded body):
const verify = (p) => crypto.createHmac('sha256', secret).update([p.merchant_no, p.order_id, p.status, p.tid, p.amount, p.rnd].join('|')).digest('base64') === p.hash;
import base64, hashlib, hmac, secrets, time
merchant_no, api_key, secret = 'MAGAZA_NO', 'pk_live_XXXXXXXXXXXXXXXX', 'sk_live_XXXXXXXXXXXXXXXX'
f = {'merchant_no': merchant_no, 'api_key': api_key, 'order_id': f'SIP-{int(time.time())}', 'amount': '149.90', 'currency': 'TRY',
     'installment': '1', 'ok_url': 'https://siteniz.com/odeme/basarili', 'fail_url': 'https://siteniz.com/odeme/hata', 'rnd': secrets.token_hex(8)}
sign = lambda parts: base64.b64encode(hmac.new(secret.encode(), '|'.join(parts).encode(), hashlib.sha256).digest()).decode()
f['hash'] = sign([f[k] for k in ('merchant_no', 'order_id', 'amount', 'currency', 'installment', 'ok_url', 'fail_url', 'rnd')])
# f alanlarını formunuza hidden input olarak basın; form action="https://moneypayz.com/direct-post"

# Dönüş doğrulama:
verify = lambda p: hmac.compare_digest(sign([p['merchant_no'], p['order_id'], p['status'], p['tid'], p['amount'], p['rnd']]), p.get('hash', ''))

Havale/EFT Entegrasyonu

Ödeme Sayfasına Yönlendirme
Adım Adım Kurulum
  1. 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.
  2. Müşteri "Havale/EFT ile öde" seçer.
  3. Müşteriyi /checkout-transfer?pk=…&amount=…&order=…&return_url=… adresine yönlendirin (token kartla aynı şekilde kullanılabilir).
  4. Müşteri MoneyPayz IBAN'ına havale yapar, dekontu yükler ve "Ödemeyi Tamamladım" der.
  5. İşlem "Onay Bekliyor" olur; dekont kontrol edilince onay/red kararı webhook ile bildirilir.
  6. Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
Sitenize Nasıl Eklenir?
Dosya / SayfaNereye?Ne yapar?
odeme.php"Havale/EFT ile öde" seçeneğinin gittiği yerSiparişi "ödeme bekliyor" kaydeder ve müşteriyi /checkout-transfer adresine yönlendirir.
siparis-sonuc.phpreturn_urlmp_status=pending gelir: "Dekontunuz alındı, onay sonrası siparişiniz hazırlanacak" mesajı gösterin.
moneypayz-webhook.phpPanel → Ayarlar → İşyeri BildirimleriDekont onaylanınca status=success, reddedilince rejected gelir; siparişi buna göre güncelleyin.
<?php
$pk = 'pk_live_XXXXXXXXXXXXXXXX';
$secret = 'sk_live_XXXXXXXXXXXXXXXX'; // yalnızca sunucuda
$payload = ['amount' => 149.90, 'order' => 'ORD-' . time(), 'name' => 'Ahmet Yılmaz', 'email' => 'ahmet@ornek.com', 'currency' => 'TRY'];
$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://moneypayz.com/checkout-transfer?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://moneypayz.com/checkout-transfer?pk=pk_live_XXXXXXXXXXXXXXXX&amount=149.90&order=ORD-1001&currency=TRY&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"}' | b64)
S=$(printf '%s' "$H.$B" | openssl dgst -sha256 -hmac 'sk_live_XXXXXXXXXXXXXXXX' -binary | b64)
echo "https://moneypayz.com/checkout-transfer?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', email: 'ahmet@ornek.com' }));
const s = crypto.createHmac('sha256', secret).update(h + '.' + b).digest('base64url');
const url = 'https://moneypayz.com/checkout-transfer?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'}).encode())
s = b64(hmac.new(secret.encode(), f'{h}.{b}'.encode(), hashlib.sha256).digest())
url = 'https://moneypayz.com/checkout-transfer?' + urllib.parse.urlencode({'pk': pk, 'token': f'{h}.{b}.{s}', 'return_url': 'https://siteniz.com/siparis-sonuc'})
# Flask: return redirect(url)
iframe ile Gömülü Ödeme
Adım Adım Kurulum
  1. 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.
  2. /checkout-transfer adresini iframe ile gömün.
  3. Sonuç dinleyicisini ekleyin; dekont yüklenince status: "pending" mesajı gelir.
  4. Onay/red kararı webhook ile bildirilir.
  5. Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
Sitenize Nasıl Eklenir?
Dosya / SayfaNereye?Ne yapar?
odeme.phpÖdeme adımı sayfanızda kutunun görüneceği yer/checkout-transfer iframe kodunu yapıştırın.
Aynı sayfanın en altıSonuç dinleyici <script>status=pending gelince bilgilendirme sayfanıza yönlendirin.
moneypayz-webhook.phpPanel → Ayarlar → İşyeri BildirimleriOnay/red kararını alır.
Kendi Formunuzdan POST
Adım Adım Kurulum
  1. 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.
  2. IBAN listesini alın: GET /direct-post/ibans?api_key=… (isteğe bağlı &currency=EUR).
  3. Kendi formunuzda IBAN'ı gösterin; müşteri havaleyi yapıp dekontu yükler.
  4. Formu multipart/form-data olarak POST /direct-post/transfer adresine gönderin (sender_name, iban_id, receipt + kartla aynı imza).
  5. Müşteri ok_url'e status=pending ile döner; karar webhook ile gelir.
  6. Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
Sitenize Nasıl Eklenir?
Dosya / SayfaNereye?Ne yapar?
odeme-havale.phpKendi Havale/EFT ekranınızSunucudan GET /direct-post/ibans ile IBAN'ları çekip gösterir; dekont yükleme alanlı formu multipart olarak /direct-post/transfer adresine gönderir.
odeme/basarili.phpok_urlstatus=pending ile döner; bilgilendirme mesajı gösterin.
moneypayz-webhook.phpPanel → Ayarlar → İşyeri BildirimleriOnay/red kararını alır.
<?php
$merchantNo = 'MAGAZA_NO'; $apiKey = 'pk_live_XXXXXXXXXXXXXXXX'; $secret = 'sk_live_XXXXXXXXXXXXXXXX';
$orderId = 'SIP-' . time(); $amount = '149.90'; $currency = 'TRY'; $inst = '1';
$ok = 'https://siteniz.com/odeme/basarili'; $fail = 'https://siteniz.com/odeme/hata'; $rnd = bin2hex(random_bytes(8));
$hash = base64_encode(hash_hmac('sha256', implode('|', [$merchantNo, $orderId, $amount, $currency, $inst, $ok, $fail, $rnd]), $secret, true));
// Bu değerleri formunuza hidden alan olarak koyun; form action="https://moneypayz.com/direct-post/transfer"

// Dönüş sayfasında (ok_url / fail_url) imza doğrulama:
$p = $_POST;
$valid = hash_equals(base64_encode(hash_hmac('sha256', implode('|', [$p['merchant_no'], $p['order_id'], $p['status'], $p['tid'], $p['amount'], $p['rnd']]), $secret, true)), $p['hash'] ?? '');
RND=$(date +%s%N)
SIG=$(printf '%s' "MAGAZA_NO|SIP-1001|149.90|TRY|1|https://siteniz.com/odeme/basarili|https://siteniz.com/odeme/hata|$RND" | openssl dgst -sha256 -hmac 'sk_live_XXXXXXXXXXXXXXXX' -binary | openssl base64 -A)
curl -X POST "https://moneypayz.com/direct-post/transfer" \
  -F merchant_no=MAGAZA_NO -F api_key=pk_live_XXXXXXXXXXXXXXXX -F order_id=SIP-1001 -F amount=149.90 -F currency=TRY -F installment=1 \
  -F ok_url=https://siteniz.com/odeme/basarili -F fail_url=https://siteniz.com/odeme/hata -F rnd=$RND -F hash="$SIG" \
  -F sender_name='Ali Veli' -F iban_id=1 -F receipt=@dekont.pdf
const crypto = require('crypto');
const merchantNo = 'MAGAZA_NO', apiKey = 'pk_live_XXXXXXXXXXXXXXXX', secret = 'sk_live_XXXXXXXXXXXXXXXX';
const f = { merchant_no: merchantNo, api_key: apiKey, order_id: 'SIP-' + Date.now(), amount: '149.90', currency: 'TRY', installment: '1',
  ok_url: 'https://siteniz.com/odeme/basarili', fail_url: 'https://siteniz.com/odeme/hata', rnd: crypto.randomBytes(8).toString('hex') };
f.hash = crypto.createHmac('sha256', secret).update([f.merchant_no, f.order_id, f.amount, f.currency, f.installment, f.ok_url, f.fail_url, f.rnd].join('|')).digest('base64');
// f alanlarını formunuza hidden input olarak basın; form action="https://moneypayz.com/direct-post/transfer"

// Dönüş doğrulama (Express, urlencoded body):
const verify = (p) => crypto.createHmac('sha256', secret).update([p.merchant_no, p.order_id, p.status, p.tid, p.amount, p.rnd].join('|')).digest('base64') === p.hash;
import base64, hashlib, hmac, secrets, time
merchant_no, api_key, secret = 'MAGAZA_NO', 'pk_live_XXXXXXXXXXXXXXXX', 'sk_live_XXXXXXXXXXXXXXXX'
f = {'merchant_no': merchant_no, 'api_key': api_key, 'order_id': f'SIP-{int(time.time())}', 'amount': '149.90', 'currency': 'TRY',
     'installment': '1', 'ok_url': 'https://siteniz.com/odeme/basarili', 'fail_url': 'https://siteniz.com/odeme/hata', 'rnd': secrets.token_hex(8)}
sign = lambda parts: base64.b64encode(hmac.new(secret.encode(), '|'.join(parts).encode(), hashlib.sha256).digest()).decode()
f['hash'] = sign([f[k] for k in ('merchant_no', 'order_id', 'amount', 'currency', 'installment', 'ok_url', 'fail_url', 'rnd')])
# f alanlarını formunuza hidden input olarak basın; form action="https://moneypayz.com/direct-post/transfer"

# Dönüş doğrulama:
verify = lambda p: hmac.compare_digest(sign([p['merchant_no'], p['order_id'], p['status'], p['tid'], p['amount'], p['rnd']]), p.get('hash', ''))

Kripto Para Entegrasyonu

Ödeme Sayfasına Yönlendirme
Adım Adım Kurulum
  1. 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.
  2. Müşteri "Kripto ile öde" seçer.
  3. Müşteriyi /checkout-crypto?pk=…&amount=…&order=…&return_url=… adresine yönlendirin.
  4. Müşteri coin seçer (USDT TRC20 / BTC), canlı kurla hesaplanan miktarı 15 dk içinde gönderir ve TXID girer.
  5. İşlem "Onay Bekliyor" olur; zincirde kontrol edilince karar webhook ile bildirilir.
  6. Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
Sitenize Nasıl Eklenir?
Dosya / SayfaNereye?Ne yapar?
odeme.php"Kripto ile öde" seçeneğinin gittiği yerMüşteriyi /checkout-crypto adresine yönlendirir.
siparis-sonuc.phpreturn_urlmp_status=pending ile döner.
moneypayz-webhook.phpPanel → Ayarlar → İşyeri BildirimleriTXID zincirde doğrulanınca karar gelir.
<?php
$pk = 'pk_live_XXXXXXXXXXXXXXXX';
$secret = 'sk_live_XXXXXXXXXXXXXXXX'; // yalnızca sunucuda
$payload = ['amount' => 149.90, 'order' => 'ORD-' . time(), 'name' => 'Ahmet Yılmaz', 'email' => 'ahmet@ornek.com', 'currency' => 'TRY'];
$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://moneypayz.com/checkout-crypto?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://moneypayz.com/checkout-crypto?pk=pk_live_XXXXXXXXXXXXXXXX&amount=149.90&order=ORD-1001&currency=TRY&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"}' | b64)
S=$(printf '%s' "$H.$B" | openssl dgst -sha256 -hmac 'sk_live_XXXXXXXXXXXXXXXX' -binary | b64)
echo "https://moneypayz.com/checkout-crypto?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', email: 'ahmet@ornek.com' }));
const s = crypto.createHmac('sha256', secret).update(h + '.' + b).digest('base64url');
const url = 'https://moneypayz.com/checkout-crypto?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'}).encode())
s = b64(hmac.new(secret.encode(), f'{h}.{b}'.encode(), hashlib.sha256).digest())
url = 'https://moneypayz.com/checkout-crypto?' + urllib.parse.urlencode({'pk': pk, 'token': f'{h}.{b}.{s}', 'return_url': 'https://siteniz.com/siparis-sonuc'})
# Flask: return redirect(url)
iframe ile Gömülü Ödeme
Adım Adım Kurulum
  1. 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.
  2. /checkout-crypto adresini iframe ile gömün.
  3. Sonuç dinleyicisini ekleyin; TXID gönderilince status: "pending" mesajı gelir.
  4. Onay/red kararı webhook ile bildirilir.
  5. Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
Sitenize Nasıl Eklenir?
Dosya / SayfaNereye?Ne yapar?
odeme.phpÖdeme adımı sayfanız/checkout-crypto iframe kodunu yapıştırın.
Aynı sayfanın en altıSonuç dinleyici <script>status=pending gelince yönlendirin.
moneypayz-webhook.phpPanel → Ayarlar → İşyeri BildirimleriKarar bildirimi.
Kendi Formunuzdan POST
Adım Adım Kurulum
  1. 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.
  2. Sunucunuzdan POST /direct-post/crypto/quote ile kur teklifi alın (coin miktarı + cüzdan adresi, 15 dk geçerli).
  3. Müşteriye miktarı ve adresi kendi ekranınızda gösterin; quote değerini saklayın.
  4. Müşteri ödeyince POST /direct-post/crypto ile quote + txid gönderin → işlem "Onay Bekliyor".
  5. Yanıt imzasını doğrulayın; karar webhook ile gelir.
  6. Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
Sitenize Nasıl Eklenir?
Dosya / SayfaNereye?Ne yapar?
kripto-teklif.phpSunucunuzda (müşteri coin seçince çağrılır)POST /direct-post/crypto/quote ile miktar + cüzdan adresi alır, quote değerini siparişe kaydeder ve müşteriye gösterir.
kripto-gonder.phpMüşterinin TXID girdiği formun action adresiPOST /direct-post/crypto ile quote + txid gönderir; yanıt imzasını doğrular.
moneypayz-webhook.phpPanel → Ayarlar → İşyeri BildirimleriKarar bildirimi.
<?php
$base = 'https://moneypayz.com'; $m = 'MAGAZA_NO'; $pk = 'pk_live_XXXXXXXXXXXXXXXX'; $secret = 'sk_live_XXXXXXXXXXXXXXXX';
$sign = fn(array $p) => base64_encode(hash_hmac('sha256', implode('|', $p), $secret, true));
$post = function ($url, $f) { $c = curl_init($url); curl_setopt_array($c, [CURLOPT_POST => 1, CURLOPT_POSTFIELDS => http_build_query($f), CURLOPT_RETURNTRANSFER => 1]); return json_decode(curl_exec($c), true); };
// 1) Kur teklifi
$rnd = bin2hex(random_bytes(8));
$q = $post("$base/direct-post/crypto/quote", ['merchant_no' => $m, 'api_key' => $pk, 'order_id' => 'SIP-1001', 'amount' => '149.90', 'currency' => 'TRY', 'coin' => 'USDT', 'rnd' => $rnd,
  'hash' => $sign([$m, 'SIP-1001', '149.90', 'TRY', 'USDT', $rnd])]);
// $q['crypto_amount'], $q['address'] müşteriye gösterilir
// 2) TXID bildirimi
$rnd2 = bin2hex(random_bytes(8)); $txid = $_POST['txid'];
$r = $post("$base/direct-post/crypto", ['merchant_no' => $m, 'api_key' => $pk, 'quote' => $q['quote'], 'txid' => $txid, 'rnd' => $rnd2, 'hash' => $sign([$m, $q['quote'], $txid, $rnd2])]);
sign(){ printf '%s' "$1" | openssl dgst -sha256 -hmac 'sk_live_XXXXXXXXXXXXXXXX' -binary | openssl base64 -A; }
RND=$(date +%s%N)
curl -s -X POST "https://moneypayz.com/direct-post/crypto/quote" -d merchant_no=MAGAZA_NO -d api_key=pk_live_XXXXXXXXXXXXXXXX -d order_id=SIP-1001 \
  -d amount=149.90 -d currency=TRY -d coin=USDT -d rnd=$RND --data-urlencode hash="$(sign "MAGAZA_NO|SIP-1001|149.90|TRY|USDT|$RND")"
# yanıttaki quote ve müşterinin TXID'si ile:
QUOTE='...'; TXID='...'; RND2=$(date +%s%N)
curl -s -X POST "https://moneypayz.com/direct-post/crypto" -d merchant_no=MAGAZA_NO -d api_key=pk_live_XXXXXXXXXXXXXXXX --data-urlencode quote="$QUOTE" \
  -d txid=$TXID -d rnd=$RND2 --data-urlencode hash="$(sign "MAGAZA_NO|$QUOTE|$TXID|$RND2")"
const crypto = require('crypto');
const base = 'https://moneypayz.com', m = 'MAGAZA_NO', pk = 'pk_live_XXXXXXXXXXXXXXXX', secret = 'sk_live_XXXXXXXXXXXXXXXX';
const sign = (p) => crypto.createHmac('sha256', secret).update(p.join('|')).digest('base64');
const post = (u, f) => fetch(base + u, { method: 'POST', body: new URLSearchParams(f) }).then(r => r.json());
(async () => {
  const rnd = crypto.randomBytes(8).toString('hex');
  const q = await post('/direct-post/crypto/quote', { merchant_no: m, api_key: pk, order_id: 'SIP-1001', amount: '149.90', currency: 'TRY', coin: 'USDT', rnd,
    hash: sign([m, 'SIP-1001', '149.90', 'TRY', 'USDT', rnd]) });
  // q.crypto_amount, q.address → müşteriye göster; ödeme sonrası:
  const txid = '...', rnd2 = crypto.randomBytes(8).toString('hex');
  const r = await post('/direct-post/crypto', { merchant_no: m, api_key: pk, quote: q.quote, txid, rnd: rnd2, hash: sign([m, q.quote, txid, rnd2]) });
})();
import base64, hashlib, hmac, secrets, requests
base, m, pk, secret = 'https://moneypayz.com', 'MAGAZA_NO', 'pk_live_XXXXXXXXXXXXXXXX', 'sk_live_XXXXXXXXXXXXXXXX'
sign = lambda p: base64.b64encode(hmac.new(secret.encode(), '|'.join(p).encode(), hashlib.sha256).digest()).decode()
rnd = secrets.token_hex(8)
q = requests.post(base + '/direct-post/crypto/quote', data={'merchant_no': m, 'api_key': pk, 'order_id': 'SIP-1001', 'amount': '149.90',
    'currency': 'TRY', 'coin': 'USDT', 'rnd': rnd, 'hash': sign([m, 'SIP-1001', '149.90', 'TRY', 'USDT', rnd])}).json()
# q['crypto_amount'], q['address'] → müşteriye göster; ödeme sonrası:
txid, rnd2 = '...', secrets.token_hex(8)
r = requests.post(base + '/direct-post/crypto', data={'merchant_no': m, 'api_key': pk, 'quote': q['quote'], 'txid': txid, 'rnd': rnd2,
    'hash': sign([m, q['quote'], txid, rnd2])}).json()

Diğer

Ödeme Linki ile Tahsilat
Adım Adım Kurulum
  1. 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.
  2. Panel → Ödeme Linkleri → + Link Oluştur ile tutar, para birimi ve ürün girin.
  3. Oluşan linki veya QR kodunu WhatsApp, e-posta ya da sosyal medyada paylaşın.
  4. Müşteri linkten açık yöntemlerinizle öder; link ödenince otomatik kapanır.
  5. Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
Sitenize Nasıl Eklenir?
Dosya / SayfaNereye?Ne yapar?
Kod gerekmezPanel → Ödeme LinkleriLink 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)
Adım Adım Kurulum
  1. 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.
  2. Sunucunuzda bildirim alacak bir adres hazırlayın (örn. https://siteniz.com/moneypayz-webhook).
  3. Panel → Ayarlar → İşyeri Bildirimleri alanına bu adresi kaydedip aktif edin.
  4. Gelen her istekte X-MoneyPayz-Signature: sha256=… başlığını, ham gövdenin Secret Key ile HMAC-SHA256 (hex) değeriyle karşılaştırın.
  5. İmza doğruysa status alanına göre siparişi güncelleyin (success / pending / rejected / refunded) ve 200 dönün.
  6. Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
Sitenize Nasıl Eklenir?
Dosya / SayfaNereye?Ne yapar?
moneypayz-webhook.phpSitenizin kök dizini veya /api altı (örn. https://siteniz.com/moneypayz-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ş tablonuzVeritabanınızorder_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_MONEYPAYZ_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/moneypayz-webhook" -H 'Content-Type: application/json' -H "X-MoneyPayz-Signature: sha256=$SIG" -d "$BODY"
const crypto = require('crypto'), express = require('express');
const secret = 'sk_live_XXXXXXXXXXXXXXXX', app = express();
app.post('/moneypayz-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-MoneyPayz-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('/moneypayz-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-MoneyPayz-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, Kripto, Link ile Ödeme, Fiziki POS, Mobil Ödeme. MoneyPayz 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 (Doğrudan POST'ta error_code=METHOD_DISABLED).
  • Fiziki POS ve Mobil Ödeme için panelinizde talep / kurulum durumu gösterilir; ekibimiz sizinle iletişime geçer.
  • 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:

AlanZorunluAçıklama
merchant_no (Mağaza No)—Üye işyeri numaranız; Doğrudan POST isteklerinde gönderilir.
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.
Alan adı kilidi: panelde web siteniz tanımlıysa return_url, ok_url, fail_url adresleri 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.

  • Ödeme sayfaları (/checkout, /checkout-transfer, /checkout-crypto): &currency=EUR parametresi veya token/data içinde currency alanı.
  • Doğrudan POST ve v2 API: currency alanı (imzaya gönderdiğiniz yazımla girer).
  • Kart: bankaya giden istekte currency gelen para birimiyle iletilir.
  • Havale/EFT: yalnızca o para birimi için tanımlı tahsilat IBAN'ları gösterilir; tanımlı değilse yöntem o para biriminde kapalıdır.
  • Kripto: coin miktarı gelen para biriminin canlı kuruyla hesaplanır (örn. 100 € → USDT).
  • Dönüş alanları, mp_token, postMessage ve webhook'ta currency alanı bulunur. Mağaza panelinde bakiye ve para çekme para birimine göre ayrı tutulur.
GET https://moneypayz.com/checkout?pk=PUBLISHABLE_KEY&amount=49.90&currency=EUR&order=SIP-1002

Kredi Kartı — Barındırılan Ödeme Sayfası

Müşteriyi MoneyPayz ödeme sayfasına yönlendirin; kart bilgisi MoneyPayz'de girilir, banka 3D Secure (SMS) akışı çalışır.

GET https://moneypayz.com/checkout?pk=PUBLISHABLE_KEY&amount=149.90&order=SIP-1001&return_url=https%3A%2F%2Fsiteniz.com%2Fsonuc
AlanZorunluAçıklama
pkEvetPublishable key
amountEvetTutar. Sayfada %2,09 hizmet bedeli eklenmiş toplam gösterilir.
currencyHayırTRY (varsayılan), USD, EUR, GBP, RUB
orderHayırSipariş numaranız
productHayırÜrün / açıklama
return_urlHayırÖdeme sonrası dönüş adresi (bkz. Dönüş)
token / dataHayırMüşteri bilgisini (ad, e-posta, telefon) imzalı token ile ön doldurma

Sayfayı iframe olarak da gömebilirsiniz; sonuç üst pencereye imzalı postMessage ile gelir. Müşteri ödeme öncesi "Ödeme sözleşmesi şartlarını okudum, onaylıyorum" kutusunu işaretler.

Kredi Kartı — Doğrudan POST (kendi kart formunuz)

Kendi tasarımınızdaki kart formunu doğrudan MoneyPayz'e POST edin. MoneyPayz isteği ödeme sayfasıyla aynı banka bağlantısı ve aynı alanlarla bankaya iletir; müşteri banka SMS ekranına geçer, sonuç ok_url / fail_url adresinize imzalı POST ile döner. Kart no ve CVV saklanmaz.

POST https://moneypayz.com/direct-post   (application/x-www-form-urlencoded)
AlanZorunluAçıklama
merchant_noEvetMağaza No
api_keyEvetPublishable key
order_idEvetBenzersiz sipariş no
amountEvetÖrn. 149.90 — hash'e aynı yazımla girer
currencyHayırTRY (varsayılan), USD, EUR, GBP, RUB
installmentHayır1–12 (varsayılan 1)
card_holderEvetKart üzerindeki ad soyad
card_numberEvetKart numarası
exp_month + exp_yearEvetveya tek alan exp = AA/YY
cvvEvet3–4 hane
ok_url / fail_urlEvethttps dönüş adresleri
rndEvetHer istekte değişen rastgele değer
hashEvetİstek imzası
customer_name / customer_email / customer_phone / productHayırİşlem listesinde görünür

İmzalar

İstek : hash = base64( HMAC_SHA256( merchant_no|order_id|amount|currency|installment|ok_url|fail_url|rnd , secret_key ) )
Dönüş : hash = base64( HMAC_SHA256( merchant_no|order_id|status|tid|amount|rnd , secret_key ) )
<?php
$hash = base64_encode(hash_hmac('sha256',
    implode('|', [$merchantNo, $orderId, $amount, 'TRY', '1', $okUrl, $failUrl, $rnd]),
    $secretKey, true));

Dönüş alanları (ok_url / fail_url'e POST): status (success / failed / pending), merchant_no, order_id, tid, amount, currency, installment, error_code, error_message, rnd, hash.

Hatalı imza, eksik alan veya geçersiz anahtarda istek bankaya gitmez, hata ekranı gösterilir. İmza doğru ise diğer hatalar fail_url'e error_code ile döner. Örnek form ve dönüş sayfası kodu mağaza panelinizde kendi anahtarlarınızla hazır gelir.

Havale/EFT — Ödeme Sayfası

"Havale/EFT ile öde" seçildiğinde müşteriyi yönlendirin. Sayfada MoneyPayz tahsilat IBAN'ı (Alıcı Bilgisi, Alıcı IBAN ve yöneticinin belirlediği Açıklama — kopyalanabilir), tutar ve zorunlu dekont yükleme bulunur. "Ödemeyi Yaptım" sonrası işlem Onay Bekliyor olarak kaydedilir.

GET https://moneypayz.com/checkout-transfer?pk=PUBLISHABLE_KEY&amount=149.90&order=SIP-1001&return_url=https%3A%2F%2Fsiteniz.com%2Fsonuc

Parametreler kart sayfasıyla aynıdır (currency dahil; o para birimine ait IBAN yoksa sayfa açılmaz). Müşteri bildirim sonrası return_url'e mp_status=pending ile döner. Onay/red; mağaza panelinizden (İşlemler → Onayla / Red) veya MoneyPayz yöneticisi tarafından verilir ve webhook ile bildirilir.

Havale/EFT — Doğrudan POST (kendi havale formunuz)

GET  https://moneypayz.com/direct-post/ibans?api_key=PUBLISHABLE_KEY      → {"ibans":[{"id":1,"bank_name":"…","title":"…","iban":"TR…","currency":"TRY","description":"Havale açıklaması"}]}
POST https://moneypayz.com/direct-post/transfer   (multipart/form-data)
AlanZorunluAçıklama
merchant_no, api_key, order_id, amount, currency, installment(=1), ok_url, fail_url, rnd, hashEvetKart Doğrudan POST ile aynı alanlar ve aynı imza formülü
sender_nameEvetGönderen ad soyad
iban_idEvet/direct-post/ibans listesinden seçilen IBAN id — IBAN'ın para birimi currency ile aynı olmalı (aksi halde IBAN_CURRENCY). Listeyi &currency=EUR ile filtreleyebilirsiniz.
receiptEvetDekont dosyası (JPG, PNG, WEBP, PDF)
customer_email / customer_phone / product / descriptionHayırEk bilgiler

Bildirim kaydedilince müşteri ok_url'e status=pending ile imzalı POST olarak döner. Aynı sipariş no ile ikinci bildirim kabul edilmez (DUPLICATE_ORDER).

Kripto ile Ödeme (USDT TRC20 / BTC)

GET https://moneypayz.com/checkout-crypto?pk=PUBLISHABLE_KEY&amount=149.90&order=SIP-1001&return_url=https%3A%2F%2Fsiteniz.com%2Fsonuc
  1. Kripto Para Seçiniz: USDT (TRC20) veya BTC.
  2. İşlemi Tamamlayınız: canlı kurla hesaplanan miktar, MoneyPayz cüzdan adresi + QR ve 15 dakika geri sayım. Tutar sunucuda imzalanır, değiştirilemez.
  3. Ödemeyi Yaptım → TXID: müşteri cüzdanındaki işlem kimliğini (64 karakter hash) girer.
  4. İşlem Onay Bekliyor olarak kaydedilir; zincirde kontrol edilip mağaza paneli veya yönetici tarafından onaylanır. Süre dolarsa işlem iptal edilir.

Kur CoinGecko'dan, gönderilen para biriminde (currency) canlı alınır; tutar = sipariş tutarı (Havale/EFT ve Kriptoda komisyon yoktur) / kur, yukarı yuvarlanır (USDT 2, BTC 8 hane). Aynı TXID tekrar kullanılamaz.

iframe: Havale/EFT ve Kripto sayfaları iframe içinde gömülebilir; işlem kaydedilince sonuç (status: "pending", order, tid, amount, currency, token) üst pencereye postMessage ile iletilir, iframe içinde yönlendirme yapılmaz.

Kripto — Doğrudan POST (kendi kripto ekranınız)

Sunucudan sunucuya, 2 adımlı ve JSON yanıtlıdır. Hata durumunda {"ok":false,"error_code":"...","error":"..."} döner.

POST https://moneypayz.com/direct-post/crypto/quote
merchant_no, api_key, order_id, amount, currency (ops., TRY), coin (USDT|BTC), rnd, hash
hash = base64(HMAC_SHA256("merchant_no|order_id|amount|currency|coin|rnd", secret_key))
→ {ok, order_id, amount, currency, coin, network, address, crypto_amount, rate, expires_at, expires_in, quote}
POST https://moneypayz.com/direct-post/crypto
merchant_no, api_key, quote, txid, rnd, hash (+ customer_name, customer_email, customer_phone, product)
hash = base64(HMAC_SHA256("merchant_no|quote|txid|rnd", secret_key))
→ {ok, status:"pending", merchant_no, order_id, tid, amount, currency, coin, crypto_amount, txid, rnd, hash}
yanıt hash = base64(HMAC_SHA256("merchant_no|order_id|status|tid|amount|rnd", secret_key))

Hata kodları: AUTH, HASH, RND_USED, MERCHANT_INACTIVE, METHOD_DISABLED, CURRENCY, AMOUNT, COIN_INVALID, DUPLICATE_ORDER, RATE_UNAVAILABLE, QUOTE_INVALID, QUOTE_EXPIRED, QUOTE_USED, TXID_INVALID, TXID_USED. Onay/red kararı webhook ile bildirilir.

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

Ödeme sayfalarından (/checkout, /checkout-transfer, /checkout-crypto) 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 (bekliyor, onay, red, iade) JSON POST gönderilir:

POST https://siteniz.com/bildirim.php
X-MoneyPayz-Signature: sha256=<hex( HMAC_SHA256( ham_govde , secret_key ) )>

{"event":"payment.result","tid":"TXN…","order_id":"SIP-1001","status":"success",
 "method":"card|transfer|crypto","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_MONEYPAYZ_SIGNATURE'] ?? '')) { http_response_code(401); exit; }
$evt = json_decode($body, true); // $evt['status'] → siparişi güncelleyin

Durumlar & Hata Kodları

AlanZorunluAçıklama
success—Ödeme onaylandı
pending—Onay bekliyor (Havale/EFT, Kripto)
failed—Banka reddetti / hata
rejected—Havale/Kripto bildirimi reddedildi
refunded—İade edildi

Doğrudan POST error_code değerleri

AlanZorunluAçıklama
METHOD_DISABLED—Yöntem bu işyeri için açık değil
MERCHANT_INACTIVE—İşyeri aktif değil
CURRENCY / INSTALLMENT / AMOUNT—Geçersiz para birimi, taksit veya tutar
DUPLICATE_ORDER—Bu sipariş no için kayıt zaten var
CARD_INVALID—Kart no (Luhn), son kullanma veya CVV hatalı
BANK_UNAVAILABLE / BANK_ERROR—Banka bağlantısı kurulamadı
BANK_DECLINED—Banka/3D doğrulama reddetti
RATE_LIMIT / LOCKED—Çok fazla deneme / aynı anda tekrar istek
IBAN_INVALID / RECEIPT_REQUIRED—Havale: geçersiz IBAN veya dekont eksik

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ı: Doğrudan POST, v2 API, havale/kripto bildirimleri, IBAN listesi ve başvuru formu IP başına dakikalık/saatlik sınırlıdır. Aşıldığında HTTP 429 veya error_code=RATE_LIMIT döner.
  • Tek kullanımlık kodlar: ödeme sayfası güvenlik kodu, kripto teklifi ve Doğrudan POST rnd değeri yalnızca bir kez kullanılabilir. Her istekte yeni rnd üretin; tekrar eden istek 409 ile reddedilir.
  • Eşzamanlı istek kilidi: aynı kart, aynı sipariş veya aynı TXID 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.

Hazır Entegrasyonlar

WooCommerceShopifyOpenCartPrestaShopMagentoTicimaxIdeaSoftT-Soft