Better Payment
Kavramlar

Ödeme Olayları

Ödeme sonuçlarına, hangi sağlayıcı ya da akıştan gelirse gelsin, tek bir tipli dinleyiciyle tepki verin.

0.5.0 sürümünde eklendi

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 listener

Olaylar 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

OlayNe zaman yayınlanır
payment.succeededcreatePayment, completeThreeDSPayment ya da capture başarılı olduğunda
payment.authorizedauthorize başarılı olduğunda: tutar kartta bloke edilmiştir
payment.pendingcreatePayment, completeThreeDSPayment, authorize ya da capture pending döndüğünde, örneğin NETWORK_ERROR ile
payment.failedbir ödeme işlemi, initThreeDSPayment ya da initThreeDSAuthorize başarısız olduğunda
payment.cancelledcancel ya da voidAuthorization başarılı olduğunda
refund.succeededrefund başarılı olduğunda
refund.failedrefund 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) 500 dö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. Olaylar onCallback'ten hemen önce yayınlanır; böylece ikisi birlikte yeniden denenir.
  • Diğer adresler (payment, refund, ...) sonucu her zamanki gibi döner ve hata logger ile 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.

Bu sayfada