Better Payment
Entegrasyonlar

Express, Fastify, Hono

Ödeme handler'ını Express, Fastify, Hono, Elysia, React Router veya düz bir Node.js sunucusuna bağlayın.

Her adapter ayrı bir import'tur ve hiç bağımlılığı yoktur; yalnızca kullandığınız yüklenir. Next.js için Next.js rehberine, Workers, Deno ve Bun için edge ortamlarına bakın.

Tüm adapter'lar:

  • JSON ve form-urlencoded gövdeleri (banka callback'leri) handler'a geçirir
  • PayTR'nin OK yanıtını düz metin olarak gönderir
  • yönlendirmelerin (callbackRedirect) Location başlığını korur

Onları handler'ın basePath'i altına bağlayın (varsayılan /api/pay).

Express

import express from 'express';
import { toExpressHandler } from 'better-payment/express';
import { payment } from './payment';

const app = express();
app.all('/api/pay/*path', toExpressHandler(payment)); // Express 4: '/api/pay/*'

Adapter ham gövdeyi kendisi okuduğu için ödeme route'larında express.json() ya da express.urlencoded() kullanmanız gerekmez. Önce bir body parser çalışmışsa onun sonucu kullanılır. Beklenmeyen hatalar next(error)'a iletilir.

Fastify

import Fastify from 'fastify';
import { toFastifyPlugin } from 'better-payment/fastify';

const app = Fastify();
await app.register(toFastifyPlugin(payment), { prefix: '/api/pay' });

Fastify, application/x-www-form-urlencoded gövdeleri varsayılan olarak reddeder (415); oysa iyzico, Param, Akbank ve PayTR callback'lerini bu formatta gönderir. Plugin bu formatı yalnızca kendi route'ları için kabul eder; diğer route'larınız Fastify'ın varsayılanlarıyla kalır.

Hono

import { Hono } from 'hono';
import { toHonoHandler } from 'better-payment/hono';

const app = new Hono();
app.all('/api/pay/*', toHonoHandler(payment));

Hono, Better Payment gibi Node.js, Bun, Deno ve Cloudflare Workers'da çalışır.

Elysia

import { Elysia } from 'elysia';
import { toElysiaHandler } from 'better-payment/elysia';

const app = new Elysia();
app.all('/api/pay/*', toElysiaHandler(payment), { parse: 'none' });

{ parse: 'none' } handler'a ham gövdeyi bırakır: banka callback'leri form-urlencoded gelir ve imzaları orijinal alanlarla doğrulanır. Bu ayar olmadan body okuyan herhangi bir hook (onTransform, derive, onBeforeHandle ya da bir plugin) Elysia'nın isteği önce tüketmesine yol açar. Elysia Bun için tasarlanmıştır, Node.js'te de çalışır.

React Router

0.8.0 sürümünde eklendi
// app/routes/api.pay.$.ts
import { toReactRouterHandler } from 'better-payment/react-router';
import { getBetterPayment } from '~/lib/payment.server';

export const { loader, action } = toReactRouterHandler(getBetterPayment);

Default export'u olmayan bir splat resource route'tur (api.pay.$.ts, /api/pay altındaki her şeyi yakalar): GET istekleri loader'a, POST istekleri (banka callback'leri dahil) action'a gider. Aynı kod Remix v2'de de çalışır. routes.ts yapılandırması kullanıyorsanız route('api/pay/*', 'routes/api.pay.$.ts') olarak kaydedin.

Düz Node.js

import { createServer } from 'node:http';
import { toNodeHandler } from 'better-payment/express';

createServer(toNodeHandler(payment)).listen(3000);

Tembel başlatma

Tüm adapter'lar ödeme nesnesini (ya da handler'ını) döndüren bir fonksiyonu da kabul eder. Fonksiyon her istekte çağrılır, böylece örneği ilk kullanımda oluşturabilirsiniz:

const createPayment = () => betterPayment({ /* ... */ });

let instance: ReturnType<typeof createPayment> | undefined;
const getPayment = () => (instance ??= createPayment());

app.all('/api/pay/*path', toExpressHandler(getPayment));

İstek gövdesi boyutu

0.8.1 sürümünde eklendi

Express, Node.js ve fetch tabanlı adapter'lar bir istek gövdesinin en fazla 1 MiB'ını okur ve daha büyükleri için 413 döner. Banka callback'leri birkaç kB'tır. Sınırı toExpressHandler, toNodeHandler veya toFetchHandler üzerinde maxBodySize (bayt) ile değiştirin:

app.all('/api/pay/*path', toExpressHandler(payment, { maxBodySize: 64 * 1024 }));

Fastify kendi bodyLimit ayarını uygular (varsayılan 1 MiB).

On this page