npm install @trkit-app-pack/payAkışın tamamı için: Ödeme akışı.
İstemci
import "server-only";
import { createPay, createPayFromEnv } from "@trkit-app-pack/pay";
export const pay = createPay({ provider: "iyzico", apiKey: "...", secretKey: "...", sandbox: true });
// veya
export const pay = createPay({ provider: "paytr", merchantId: "...", merchantKey: "...", merchantSalt: "...", testMode: true });
// veya ortam değişkenlerinden (TRKIT_PAY_PROVIDER, IYZICO_*, PAYTR_*)
export const pay = createPayFromEnv();Arayüz
interface PaymentProvider {
name: string;
createCheckout(input: CheckoutInput): Promise<CheckoutSession>;
verifyCallback(payload: Record<string, string>): Promise<PaymentResult>;
callbackResponse(result: PaymentResult): Response;
refund(input: { paymentId: string; amount: number; ip?: string }): Promise<RefundResult>;
}CheckoutInput: orderId, amount (kuruş), currency?, buyer (id, name, surname, email, phone, identityNumber?, ip, address), items (id, name, category, unitPrice (kuruş), quantity?, type?), callbackUrl, successUrl?, failUrl?, installments?, locale?.
CheckoutSession: token, paymentPageUrl? (iyzico), html? (iyzico checkout form), iframeUrl? (PayTR).
PaymentResult: status (success | failure | pending), orderId, paymentId?, paidAmount? (kuruş, taksit farkı dahil), installment?, errorCode?, errorMessage?, raw.
Sağlayıcı farkları
| iyzico | PayTR | |
|---|---|---|
| Ödeme sayfası | Checkout Form (yönlendirme veya gömülü) | iFrame |
| Callback | Kullanıcının tarayıcısı POST eder, sonuç API'den sorgulanır | Sunucudan sunucuya, hash ile imzalı |
| Callback yanıtı | 303 yönlendirme (redirectTo ile özelleştirilir) | Düz metin OK |
| Sipariş no | Serbest | Yalnızca harf ve rakam |
successUrl / failUrl | Kullanılmaz | Zorunlu |
| TCKN | identityNumber (yoksa 11111111111) | Kullanılmaz |
Hatalar
Tüm hatalar PaymentError türündedir (code, provider, raw). Örnek kodlar: BASKET_MISMATCH, EMPTY_BASKET, INVALID_ORDER_ID, BAD_HASH, MISSING_TOKEN, CLIENT_SIDE_USAGE.
Yardımcılar
toKurus("129,50"); // 12950
kurusToDecimal(12950); // "129.5"
basketTotal(items);Teknik notlar
- İmzalar Web Crypto ile atılır; Node.js ve Edge runtime'da çalışır.
- Paket tarayıcıda çalıştırılırsa
CLIENT_SIDE_USAGEhatası fırlatır. fetchseçeneğiyle istekleri test için taklit edebilirsiniz.