- Node.js
- iyzico
- Geçiş
iyzipay paketinden Better Payment'a geçiş
Resmi iyzipay Node.js paketini kullanıyorsanız Better Payment'a nasıl geçersiniz: kod karşılaştırması, callback doğrulama ve adım adım geçiş listesi.
Yazar:Furkan Özay
2 dk okuma
iyzico'nun resmi Node.js paketi iyzipay, iyzico API'sini birebir yansıtan, callback tabanlı bir istemcidir. İşini görür, ama birkaç işi size bırakır: callback sonucunu kontrol etmek, Base64 içeriği çözmek, hataları kendi durum modelinize çevirmek. Projeye ikinci bir ödeme sağlayıcısı eklendiğinde bu işlerin hepsini yeniden yazmanız gerekir.
Better Payment iyzico'nun alan adlarını korur. Bu yüzden mevcut istek nesnelerinizin büyük kısmı olduğu gibi çalışır ve geçiş genellikle birkaç saatlik bir iştir.
Kurulum
npm install better-paymentBetter Payment'ın çalışma zamanı bağımlılığı yoktur; yalnızca fetch ve WebCrypto kullanır. Bu sayede Vercel Edge ve Cloudflare Workers'ta da çalışır.
İstemci
iyzipay:
const Iyzipay = require('iyzipay');
const iyzipay = new Iyzipay({
apiKey: process.env.IYZICO_API_KEY,
secretKey: process.env.IYZICO_SECRET_KEY,
uri: 'https://sandbox-api.iyzipay.com',
});Better Payment:
import { betterPayment, iyzico } from 'better-payment';
export const payment = betterPayment({
mode: 'sandbox', // sandbox URL'leri; canlıda 'production'
providers: {
iyzico: iyzico({
apiKey: process.env.IYZICO_API_KEY!,
secretKey: process.env.IYZICO_SECRET_KEY!,
}),
},
});3D Secure başlatma
iyzipay:
iyzipay.threedsInitialize.create(
{
locale: Iyzipay.LOCALE.TR,
conversationId: 'ORDER123',
price: '100.00',
paidPrice: '100.00',
currency: Iyzipay.CURRENCY.TRY,
installment: '1',
basketId: 'B1',
paymentChannel: Iyzipay.PAYMENT_CHANNEL.WEB,
paymentGroup: Iyzipay.PAYMENT_GROUP.PRODUCT,
callbackUrl: 'https://magazaniz.com/odeme/sonuc',
paymentCard, buyer, shippingAddress, billingAddress, basketItems,
},
(err, result) => {
if (err || result.status !== 'success') return handleError(err ?? result);
const html = Buffer.from(result.threeDSHtmlContent, 'base64').toString('utf8');
res.send(html);
}
);Better Payment:
const init = await payment.iyzico.initThreeDSPayment({
conversationId: 'ORDER123',
price: '100.00',
paidPrice: '100.00',
currency: 'TRY',
installment: 1,
basketId: 'B1',
callbackUrl: 'https://magazaniz.com/api/pay/iyzico/payment/complete-3ds',
paymentCard, buyer, shippingAddress, billingAddress, basketItems,
});
if (init.status === 'pending') res.send(init.threeDSHtmlContent); // Base64 zaten çözülmüşFarklar:
locale,paymentChannelvepaymentGroupvarsayılan olarak doldurulur.installmentsayıdır.paymentCard,buyer, adresler vebasketItemsaynı alan adlarını kullanır.- Callback yerine
Promisedöner ve hata fırlatmak yerinestatustaşıyan bir sonuç verir.
Callback: en önemli fark
iyzipay ile callback'te genellikle şuna benzer bir kod yazılır:
app.post('/odeme/sonuc', (req, res) => {
iyzipay.threedsPayment.create(
{
locale: Iyzipay.LOCALE.TR,
conversationId: req.body.conversationId,
paymentId: req.body.paymentId,
conversationData: req.body.conversationData,
},
(err, result) => { /* siparişi güncelle */ }
);
});Callback isteğinin status ve mdStatus alanlarını kontrol etmek, ödemeyi tamamlama isteğinin sonucunu doğru yorumlamak ve aynı callback iki kez geldiğinde siparişi iki kez işlememek sizin sorumluluğunuzdadır.
Better Payment'ta callback gövdesini olduğu gibi verirsiniz:
const result = await payment.iyzico.completeThreeDSPayment(req.body);
if (result.status === 'success') await markPaid(result.paymentId);Kütüphane 3D doğrulamasının başarılı olduğunu kontrol eder ve ödemeyi iyzico API'si üzerinden sizin anahtarlarınızla tamamlar. Sahte ya da başarısız bir callback her zaman failure döner. HTTP handler kullanırsanız bu endpoint'i de yazmanız gerekmez. Neden önemli olduğunu 3D Secure callback'lerini doğrulama yazısında anlattık.
Sonuç ve hata modeli
| iyzipay | Better Payment |
|---|---|
result.status === 'success' / 'failure' | success, failure, pending, cancelled |
result.errorCode (iyzico kodu) | errorCode (ham kod) + code (sağlayıcıdan bağımsız, örneğin INSUFFICIENT_FUNDS) |
Ağ hatasında err | pending + NETWORK_ERROR; ödeme gerçekleşmiş olabilir, önce getPayment ile sorgulayın |
Diğer işlemler
| iyzipay | Better Payment |
|---|---|
iyzipay.payment.create | payment.iyzico.createPayment |
iyzipay.payment.retrieve | payment.iyzico.getPayment(paymentId) |
iyzipay.refund.create | payment.iyzico.refund({ paymentId, price, currency, ip }) |
iyzipay.cancel.create | payment.iyzico.cancel({ paymentId, ip }) |
iyzipay.binNumber.retrieve | payment.iyzico.binCheck(bin) |
iyzipay.checkoutFormInitialize.create | payment.iyzico.initCheckoutForm(...) |
Her yöntemin tam imzası iyzico sayfasında var.
Geçiş listesi
better-paymentpaketini kurun ve ödeme nesnesini oluşturun.- 3D Secure başlatma çağrısını
initThreeDSPaymentile değiştirin; Base64 çözme kodunu silin. - Callback endpoint'inizi
completeThreeDSPaymentile ya da doğrudan HTTP handler ile değiştirin. - Sonuç kontrollerinizi
statusvecodeüzerine taşıyın;NETWORK_ERRORiçingetPaymentsorgusu ekleyin. - Sandbox'ta test kartlarıyla uçtan uca deneyin, sonra
mode: 'production'yapın. iyzipaypaketini kaldırın.
Bundan sonra PayTR, Sipay, Parampos ya da bir banka sanal POS'u eklemek, providers listesine bir satır eklemek kadar kolaydır. Kodunuzun geri kalanı aynı kalır.
Okumaya devam edin
- Next.js
- iyzico
- 3D Secure
Next.js ile iyzico 3D Secure entegrasyonu: adım adım rehber
Next.js App Router'da iyzico ile 3D Secure ödeme almak: kurulum, sunucuda istek oluşturma, callback doğrulama ve siparişi güncelleme.
- Node.js
- PayTR
- Express
Node.js ile PayTR iFrame API entegrasyonu
PayTR iFrame API'yi Node.js'te kullanmak: token oluşturma, ödeme sayfasını gösterme, Bildirim URL'ini doğrulama ve OK yanıtı.