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
Kredi Kartı Entegrasyonu
Ö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, müşteri) Secret Key ile imzalayıp bir
tokenüretir (önerilir; isterseniz sadecepk+amount+orderparametresi de yeterli). - Müşteriyi
/checkout?pk=…&token=…adresine yönlendirirsiniz. - Müşteri kart bilgisini MoneyPayz 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 MoneyPayz ö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. |
moneypayz-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(), '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¤cy=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
- 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.
- Ödeme sayfanıza aşağıdaki
<iframe>kodunu ekleyin (adres yönlendirmedeki ile aynıdır). - Aynı sayfaya sonucu dinleyen küçük JavaScript kodunu ekleyin (
postMessage). - Müşteri ödemeyi iframe içinde tamamlar; siteniz sonucu (
status, order, tid, token) anında alır. - Siparişi kesin olarak webhook bildirimiyle onaylayın.
- Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
| Dosya / Sayfa | Nereye? | 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.php | Panel → Ayarlar → İşyeri Bildirimleri | Siparişi kesin olarak onaylar. |
Kendi Formunuzdan POST
- 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.
- Sitenizde kendi kart formunuzu hazırlayın (kart sahibi, numara, son kullanma, CVV).
- Sunucunuzda
hashimzasını üretin:merchant_no|order_id|amount|currency|installment|ok_url|fail_url|rnd→ HMAC-SHA256 (Secret Key) → base64. - Formu
POST /direct-postadresine gönderin; müşteri bankanın 3D Secure ekranına yönlenir. - Sonuç
ok_url/fail_urladresinize form POST olarak gelir; dönüş imzasını (merchant_no|order_id|status|tid|amount|rnd) doğrulayın. ok_urlvefail_urlhttps olmalı ve kayıtlı alan adınızda bulunmalıdır.- Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
| Dosya / Sayfa | Nereye? | Ne yapar? |
|---|---|---|
odeme.php | Kart 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.php | ok_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.php | fail_url (örn. https://siteniz.com/odeme/hata) | error_code / error_message gösterir, müşteriye tekrar deneme sunar. |
moneypayz-webhook.php | Panel → Ayarlar → İşyeri Bildirimleri | Yedek/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
- 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 "Havale/EFT ile öde" seçer.
- Müşteriyi
/checkout-transfer?pk=…&amount=…&order=…&return_url=…adresine yönlendirin (token kartla aynı şekilde kullanılabilir). - Müşteri MoneyPayz IBAN'ına havale yapar, dekontu yükler ve "Ödemeyi Tamamladım" der.
- İşlem "Onay Bekliyor" olur; dekont kontrol edilince onay/red kararı webhook ile bildirilir.
- Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
| Dosya / Sayfa | Nereye? | Ne yapar? |
|---|---|---|
odeme.php | "Havale/EFT ile öde" seçeneğinin gittiği yer | Siparişi "ödeme bekliyor" kaydeder ve müşteriyi /checkout-transfer adresine yönlendirir. |
siparis-sonuc.php | return_url | mp_status=pending gelir: "Dekontunuz alındı, onay sonrası siparişiniz hazırlanacak" mesajı gösterin. |
moneypayz-webhook.php | Panel → Ayarlar → İşyeri Bildirimleri | Dekont 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¤cy=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
- 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.
/checkout-transferadresini iframe ile gömün.- Sonuç dinleyicisini ekleyin; dekont yüklenince
status: "pending"mesajı gelir. - Onay/red kararı webhook ile bildirilir.
- Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
| Dosya / Sayfa | Nereye? | 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.php | Panel → Ayarlar → İşyeri Bildirimleri | Onay/red kararını alır. |
Kendi Formunuzdan POST
- 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.
- IBAN listesini alın:
GET /direct-post/ibans?api_key=…(isteğe bağlı¤cy=EUR). - Kendi formunuzda IBAN'ı gösterin; müşteri havaleyi yapıp dekontu yükler.
- Formu
multipart/form-dataolarakPOST /direct-post/transferadresine gönderin (sender_name, iban_id, receipt+ kartla aynı imza). - Müşteri
ok_url'estatus=pendingile döner; karar webhook ile gelir. - Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
| Dosya / Sayfa | Nereye? | Ne yapar? |
|---|---|---|
odeme-havale.php | Kendi Havale/EFT ekranınız | Sunucudan 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.php | ok_url | status=pending ile döner; bilgilendirme mesajı gösterin. |
moneypayz-webhook.php | Panel → Ayarlar → İşyeri Bildirimleri | Onay/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
- 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 "Kripto ile öde" seçer.
- Müşteriyi
/checkout-crypto?pk=…&amount=…&order=…&return_url=…adresine yönlendirin. - Müşteri coin seçer (USDT TRC20 / BTC), canlı kurla hesaplanan miktarı 15 dk içinde gönderir ve TXID girer.
- İşlem "Onay Bekliyor" olur; zincirde kontrol edilince karar webhook ile bildirilir.
- Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
| Dosya / Sayfa | Nereye? | Ne yapar? |
|---|---|---|
odeme.php | "Kripto ile öde" seçeneğinin gittiği yer | Müşteriyi /checkout-crypto adresine yönlendirir. |
siparis-sonuc.php | return_url | mp_status=pending ile döner. |
moneypayz-webhook.php | Panel → Ayarlar → İşyeri Bildirimleri | TXID 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¤cy=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
- 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.
/checkout-cryptoadresini iframe ile gömün.- Sonuç dinleyicisini ekleyin; TXID gönderilince
status: "pending"mesajı gelir. - Onay/red kararı webhook ile bildirilir.
- Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
| Dosya / Sayfa | Nereye? | 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.php | Panel → Ayarlar → İşyeri Bildirimleri | Karar bildirimi. |
Kendi Formunuzdan POST
- 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.
- Sunucunuzdan
POST /direct-post/crypto/quoteile kur teklifi alın (coin miktarı + cüzdan adresi, 15 dk geçerli). - Müşteriye miktarı ve adresi kendi ekranınızda gösterin;
quotedeğerini saklayın. - Müşteri ödeyince
POST /direct-post/cryptoilequote + txidgönderin → işlem "Onay Bekliyor". - Yanıt imzasını doğrulayın; karar webhook ile gelir.
- Canlıya almadan önce mağaza panelinizdeki Demo Ödemeler ile akışı deneyin.
| Dosya / Sayfa | Nereye? | Ne yapar? |
|---|---|---|
kripto-teklif.php | Sunucunuzda (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.php | Müşterinin TXID girdiği formun action adresi | POST /direct-post/crypto ile quote + txid gönderir; yanıt imzasını doğrular. |
moneypayz-webhook.php | Panel → Ayarlar → İşyeri Bildirimleri | Karar 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
- 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/moneypayz-webhook). - Panel → Ayarlar → İşyeri Bildirimleri alanına bu adresi kaydedip aktif edin.
- 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. - İ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? |
|---|---|---|
moneypayz-webhook.php | Sitenizin 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ş 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_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'taerror_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:
| Alan | Zorunlu | Açı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. |
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):¤cy=EURparametresi veya token/data içindecurrencyalanı. - Doğrudan POST ve v2 API:
currencyalanı (imzaya gönderdiğiniz yazımla girer). - Kart: bankaya giden istekte
currencygelen 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'tacurrencyalanı 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¤cy=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
| 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 / açıklama |
return_url | Hayır | Ödeme sonrası dönüş adresi (bkz. Dönüş) |
token / data | Hayır | Müş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)
| Alan | Zorunlu | Açıklama |
|---|---|---|
merchant_no | Evet | Mağaza No |
api_key | Evet | Publishable key |
order_id | Evet | Benzersiz sipariş no |
amount | Evet | Örn. 149.90 — hash'e aynı yazımla girer |
currency | Hayır | TRY (varsayılan), USD, EUR, GBP, RUB |
installment | Hayır | 1–12 (varsayılan 1) |
card_holder | Evet | Kart üzerindeki ad soyad |
card_number | Evet | Kart numarası |
exp_month + exp_year | Evet | veya tek alan exp = AA/YY |
cvv | Evet | 3–4 hane |
ok_url / fail_url | Evet | https dönüş adresleri |
rnd | Evet | Her istekte değişen rastgele değer |
hash | Evet | İstek imzası |
customer_name / customer_email / customer_phone / product | Hayı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.
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) | Alan | Zorunlu | Açıklama |
|---|---|---|
merchant_no, api_key, order_id, amount, currency, installment(=1), ok_url, fail_url, rnd, hash | Evet | Kart Doğrudan POST ile aynı alanlar ve aynı imza formülü |
sender_name | Evet | Gönderen ad soyad |
iban_id | Evet | /direct-post/ibans listesinden seçilen IBAN id — IBAN'ın para birimi currency ile aynı olmalı (aksi halde IBAN_CURRENCY). Listeyi ¤cy=EUR ile filtreleyebilirsiniz. |
receipt | Evet | Dekont dosyası (JPG, PNG, WEBP, PDF) |
customer_email / customer_phone / product / description | Hayır | Ek 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
- Kripto Para Seçiniz: USDT (TRC20) veya BTC.
- İş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.
- Ödemeyi Yaptım → TXID: müşteri cüzdanındaki işlem kimliğini (64 karakter hash) girer.
- İş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.
Ö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
Ö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ı
| Alan | Zorunlu | Açı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
| Alan | Zorunlu | Açı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
429veyaerror_code=RATE_LIMITdöner. - Tek kullanımlık kodlar: ödeme sayfası güvenlik kodu, kripto teklifi ve Doğrudan POST
rnddeğeri yalnızca bir kez kullanılabilir. Her istekte yenirndüretin; tekrar eden istek409ile 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.