EST (İş Bankası, Ziraat, Halkbank, TEB, Şekerbank)
EST / NestPay (Asseco) sanal POS entegrasyon referansı.
İş Bankası, Ziraat Bankası, Halkbank, TEB ve Şekerbank aynı EST (Asseco) sanal POS altyapısını kullanır. Tek bir sağlayıcı hepsini kapsar: bank canlı ortam adresini seçer. 3D Secure istekleri ve callback'leri hash sürüm 3 ile imzalanır: base64(SHA-512(alan adına göre sıralanmış değerler ve sonunda mağaza anahtarı, "|" ile birleştirilmiş)).
Ortak EST test ortamında İş Bankası test mağazasıyla doğrulandı: 3D'siz satış, iptal, iade, sipariş durumu ve dört 3D modelinin tamamı uçtan uca. Bankaların canlı ortam adresleri test edilmedi; canlıya geçmeden önce küçük bir tutarla deneyin.
Yapılandırma
import { betterPayment, est } from 'better-payment';
const payment = betterPayment({
providers: {
isbank: est({
bank: 'isbank', // 'isbank' | 'ziraat' | 'halkbank' | 'teb' | 'sekerbank'
clientId: process.env.EST_CLIENT_ID!,
username: process.env.EST_API_USER!,
password: process.env.EST_API_PASSWORD!,
storeKey: process.env.EST_STORE_KEY!,
// storeType?: '3d' | '3d_pay' | '3d_pay_hosting' | '3d_host' (default '3d')
// department?: number (BOLUM, when the bank assigned one)
// acceptedMdStatuses?: string[] (default ['1'], see below)
// baseUrl: defaults from mode (shared EST test host / the bank's host)
}),
},
});clientId mağaza numaranızdır. username ve password API kullanıcısına (XML API), storeKey ise 3D Secure mağaza anahtarına aittir; hepsi bankanın üye işyeri panelinden alınır. storeType, bankanın mağazanız için tanımladığı 3D modeliyle aynı olmalıdır.
paymentId sipariş numaranızdır: verdiğiniz conversationId ya da üretilen bir numara.
Doğrudan ödeme (3D'siz)
const result = await payment.isbank.createPayment({ ...paymentRequest, conversationId: 'ORDER123' });
// XML API Auth; success when ProcReturnCode is 00 and Response is Approved3D Secure
const init = await payment.isbank.initThreeDSPayment({
...paymentRequest,
conversationId: 'ORDER123',
callbackUrl: 'https://yoursite.com/api/pay/isbank/payment/complete-3ds',
});
// init.threeDSHtmlContent auto-submits a signed form to the bank's 3D gate3d_pay_hosting ve 3d_host modellerinde kart bilgisi bankanın kendi sayfasında alınır, bu yüzden istekte paymentCard gerekmez. Banka sonucu callbackUrl adresine POST eder:
const result = await payment.isbank.completeThreeDSPayment(callbackBody);Hash, dönen tüm alanların değerlerini kapsar ama alan adlarını kapsamaz; bu yüzden geçerli bir hash tek başına hangi değerin sipariş numarası olduğunu kanıtlamaz. Sonuç bankayla doğrulanır:
- hash'i geçersiz ya da başka bir
clientidiçin gelen callbackINVALID_HASHolarak reddedilir; 3d/3d_host: banka yalnızca kartı doğrular.mdStatuskabul edilen bir değerse kart XML APIAuthile (mdkullanılarak) tahsil edilir ve sonucu bankanın cevabı belirler;3d_pay/3d_pay_hosting: kartı banka tahsil eder. Onaylı bir callback sipariş durumu sorgusuyla kontrol edilir; bankanın doğrulamadığı bir ödemeINVALID_HASHolarak reddedilir.
paymentId ve conversationId yalnızca bankanın doğruladığı bir ödemede doldurulur; bu yüzden 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 ve 3d_host modellerinde varsayılan olarak yalnızca 1 tahsil edilir; diğer değerler MD_STATUS_<değer> ile başarısız olur. Yarım güvenli ödemeleri de tahsil etmek için bunları acceptedMdStatuses içinde listeleyin (örneğin ['1', '2', '3', '4']). Bu durumda ters ibraz (chargeback) sorumluluğu sizde kalabilir. 3d_pay ve 3d_pay_hosting modellerinde kararı banka verir.
İade, iptal ve durum sorgusu
await payment.isbank.refund({ paymentId: 'ORDER123', price: '50.00', currency: 'TRY', ip: '1.2.3.4' }); // Credit
await payment.isbank.cancel({ paymentId: 'ORDER123', ip: '1.2.3.4' }); // Void
const status = await payment.isbank.getPayment('ORDER123'); // ORDERSTATUS
// status: 'success' (captured sale), 'cancelled' (voided or refunded),
// 'failure' (declined or unknown order), 'pending' (anything else)Tarayıcı client'ı
better-payment/client içinde client.isbank özelliği yoktur. EST sağlayıcısına providers içindeki anahtarıyla ulaşın:
const result = await client.use('isbank').initThreeDSPayment(request);EST 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.