Yapı Kredi
0.12.0 sürümünde eklendiYapı Kredi sanal POS (Posnet XML) entegrasyon referansı.
Yapı Kredi Posnet XML API'sini kullanır. 3D Secure, Posnet OOS üzerinden çalışır: kart oosRequestData servisine gönderilir, bankanın şifreli verisi 3D servisine POST edilir, sonuç oosResolveMerchantData ile çözülür ve oosTranData ile tahsil edilir. İkisi de bir MAC ile imzalanır: base64(SHA256(XID;tutar;para birimi;üye işyeri no;base64(SHA256(encKey;terminal no)))).
Yapı Kredi dokümanlarındaki test üye işyeriyle test ortamında kontrol edildi: sipariş sorgusu ve 3D veri isteği (oosRequestData) cevaplandı, MAC da dokümanın kendi örneğiyle aynı çıktı. Bu üye işyerinde 3D'siz satış açık değil ve 3D sayfası yerel bir test sayfasından gelen istekleri reddetti; bu yüzden uçtan uca bir ödeme yapılamadı. Canlıya geçmeden önce küçük bir tutarla test edin.
Yapılandırma
import { betterPayment, yapikredi } from 'better-payment';
const payment = betterPayment({
providers: {
yapikredi: yapikredi({
merchantId: process.env.YAPIKREDI_MERCHANT_ID!,
terminalId: process.env.YAPIKREDI_TERMINAL_ID!,
posnetId: process.env.YAPIKREDI_POSNET_ID!,
encKey: process.env.YAPIKREDI_ENC_KEY!,
// acceptedMdStatuses?: string[] (default ['1'])
// baseUrl: defaults from mode (setmpos.ykb.com / posnet.yapikredi.com.tr)
}),
},
});Sipariş numarası (conversationId) harf, rakam veya _ içerir: 3D Secure ödemelerde en fazla 20 (20 karakterlik XID olarak gönderilir), 3D'siz satışlarda en fazla 24 karakter; soldan sıfırla tamamlanır. Başarılı bir ödeme paymentId olarak bankanın host log key değerini döndürür; refund() ve cancel() bu değeri alır.
Doğrudan ödeme (3D'siz)
const result = await payment.yapikredi.createPayment({ ...paymentRequest, conversationId: 'ORDER123' });
// result.paymentId is the host log key3D Secure
const init = await payment.yapikredi.initThreeDSPayment({
...paymentRequest,
conversationId: 'ORDER123',
callbackUrl: 'https://yoursite.com/payment/yapikredi/return',
});
// init.threeDSHtmlContent auto-submits the bank's encrypted data to its 3D serviceYapı Kredi callbackUrl adresine BankPacket, MerchantPacket ve Sign alanlarını POST eder. MAC sipariş numaranızı, tutarı ve para birimini kapsar; callback bunları yalnızca şifreli taşıdığı için ödemeyi kendi kayıtlarınızdaki siparişle tamamlayın. Kendi değerleriniz geçerli olsun diye önce callback'i yayın:
const result = await payment.yapikredi.completeThreeDSPayment({
...callbackBody,
orderId: order.id,
amount: order.total, // as in the payment request, e.g. '1.20'
currency: 'TRY',
});Bu yüzden Yapı Kredi callback'leri handler'ın callback route'u ile değil, kendi route'unuzda tamamlanır. Sonuç bankayla doğrulanır:
- çözülen XID, tutar ve para birimi siparişinizle aynı olmalı ve bankanın cevaptaki MAC'i (
mdStatus;xid;amount;currency;merchantId;firstHash) tutmalıdır, aksi haldeINVALID_HASHolarak reddedilir; - kart yalnızca
mdStatuskabul edilen bir değerse (varsayılan olarak yalnızca1; bkz.acceptedMdStatuses)oosTranDataile tahsil edilir ve sonucu bankanın cevabı belirler. Tahsilat cevabındaki MAC (hostlogkey;xid;...) tutmazsa sonuçpendingolur:getPayment()ile kontrol edin.
paymentId ve conversationId yalnızca bankanın onayladığı bir ödemede doldurulur.
İade ve iptal
await payment.yapikredi.refund({ paymentId: hostLogKey, price: '50.00', currency: 'TRY', ip: '1.2.3.4' }); // return
await payment.yapikredi.cancel({ paymentId: hostLogKey, ip: '1.2.3.4' }); // reverse
const status = await payment.yapikredi.getPayment('ORDER123'); // agreement, by order idgetPayment(), bankanın agreement sorgusu gibi sizin sipariş numaranızı alır: önce 3D'siz sipariş numarasını, sonra 3D Secure numarasını (TDS_ + XID) dener. Başarılı bir satış success, siparişte başarılı bir iptal veya iade varsa cancelled, başarılı satışı olmayan bir sipariş failure döner.
BIN ve taksit sorgusu desteklenmez: Yapı Kredi'de bu servisler yoktur. binCheck() ve installmentInfo() NOT_SUPPORTED fırlatır.