Garanti BBVA
0.12.0 sürümünde eklendiGaranti BBVA sanal POS (GVP) entegrasyon referansı.
Garanti BBVA sanal POS XML API'sini (sürüm 512) kullanır. Her istek bir HashData taşır: SHA512(OrderID + TerminalID + kart numarası + Amount + CurrencyCode + SecurityData); burada SecurityData, SHA1(şifre + 9 haneye tamamlanmış terminal numarası) değeridir. İkisi de ISO-8859-9 üzerinden büyük harfli hex olarak hesaplanır.
Garanti BBVA test ortamında doğrulananlar: 3D'siz satış, sipariş sorgusu, iptal, kısmi iade ve iki modelde de (3D ve 3D_PAY) uçtan uca 3D Secure; test SMS kodu isteyen bir kart da buna dahil. Test callback'leri SHA-512 ile imzalanıyor.
Yapılandırma
import { betterPayment, garanti } from 'better-payment';
const payment = betterPayment({
providers: {
garanti: garanti({
merchantId: process.env.GARANTI_MERCHANT_ID!,
terminalId: process.env.GARANTI_TERMINAL_ID!,
password: process.env.GARANTI_PROVAUT_PASSWORD!,
storeKey: process.env.GARANTI_STORE_KEY!,
// refundPassword?: string (PROVRFN password, when it differs)
// securityLevel?: '3D' | '3D_PAY' | 'GARANTI_PAY' (default '3D')
// provUserId / refundUserId: default PROVAUT / PROVRFN
// testMode: defaults to mode === 'sandbox' (Mode TEST)
// baseUrl: defaults from mode (sanalposprovtest.garantibbva.com.tr / sanalposprov.garanti.com.tr)
}),
},
});password PROVAUT (provizyon) kullanıcısının şifresi, storeKey ise 3D Secure mağaza anahtarıdır; ikisi de Garanti BBVA sanal POS panelinde tanımlanır. İptal ve iadeler PROVRFN kullanıcısıyla yapılır; refundPassword verilmişse onunla imzalanır.
paymentId sipariş numaranızdır: verdiğiniz conversationId ya da üretilen bir numara.
Doğrudan ödeme (3D'siz)
const result = await payment.garanti.createPayment({ ...paymentRequest, conversationId: 'ORDER123' });
// XML sales; success when the response Code is 003D Secure
const init = await payment.garanti.initThreeDSPayment({
...paymentRequest,
conversationId: 'ORDER123',
callbackUrl: 'https://yoursite.com/checkout/garanti/callback', // your own route
});
// init.threeDSHtmlContent auto-submits a form signed with secure3dhash to the 3D engineGaranti BBVA sonucu callbackUrl adresine POST eder:
// orderId, amount and currency come from your own records, never from the callback body
const result = await payment.garanti.completeThreeDSPayment(callbackBody, { orderId, amount, currency });Callback hash değeri hashparams içinde adı geçen alanlardan yeniden oluşturulur (hashparamsval hiçbir zaman kullanılmaz) ve sipariş numarasıyla mdstatus alanını kapsamalıdır. Değerler ayraçsız birleştirildiği için sonuç ayrıca bankayla doğrulanır:
- hash'i geçersiz, başka bir terminale ya da verdiğiniz
orderIddışında bir siparişe ait callbackINVALID_HASHolarak reddedilir; 3D:mdstatus1ise ödeme, kendi kayıtlarınızdakiorderId,amountvecurrencyile XMLsalesüzerinden provizyona gönderilir ve sonucu bankanın cevabı belirler. Banka bu istekte yazanı çektiği ve yeniden bölünmüş bir callback başka değerler taşıyabileceği için bu değerler burada zorunludur;3D_PAY: onaylı bir callback sipariş sorgusuyla kontrol edilir ve bankadaki tutar sizinamountdeğerinizle (verilmemişse callback'teki tutarla) aynı olmalıdır; bankanın doğrulamadığı bir ödemeINVALID_HASHolarak reddedilir.
İkinci argüman callback gövdesinden asla okunmaz. Varsayılan handler rotası yalnızca gövdeyi iletir; bu yüzden 3D için ödemeyi kendi rotanızda tamamlayın. paymentId ve conversationId yalnızca bankanın doğruladığı bir ödemede, zaman aşımında ise yalnızca orderId verdiyseniz doldurulur; başarısız bir sonuç hiçbir zaman callback'ten alınan bir sipariş numarası taşımaz.
mdstatus
mdstatus 1, kartın tam olarak doğrulandığı anlamına gelir. 2, 3 ve 4 yarım güvenlidir: kart ya da bankası 3D Secure'a kayıtlı değildir veya yalnızca bir deneme yapılmıştır. 3D modelinde varsayılan olarak yalnızca 1 provizyona gönderilir; diğer değerler MD_STATUS_<değer> ile başarısız olur. Yarım güvenli ödemeleri de provizyona göndermek için bunları acceptedMdStatuses içinde listeleyin (örneğin ['1', '2', '3', '4']). Bu durumda ters ibraz (chargeback) sorumluluğu sizde kalabilir. 3D_PAY modelinde kararı banka verir.
GarantiPay
GarantiPay, müşterinin kart bilgisi girmek yerine Garanti BBVA Mobil veya BonusFlaş uygulamasıyla ödemesini sağlar. securityLevel: 'GARANTI_PAY' ile initThreeDSPayment() için paymentCard gerekmez: formu (txntype gpdatarequest, güvenlik seviyesi CUSTOM_PAY) Garanti'nin GarantiPay sayfasını açar; müşteri telefon numarası veya TC kimlik numarasıyla devam eder ve ödemeyi uygulamada onaylar. Müşteri orada Bonus, çek ve mil puanlarını da kullanabilir. Kart sağlayıcınızın yanında, aynı terminalle ayrı bir sağlayıcı anahtarı kullanın:
const payment = betterPayment({
providers: {
garantipay: garanti({
merchantId: process.env.GARANTI_MERCHANT_ID!,
terminalId: process.env.GARANTI_TERMINAL_ID!,
password: process.env.GARANTI_PROVAUT_PASSWORD!,
storeKey: process.env.GARANTI_STORE_KEY!,
securityLevel: 'GARANTI_PAY',
companyName: 'My Shop', // shown on the GarantiPay page
}),
},
});
const init = await payment.garantipay.initThreeDSPayment({
...paymentRequest, // no paymentCard
conversationId: 'ORDER123',
callbackUrl: 'https://yoursite.com/api/pay/garantipay/payment/complete-3ds',
});Ödemeyi banka kendisi çektiği için callback 3D_PAY gibi tamamlanır: hash kontrol edilir ve onaylı bir callback sipariş sorgusuyla doğrulanır.
Test terminalinde GarantiPay formu ve hash'i kabul edildi ve GarantiPay sayfası açıldı, ancak bir ödeme tamamlanamadı: bunun için uygulamada onay veren bir test müşterisi gerekir. Sayfanın süresi dolduğunda banka imzasız bir hata gönderdi (procreturncode 92); bu, numara taşımayan bir başarısızlık olarak döner. GarantiPay'in terminaliniz için Garanti BBVA tarafından açılması gerekir. Canlıya geçmeden önce küçük bir tutarla deneyin.
İade, iptal ve durum sorgusu
await payment.garanti.refund({ paymentId: 'ORDER123', price: '50.00', currency: 'TRY', ip: '1.2.3.4' }); // refund
await payment.garanti.cancel({ paymentId: 'ORDER123', ip: '1.2.3.4' }); // void
const status = await payment.garanti.getPayment('ORDER123'); // orderinq
// status: 'success' (APPROVED), 'cancelled' (VOID / REFUND), 'failure' (DECLINED)Satış tutarından düşük bir iade kısmi iadedir. cancel() satışı aynı gün iptal eder; siparişte daha önce iade yapılmışsa Garanti BBVA asıl işlemin numarasını ister, bu durumda refund() kullanın.
Garanti BBVA için BIN ve taksit sorgusu desteklenmez: binCheck() ve installmentInfo() NOT_SUPPORTED fırlatır. Ödeme isteğinde installment gönderin ve paidPrice değerini anlaşmalı oranlarınızdan hesaplayın.