Bekleyen Ödeme Çözümleyici (Pending Resolver)
Zaman aşımına uğrayan ödemeleri (NETWORK_ERROR) sağlayıcıyı belirli aralıklarla sorgulayarak çift çekim riski olmadan çözün.
Bir ödeme sağlayıcısı yanıt vermediğinde (zaman aşımı veya ağ kopması), better-payment status: 'pending' ve code: 'NETWORK_ERROR' döndürür. Bu gibi durumlarda paranın bankadan çekilip çekilmediği anlık olarak bilinemez. Durumu manuel olarak takip etmeye çalışmak ya müşteriden mükerrer (çift) ödeme çekilmesine ya da ödenen siparişin kargolanmamasına yol açar.
pendingResolver plugin'i, tüm NETWORK_ERROR ödemelerini otomatik olarak yakalar, güvenli salt okunur sorgularla (getPayment) sağlayıcıya durum sorar ve nihai sonuç olaylarını (payment.succeeded veya payment.failed) tetikler.
Kurulum
import { betterPayment, iyzico } from 'better-payment';
import { pendingResolver } from 'better-payment/plugins';
const payment = betterPayment({
providers: {
iyzico: iyzico({ /* ... */ }),
},
plugins: [
pendingResolver({
schedule: ['30s', '2m', '10m', '1h'],
giveUpAfter: '24h',
}),
],
});Bekleyen Ödemeleri Çözümleme
Serverless ortamlarda (AWS Lambda, Vercel) arka plan zamanlayıcıları bulunmadığından, payment.pending.resolve() fonksiyonunu kendi cron işinizden veya zamanlanmış fonksiyonunuzdan çağırın:
// Call from your cron worker or scheduled background task
const summary = await payment.pending.resolve();
console.log(
`Checked: ${summary.checked}, Succeeded: ${summary.succeeded}, Failed: ${summary.failed}, Unresolved: ${summary.unresolved}`
);Bekleyen bir ödeme sonuçlandığında:
- Başarılıysa
event.resolvedFrom: 'pending'bilgisiyle normalpayment.succeededolayı tetiklenir. - Başarısızsa
event.resolvedFrom: 'pending'bilgisiyle normalpayment.failedolayı tetiklenir. giveUpAftersüresi aşılırsapayment.unresolvedolayı tetiklenir; böylece destek ekibi manuel inceleme yapabilir.
Bir ödeme yalnızca sağlayıcının durum sorgusu başarıyı doğruladığında başarılı olarak işaretlenir; zaman aşımı, HTTP hatası veya hâlâ bekleyen bir yanıt, ödemenin bir sonraki planlı kontrol için kuyrukta kalmasını sağlar. Birbiriyle kesişen payment.pending.resolve() çağrıları da güvenlidir: her ödeme, sağlayıcıya sorulmadan önce tam olarak bir çözümleyici tarafından üstlenilir (claim); böylece bir ödeme asla iki kez çözülmez ve asla iki nihai olay üretmez. Kalıcı depolamalar, bu garantiyi sunucu örnekleri arasına taşımak için PendingStore arayüzünün opsiyonel claim(id) metodunu uygulayabilir.
payment.on('payment.succeeded', async (event) => {
if (event.resolvedFrom === 'pending') {
console.log(`Payment ${event.paymentId} was successfully recovered after initial timeout!`);
}
await markOrderPaid(event.conversationId);
});
payment.on('payment.unresolved', async (event) => {
console.warn(`Payment ${event.paymentId} gave up after threshold. Manual review needed.`);
});Seçenekler
| Seçenek | Varsayılan | Açıklama |
|---|---|---|
schedule | ['30s', '2m', '10m', '1h'] | Yeniden sorgulama gecikmeleri takvimi |
giveUpAfter | '24h' | payment.unresolved fırlatılmadan önce denemelerin sürdürüleceği azami süre |
store | MemoryPendingStore | Bekleyen ödemelerin saklanacağı depolama katmanı (PendingStore) |
endpoint | false | Webhook tabanlı cron'lar için yetkili POST /pending/resolve HTTP uç noktası açar |
Dashboard ve İnceleme Metotları
Plugin, payment.pending altında yardımcı yönetim metotları sunar:
// List all unresolved payments
const pendingList = await payment.pending.list();
// Get details for a specific payment
const item = await payment.pending.get('PMT-12345');
// Manually delete a payment from the pending queue
await payment.pending.delete('PMT-12345');