Plugin'ler
3D Secure Zaman Aşımı
Başlatılan 3D Secure ödemelerini otomatik takip edin ve terk edilenleri zaman aşımına uğratın.
0.12.0 sürümünde eklendi
Bir müşteri 3D Secure ödeme akışını başlattığında ve banka doğrulama sayfasını kapattığında, ödeme kalıcı olarak başlatılmış veya beklemede kalır. Rezerve edilen ürün stokları kilitli kalır ve sipariş raporlarında askıda ödemeler birikir.
threeDSTimeout eklentisi, başlatılan 3D Secure akışlarını takip eder ve geri dönmeyen terk edilmiş ödemeleri otomatik olarak zaman aşımına uğratır.
Kurulum
import { betterPayment, iyzico } from 'better-payment';
import { threeDSTimeout } from 'better-payment/plugins';
const payment = betterPayment({
providers: { iyzico: iyzico({ /* ... */ }) },
plugins: [
threeDSTimeout({
after: '15m',
onExpire: async (flow) => {
// Release locked inventory or cancel order
await releaseOrderInventory(flow.conversationId);
},
}),
],
});Nasıl Çalışır?
- Otomatik Takip: Eklenti
initThreeDSPaymentveinitThreeDSAuthorizeçağrılarına kanca atarak başlayan 3D Secure işlemlerini depolar. - Otomatik Temizleme: Müşteri doğrulamayı tamamlayıp
completeThreeDSPaymentçalıştığında akış depodan silinir. - Geç Callback Koruması: Zaman aşımına uğrayan akışlar sonlandırılmadan önce sağlayıcı API'si (
getPayment) sorgulanır. SağlayıcıSUCCESSbildiriyorsa (ör. gecikmiş webhook veya geç yönlendirme), akış zaman aşımına uğratılmaz ve başarıyla çözülmüş sayılır. - Serverless Uyumlu: Kütüphane içinde arka plan
setIntervalzamanlayıcısı bulunmaz; Vercel, AWS Lambda, Cloudflare Workers gibi sunucusuz ortamlarda sorunsuz çalışır.
Zamanlanmış Görev ile Temizleme
Terk edilmiş akışları zamanlanmış bir cron göreviyle periyodik temizleyin:
// Call from a scheduled worker or API route
const result = await payment.threeDS.expireStale();
console.log(`Expired ${result.expired.length} abandoned 3DS payments.`);Next.js / Vercel Cron Örneği
app/api/cron/expire-3ds/route.ts:
import { NextResponse } from 'next/server';
import { payment } from '@/lib/payment';
export async function GET(request: Request) {
const authHeader = request.headers.get('authorization');
if (authHeader !== `Bearer ${process.env.CRON_SECRET}`) {
return new NextResponse('Unauthorized', { status: 401 });
}
const result = await payment.threeDS.expireStale();
return NextResponse.json(result);
}vercel.json:
{
"crons": [
{
"path": "/api/cron/expire-3ds",
"schedule": "*/10 * * * *"
}
]
}Node-cron / Express Örneği
import cron from 'node-cron';
// Run every 10 minutes
cron.schedule('*/10 * * * *', async () => {
try {
const { expired, resolved } = await payment.threeDS.expireStale();
console.log(`[cron] Expired: ${expired.length}, Resolved: ${resolved}`);
} catch (error) {
console.error('[cron] Failed to expire stale 3DS payments:', error);
}
});Seçenekler
| Seçenek | Varsayılan | Açıklama |
|---|---|---|
after | '15m' | Bir akışın terk edilmiş sayılması için gereken süre ('15m', '30m', '1h' veya milisaniye) |
store | In-memory | ThreeDSFlowStore arayüzünü uygulayan özel veri saklama katmanı (Redis, veritabanı vb.) |
onExpire | — | Akış zaman aşımına uğradığında çalıştırılacak (flow) => Promise<void> veya void geri çağırma |
checkProvider | true | Zaman aşımına uğratmadan önce ödemenin gecikmeli başarılı olup olmadığını sağlayıcıdan doğrular |