# @trkit-app-pack/pay

> iyzico, PayTR ve mock ödeme sağlayıcıları için ortak arayüz.

```bash
npm install @trkit-app-pack/pay
```

Akışın tamamı için: [Ödeme akışı](/docs/rehber/odeme).

## İstemci

```ts title="lib/pay.ts"
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

```ts
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

```ts
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_USAGE` hatası fırlatır.
- `fetch` seçeneğiyle istekleri test için taklit edebilirsiniz.
