recurr.
Core API

PayTRClient

PayTR Direct API ile doğrudan iletişim kuran düşük seviyeli istemci

Başlatma

import { PayTRClient } from '@vinenastudio/recurr'

const client = new PayTRClient({
  merchantId: process.env.PAYTR_MERCHANT_ID!,
  merchantKey: process.env.PAYTR_MERCHANT_KEY!,
  merchantSalt: process.env.PAYTR_MERCHANT_SALT!,
  testMode: false, // varsayılan: false
})

Metodlar

prepareDirectPayment(params)

Direct API ödeme formu için gerekli token ve gizli alanları üretir. Kart verisi tarayıcıdan doğrudan PayTR'ye gönderilir, sunucunuzdan geçmez.

const result = await client.prepareDirectPayment({
  userIp: '1.2.3.4',
  merchantOid: 'DC0M3X7KQA3F2',
  email: 'user@example.com',
  paymentAmount: 9900, // 99.00 TRY
  currency: 'TRY',
  successUrl: 'https://example.com/billing/success',
  failUrl: 'https://example.com/billing/checkout',
  userBasket: [['Pro Plan', '99.00', 1]],
})

// result.paytrUrl → formun POST hedefi
// result.fields   → forma enjekte edilecek gizli alanlar

chargeStoredCard(params)

Kayıtlı kartı (utoken) kullanarak Non-3D tekrarlayan ödeme gerçekleştirir. Dahili olarak önce fetchCtoken() çağrılarak ctoken alınır, ardından ödeme yapılır.

const result = await client.chargeStoredCard({
  utoken: 'paytr_user_token',
  merchantOid: 'BPsub4f2a8b9cM3X7KQ2',
  email: 'user@example.com',
  paymentAmount: 9900,
  currency: 'TRY',
  userIp: '1.2.3.4',
  userBasket: [['Pro Plan', '99.00', 1]],
})

// result.status → 'success' | 'failed'

verifyWebhookHash(payload)

PayTR'den gelen webhook'un HMAC-SHA256 imzasını doğrular. timingSafeEqual() kullanılır.

const isValid = client.verifyWebhookHash({
  merchant_oid: 'DC0M3X7KQA3F2',
  status: 'success',
  total_amount: '9900',
  hash: payload.hash,
})

utoken vs ctoken

TokenAnlamıÖmrü
utokenPayTR'deki kullanıcı kartı kasasıKalıcı — Subscriber'da saklanır
ctokenKasadaki belirli bir kartHer ödeme öncesi CAPI LIST ile otomatik alınır

chargeStoredCard() her çağrıda ctoken'i otomatik olarak çeker. Sadece utoken'i saklamanız yeterlidir.

On this page