Masterpass Entegrasyonu
Masterpass Nedir?
Section titled “Masterpass Nedir?”Masterpass, Mastercard’ın dijital ödeme çözümüdür. Kullanıcılar kartlarını Masterpass sisteminde kayıt ettikten sonra, cep telefonu numaraları ile hızlı ve güvenli ödeme yapabilirler.
Pazaryeri sistemi, standart kart ödemelerinin yanı sıra Masterpass ile de ödeme almayı destekler.
Avantajları
Section titled “Avantajları”- ✅ Hızlı Ödeme - Kullanıcı kart bilgisi girmez, sadece SMS onayı
- ✅ Güvenli - Kart bilgileri Masterpass tarafından saklanır
- ✅ Mobil Uyumlu - Mobil cihazlarda kolay kullanım
- ✅ Kayıtlı Kartlar - Kullanıcıların Masterpass’e kayıtlı kartları kullanılır
CreatePayment (Masterpass)
Section titled “CreatePayment (Masterpass)”Masterpass ile ödeme almak için özel bir endpoint kullanılır.
Endpoint
Section titled “Endpoint”TEST:
POST https://apitest.paynkolay.com.tr/marketplace/v1/payment/create/MASTERPASSPROD:
POST https://api.paynkolay.com.tr/marketplace/v1/payment/create/MASTERPASSİstek Parametreleri
Section titled “İstek Parametreleri”Masterpass ödemesinde bankCard bilgileri gönderilmez. Bunun yerine gsm parametresi zorunludur.
{ "apiKey": "calculated_api_key", "apiSecretKey": "sx_value", "gsm": "5321234567", "trxCurrency": "TRY", "trxAmount": 150.00, "trxCode": "ORDER_12345", "trxType": "SALES", "callbackUrl": "https://yoursite.com/payment-callback", "sellerList": [ { "sellerExternalId": "SELLER_001", "trxAmount": 100.00, "withholdingTax": 0.80 }, { "sellerExternalId": "SELLER_002", "trxAmount": 50.00, "withholdingTax": 0.40 } ], "shippingCost": 0.00, "otherAmount": 0.00, "marketplaceCode": "MP12345"}Masterpass’e Özel Parametreler
Section titled “Masterpass’e Özel Parametreler”| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
gsm | String | ✅ | Kullanıcının cep telefonu (başında +90 olmadan) |
GSM Format:
✅ Doğru: "5321234567"❌ Yanlış: "+905321234567"❌ Yanlış: "05321234567"Ortak Zorunlu Parametreler
Section titled “Ortak Zorunlu Parametreler”Standart CreatePayment ile aynı zorunlu parametreler:
apiKeyapiSecretKeytrxCurrencytrxAmounttrxCodetrxTypecallbackUrlsellerListsellerList[].sellerExternalIdsellerList[].trxAmountsellerList[].withholdingTax
shippingCostotherAmountmarketplaceCode
GÖNDERİLMEYEN Parametreler
Section titled “GÖNDERİLMEYEN Parametreler”Masterpass ödemesinde aşağıdaki parametreler gönderilmez:
- ❌
bankCard(kart bilgileri) - ❌
installment - ❌
isFetchInstallments - ❌
encodedValue - ❌
customerCardInfo
{ "data": { "refCode": "REF123456789", "trxCode": "ORDER_12345", "form": "PGh0bWw+...Masterpass HTML Form Base64..." }, "success": true, "responseCode": "200", "responseMessage": "SUCCESS"}Yanıt formatı standart CreatePayment ile aynıdır. form alanı Base64 encoded HTML içerir.
Masterpass İşlem Akışı
Section titled “Masterpass İşlem Akışı”sequenceDiagram participant User as Kullanıcı participant Your as Sizin Sistem participant PNK as Pay N Kolay participant MP as Masterpass
User->>Your: GSM numarası ile ödeme başlat Your->>PNK: CreatePayment/MASTERPASS (gsm) PNK->>Your: HTML Form (Base64) Your->>Your: Base64 Decode Your->>User: Masterpass Form Göster User->>MP: Masterpass'e Giriş MP->>User: Kayıtlı Kartları Göster User->>MP: Kart Seç + SMS Onay MP->>PNK: Ödeme Sonucu PNK->>Your: callbackUrl'e POST Your->>User: Sonuç SayfasıÖrnek Kod
Section titled “Örnek Kod”<?phpclass MasterpassPayment { private $apiSecretKey; private $merchantSecretKey; private $mpCode; private $baseURL;
public function __construct($apiSecretKey, $merchantSecretKey, $mpCode, $baseURL) { $this->apiSecretKey = $apiSecretKey; $this->merchantSecretKey = $merchantSecretKey; $this->mpCode = $mpCode; $this->baseURL = $baseURL; }
private function calculateApiKey() { $hashString = $this->apiSecretKey . '|' . $this->merchantSecretKey; $hash = hash('sha512', $hashString, true); return base64_encode($hash); }
public function createMasterpassPayment($paymentData) { $apiKey = $this->calculateApiKey();
$data = [ 'apiKey' => $apiKey, 'apiSecretKey' => $this->apiSecretKey, 'gsm' => $paymentData['gsm'], 'trxCurrency' => 'TRY', 'trxAmount' => $paymentData['amount'], 'trxCode' => $paymentData['orderId'], 'trxType' => 'SALES', 'callbackUrl' => $paymentData['callbackUrl'], 'sellerList' => $paymentData['sellers'], 'shippingCost' => $paymentData['shippingCost'] ?? 0, 'otherAmount' => $paymentData['otherAmount'] ?? 0, 'marketplaceCode' => $this->mpCode ];
$ch = curl_init($this->baseURL . '/payment/create/MASTERPASS'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json' ]);
$response = curl_exec($ch); curl_close($ch);
return json_decode($response, true); }}
// Usage$masterpass = new MasterpassPayment( getenv('API_SECRET_KEY'), getenv('MERCHANT_SECRET_KEY'), 'MP12345', 'https://apitest.paynkolay.com.tr/marketplace/v1');
$payment = $masterpass->createMasterpassPayment([ 'gsm' => '5321234567', 'amount' => 250.00, 'orderId' => 'ORDER_789', 'callbackUrl' => 'https://yoursite.com/payment-callback', 'sellers' => [ [ 'sellerExternalId' => 'SELLER_001', 'trxAmount' => 250.00, 'withholdingTax' => 2.00 ] ]]);
// Display formif ($payment['success'] && isset($payment['data']['form'])) { $htmlForm = base64_decode($payment['data']['form']); echo $htmlForm;}?>using System;using System.Net.Http;using System.Security.Cryptography;using System.Text;using System.Text.Json;using System.Threading.Tasks;using System.Collections.Generic;
public class MasterpassPayment{ private readonly string apiSecretKey; private readonly string merchantSecretKey; private readonly string mpCode; private readonly string baseURL;
public MasterpassPayment(string apiSecretKey, string merchantSecretKey, string mpCode, string baseURL) { this.apiSecretKey = apiSecretKey; this.merchantSecretKey = merchantSecretKey; this.mpCode = mpCode; this.baseURL = baseURL; }
private string CalculateApiKey() { string hashString = $"{apiSecretKey}|{merchantSecretKey}"; using (var sha512 = SHA512.Create()) { byte[] bytes = sha512.ComputeHash(Encoding.UTF8.GetBytes(hashString)); return Convert.ToBase64String(bytes); } }
public async Task<JsonDocument> CreateMasterpassPayment(PaymentData paymentData) { string apiKey = CalculateApiKey();
var data = new { apiKey, apiSecretKey, gsm = paymentData.Gsm, trxCurrency = "TRY", trxAmount = paymentData.Amount, trxCode = paymentData.OrderId, trxType = "SALES", callbackUrl = paymentData.CallbackUrl, sellerList = paymentData.Sellers, shippingCost = paymentData.ShippingCost, otherAmount = paymentData.OtherAmount, marketplaceCode = mpCode };
using var client = new HttpClient(); var jsonContent = new StringContent( JsonSerializer.Serialize(data), Encoding.UTF8, "application/json" );
var response = await client.PostAsync($"{baseURL}/payment/create/MASTERPASS", jsonContent); var jsonString = await response.Content.ReadAsStringAsync(); return JsonDocument.Parse(jsonString); }}
public class PaymentData{ public string Gsm { get; set; } public decimal Amount { get; set; } public string OrderId { get; set; } public string CallbackUrl { get; set; } public List<Seller> Sellers { get; set; } public decimal ShippingCost { get; set; } public decimal OtherAmount { get; set; }}
public class Seller{ public string sellerExternalId { get; set; } public decimal trxAmount { get; set; } public decimal withholdingTax { get; set; }}
// Usagevar masterpass = new MasterpassPayment( Environment.GetEnvironmentVariable("API_SECRET_KEY"), Environment.GetEnvironmentVariable("MERCHANT_SECRET_KEY"), "MP12345", "https://apitest.paynkolay.com.tr/marketplace/v1");
// Create paymentvar payment = await masterpass.CreateMasterpassPayment(new PaymentData{ Gsm = "5321234567", Amount = 250.00m, OrderId = "ORDER_789", CallbackUrl = "https://yoursite.com/payment-callback", Sellers = new List<Seller> { new Seller { sellerExternalId = "SELLER_001", trxAmount = 250.00m, withholdingTax = 2.00m } }, ShippingCost = 0, OtherAmount = 0});
// Decode and display formif (payment.RootElement.GetProperty("success").GetBoolean() && payment.RootElement.GetProperty("data").TryGetProperty("form", out var formElement)){ byte[] formBytes = Convert.FromBase64String(formElement.GetString()); string htmlForm = Encoding.UTF8.GetString(formBytes); // Display HTML to user}import requestsimport hashlibimport base64import osimport json
class MasterpassPayment: def __init__(self, api_secret_key, merchant_secret_key, mp_code, base_url): self.api_secret_key = api_secret_key self.merchant_secret_key = merchant_secret_key self.mp_code = mp_code self.base_url = base_url
def calculate_api_key(self): hash_string = f"{self.api_secret_key}|{self.merchant_secret_key}" hash_bytes = hashlib.sha512(hash_string.encode('utf-8')).digest() return base64.b64encode(hash_bytes).decode('utf-8')
def create_masterpass_payment(self, payment_data): api_key = self.calculate_api_key()
data = { 'apiKey': api_key, 'apiSecretKey': self.api_secret_key, 'gsm': payment_data['gsm'], 'trxCurrency': 'TRY', 'trxAmount': payment_data['amount'], 'trxCode': payment_data['orderId'], 'trxType': 'SALES', 'callbackUrl': payment_data['callbackUrl'], 'sellerList': payment_data['sellers'], 'shippingCost': payment_data.get('shippingCost', 0), 'otherAmount': payment_data.get('otherAmount', 0), 'marketplaceCode': self.mp_code }
response = requests.post( f"{self.base_url}/payment/create/MASTERPASS", json=data )
return response.json()
# Usagemasterpass = MasterpassPayment( os.getenv('API_SECRET_KEY'), os.getenv('MERCHANT_SECRET_KEY'), 'MP12345', 'https://apitest.paynkolay.com.tr/marketplace/v1')
# Create paymentpayment = masterpass.create_masterpass_payment({ 'gsm': '5321234567', 'amount': 250.00, 'orderId': 'ORDER_789', 'callbackUrl': 'https://yoursite.com/payment-callback', 'sellers': [ { 'sellerExternalId': 'SELLER_001', 'trxAmount': 250.00, 'withholdingTax': 2.00 } ], 'shippingCost': 0, 'otherAmount': 0})
# Decode and display formif payment.get('success') and payment.get('data', {}).get('form'): html_form = base64.b64decode(payment['data']['form']).decode('utf-8') # Display HTML to userconst axios = require('axios');const crypto = require('crypto');
class MasterpassPayment { constructor(apiSecretKey, merchantSecretKey, mpCode, baseURL) { this.apiSecretKey = apiSecretKey; this.merchantSecretKey = merchantSecretKey; this.mpCode = mpCode; this.baseURL = baseURL; }
calculateApiKey() { const hashString = this.apiSecretKey + '|' + this.merchantSecretKey; const hash = crypto.createHash('sha512').update(hashString, 'utf8').digest(); return hash.toString('base64'); }
async createMasterpassPayment(paymentData) { const apiKey = this.calculateApiKey();
const response = await axios.post( `${this.baseURL}/payment/create/MASTERPASS`, { apiKey, apiSecretKey: this.apiSecretKey, gsm: paymentData.gsm, trxCurrency: 'TRY', trxAmount: paymentData.amount, trxCode: paymentData.orderId, trxType: 'SALES', callbackUrl: paymentData.callbackUrl, sellerList: paymentData.sellers, shippingCost: paymentData.shippingCost || 0, otherAmount: paymentData.otherAmount || 0, marketplaceCode: this.mpCode } );
return response.data; }}
// Usageconst masterpass = new MasterpassPayment( process.env.API_SECRET_KEY, process.env.MERCHANT_SECRET_KEY, 'MP12345', 'https://apitest.paynkolay.com.tr/marketplace/v1');
// Create paymentconst payment = await masterpass.createMasterpassPayment({ gsm: '5321234567', amount: 250.00, orderId: 'ORDER_789', callbackUrl: 'https://yoursite.com/payment-callback', sellers: [ { sellerExternalId: 'SELLER_001', trxAmount: 250.00, withholdingTax: 2.00 } ], shippingCost: 0, otherAmount: 0});
// Decode and display formif (payment.success && payment.data.form) { const htmlForm = Buffer.from(payment.data.form, 'base64').toString('utf-8'); // Display HTML to user}Callback İşleme
Section titled “Callback İşleme”Masterpass ödemesinin callback işlemi standart ödeme ile aynıdır:
app.post('/payment-callback', (req, res) => { const { trxCode, responseCode, referenceCode, authAmount, timestamp, hash, paymentSystem // Masterpass için "MASTERPASS" değeri gelir } = req.body;
// Hash doğrula const calculatedHash = calculateCallbackHash({ timestamp, referenceCode, trxCode, authAmount, responseCode }, apiSecretKey);
if (calculatedHash !== hash) { return res.status(400).send('Invalid hash'); }
// Ödeme başarılı mı? if (responseCode === '00' || responseCode === '0000') { // Masterpass ile ödeme başarılı console.log('Masterpass ödeme başarılı:', trxCode); updateOrderStatus(trxCode, 'PAID', 'MASTERPASS'); } else { console.log('Masterpass ödeme başarısız:', responseCode); updateOrderStatus(trxCode, 'FAILED'); }
res.status(200).send('OK');});Kullanıcı Arayüzü Örneği
Section titled “Kullanıcı Arayüzü Örneği”Ödeme Yöntemi Seçimi
Section titled “Ödeme Yöntemi Seçimi”<div class="payment-methods"> <label> <input type="radio" name="paymentMethod" value="card"> Kredi/Banka Kartı </label>
<label> <input type="radio" name="paymentMethod" value="masterpass"> <img src="/images/masterpass-logo.png" alt="Masterpass"> Masterpass ile Öde </label></div>
<div id="card-form" style="display:none;"> <!-- Standart kart formu --> <input type="text" name="cardNumber" placeholder="Kart Numarası"> <input type="text" name="cardHolder" placeholder="Kart Üzerindeki İsim"> <!-- ... --></div>
<div id="masterpass-form" style="display:none;"> <label>Cep Telefonu Numaranız:</label> <input type="tel" name="gsm" placeholder="5XX XXX XX XX" pattern="5[0-9]{9}"> <small>Masterpass'e kayıtlı cep telefonu numaranız</small></div>
<script>document.querySelectorAll('input[name="paymentMethod"]').forEach(radio => { radio.addEventListener('change', (e) => { document.getElementById('card-form').style.display = e.target.value === 'card' ? 'block' : 'none';
document.getElementById('masterpass-form').style.display = e.target.value === 'masterpass' ? 'block' : 'none'; });});</script>Form Gönderimi
Section titled “Form Gönderimi”async function processPayment(formData) { const paymentMethod = formData.get('paymentMethod');
if (paymentMethod === 'masterpass') { // Masterpass ile ödeme const gsm = formData.get('gsm').replace(/\s/g, ''); // Boşlukları temizle
// GSM validasyonu if (!/^5[0-9]{9}$/.test(gsm)) { alert('Geçerli bir cep telefonu numarası girin'); return; }
const response = await fetch('/api/payment/masterpass', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ gsm: gsm, amount: orderTotal, orderId: orderId }) });
const result = await response.json();
if (result.success) { // Base64 decode ve göster const htmlForm = atob(result.data.form); document.body.innerHTML = htmlForm; }
} else { // Standart kart ile ödeme // ... }}Masterpass Özellikleri
Section titled “Masterpass Özellikleri”Kart Bilgisi Gerekmiyor
Section titled “Kart Bilgisi Gerekmiyor”// ❌ YANLIŞ - Masterpass için kart bilgisi göndermeyin{ "bankCard": { "cardNumber": "...", "cvv": "..." }, "gsm": "5321234567"}
// ✅ DOĞRU - Sadece GSM yeterli{ "gsm": "5321234567" // bankCard GÖNDERİLMEZ}Taksit Desteği
Section titled “Taksit Desteği”Masterpass ödemelerinde taksit seçenekleri Masterpass ekranında gösterilir. API isteğinde taksit parametresi gönderilmez.
Kayıtlı Kartlar
Section titled “Kayıtlı Kartlar”GSM numarası kullanılarak kullanıcının Masterpass’e kayıtlı kartları otomatik olarak getirilir. Ek bir işlem gerekmez.
Hata Durumları
Section titled “Hata Durumları”Masterpass’e Kayıtlı Değil
Section titled “Masterpass’e Kayıtlı Değil”Kullanıcının GSM numarası Masterpass’e kayıtlı değilse, Masterpass ekranında kayıt olma seçeneği sunulur.
// Kullanıcıyı bilgilendirif (paymentMethod === 'masterpass') { alert( 'Masterpass ile ödeme yapmak için Masterpass hesabınızın olması gerekmektedir. ' + 'Eğer hesabınız yoksa, ödeme ekranında Masterpass\'e kayıt olabilirsiniz.' );}Geçersiz GSM
Section titled “Geçersiz GSM”function validateGSM(gsm) { // Başında 5, toplam 10 hane if (!/^5[0-9]{9}$/.test(gsm)) { throw new Error('Geçersiz GSM formatı. Başında 0 olmadan 10 hane olmalı.'); } return true;}Masterpass vs Standart Kart
Section titled “Masterpass vs Standart Kart”| Özellik | Masterpass | Standart Kart |
|---|---|---|
| Kart Bilgisi | ❌ Gerekmiyor | ✅ Gerekiyor |
| GSM | ✅ Zorunlu | ❌ Opsiyonel |
| Hız | ⚡ Çok Hızlı | 🐢 Daha Yavaş |
| Güvenlik | 🔒 Masterpass | 🔒 3D Secure |
| Kayıtlı Kart | ✅ Otomatik | ❌ Manuel |
| Mobil | 📱 Optimize | 💻 Standart |
Test Etme
Section titled “Test Etme”Masterpass test işlemleri için:
- Test GSM Numarası: Mastercard tarafından sağlanan test numaralarını kullanın
- Test Kartları: Masterpass test hesabına test kartları ekleyin
- Test Ortamı:
apitest.paynkolay.com.trkullanın
Sonraki Adımlar
Section titled “Sonraki Adımlar”Masterpass entegrasyonunu tamamladıktan sonra:
- Raporlama - Masterpass işlemlerini raporlayın
- Ödeme İşlemleri - Standart kart ödemeleri
- Ödeme Değişiklikleri - Masterpass iadesi