Ödeme Olayları
Ödeme sonuçlarına, hangi sağlayıcı ya da akıştan gelirse gelsin, tek bir tipli dinleyiciyle tepki verin.
Bir ödemeyi değiştiren her işlem bir olay yayınlar: bir 3D Secure callback'i, bir PayTR bildirimi, yönetim panelinizden yapılan bir iade. Her sonucu tek tek kontrol etmek yerine olayları dinleyin ve siparişlerinizi tek bir yerde güncelleyin.
payment.on('payment.succeeded', async (event) => {
await orders.markPaid(event.conversationId, event.paymentId);
});
payment.on('refund.succeeded', async (event) => {
await orders.addRefund(event.paymentId, event.amount);
});
// Every event
const off = payment.on('*', (event) => console.log(event.type, event.provider));
off(); // removes the listenerOlaylar her sağlayıcı için yayınlanır; çağrı ödeme nesnesinde, bir sağlayıcıda ya da HTTP handler üzerinden yapılmış olabilir.
Olaylar
| Olay | Ne zaman yayınlanır |
|---|---|
payment.succeeded | createPayment, completeThreeDSPayment ya da capture başarılı olduğunda |
payment.authorized | authorize başarılı olduğunda: tutar kartta bloke edilmiştir |
payment.pending | createPayment, completeThreeDSPayment, authorize ya da capture pending döndüğünde, örneğin NETWORK_ERROR ile |
payment.failed | bir ödeme işlemi, initThreeDSPayment ya da initThreeDSAuthorize başarısız olduğunda |
payment.cancelled | cancel ya da voidAuthorization başarılı olduğunda |
refund.succeeded | refund başarılı olduğunda |
refund.failed | refund başarısız olduğunda |
3D Secure ön provizyon completeThreeDSPayment ile tamamlanır; bu yüzden tutar bloke edildiğinde payment.succeeded yayınlar. Durum sorguları (getPayment) ve kart işlemleri olay yayınlamaz.
Olaylar yalnızca sağlayıcının doğruladığı sonuçlar için yayınlanır. Sahte ya da değiştirilmiş bir callback (errorCode: 'INVALID_HASH') hiçbir olay yayınlamaz.
Olay nesnesi
interface PaymentEvent {
type: PaymentEventType; // 'payment.succeeded', ...
provider: string; // the provider id, e.g. 'iyzico'
operation: PaymentOperation; // 'createPayment', 'completeThreeDSPayment', ...
paymentId?: string; // the provider's payment id, when known
conversationId?: string; // your order id, when known
amount?: string; // charged or refunded amount, from the request
currency?: string;
code?: PaymentErrorCode; // normalized error code of failures
result: unknown; // the result returned to the caller
request: unknown; // the request (the callback data for 3D Secure completions)
}Belirli bir olayın dinleyicisi daraltılmış tipi alır: payment.on('payment.failed', (event) => ...) içinde event.type, 'payment.failed' tipindedir.
amount ve currency istekten gelir. 3D Secure ödemenin callback'inde tutar bulunmaz, bu yüzden orada boştur: siparişi conversationId ile bulun.
Bir dinleyici hata verirse
Dinleyiciler işlemden sonra sırayla çalışır ve beklenir. Biri hata fırlatırsa işlem bir EventListenerError fırlatır. Ödemenin kendisi gerçekleşmiştir, bu yüzden hata sonucu taşır:
import { EventListenerError } from 'better-payment';
try {
await payment.createPayment(request);
} catch (error) {
if (error instanceof EventListenerError) {
error.result; // the payment result
error.event; // the event whose listener failed
error.cause; // what the listener threw
}
}HTTP handler bunu sizin için ele alır:
- Sağlayıcı callback'leri (
payment/complete-3ds,callback)500döner. Sağlayıcı callback'i yeniden gönderir (PayTR bildirimini tekrarlar) ve dinleyiciler, sağlayıcı yeniden çağrılmadan, saklanan sonuçla tekrar çalışır. OlaylaronCallback'ten hemen önce yayınlanır; böylece ikisi birlikte yeniden denenir. - Diğer adresler (
payment,refund, ...) sonucu her zamanki gibi döner ve hataloggerile loglanır. Ödeme gerçekleşmiştir: hata yanıtı client'ın iki kez ödeme yapmasına yol açabilir.
Dinleyicileri iki kez çalışmaları zarar vermeyecek şekilde yazın; örneğin siparişi güncellemeden önce durumunu kontrol edin.
Plugin'lerde olaylar
Bir plugin dinleyicilerini events içinde tanımlar. Her olayda önce o olayın dinleyicileri, sonra * dinleyicileri çalışır. İki grupta da plugin dinleyicileri plugin sırasıyla ve payment.on() ile eklenen dinleyicilerden önce çalışır:
import { definePlugin } from 'better-payment';
export const slackAlerts = (webhookUrl: string) =>
definePlugin({
id: 'slack-alerts',
events: {
'payment.failed': async (event) => {
await fetch(webhookUrl, {
method: 'POST',
body: JSON.stringify({ text: `Payment failed on ${event.provider}: ${event.code}` }),
});
},
},
});Tekrarlanan gönderimler
Sağlayıcılar aynı callback'i birden fazla kez gönderebilir. HTTP handler callback'leri tekilleştirir; tekrarlanan bir gönderim yeni bir olay yayınlamaz. completeThreeDSPayment()'ı kendiniz çağırıyorsanız tekilleştirmeyi dinleyicinizde yapın.