İçeriğe geç
Better Payment
Plugin'ler

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.

0.12.0 sürümünde eklendi

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 normal payment.succeeded olayı tetiklenir.
  • Başarısızsa event.resolvedFrom: 'pending' bilgisiyle normal payment.failed olayı tetiklenir.
  • giveUpAfter süresi aşılırsa payment.unresolved olayı 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çenekVarsayılanAçı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
storeMemoryPendingStoreBekleyen ödemelerin saklanacağı depolama katmanı (PendingStore)
endpointfalseWebhook 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');