Kayıtlı kartlar
Müşterinin kartını sağlayıcıda saklayın ve sonra token ile tahsilat yapın.
Kayıtlı kartlar, geri dönen bir müşterinin kart numarasını yeniden yazmadan ödeme yapmasını sağlar. Kartı sağlayıcı saklar; siz yalnızca iki token saklarsınız:
customerToken: müşteriyi sağlayıcıda tanımlar (iyzicocardUserKey, PayTRutoken). Bir müşterinin birden çok kartı olabilir.cardToken: tek bir kayıtlı kartı tanımlar (iyzicocardToken, PayTRctoken).
Kart numaralarını ya da CVC'leri asla kendiniz saklamayın; bu, tüm sisteminizi PCI DSS kapsamına sokar. Yalnızca token'ları kendi kullanıcı numaranızın yanında saklayın. Kartı yalnızca müşteri açıkça onay verdiğinde kaydedin (örneğin "Bu kartı hatırla" kutusu) ve kartı silebilmesine izin verin.
Ödeme sırasında kartı kaydetmek
Normal bir kartlı ödemeyle birlikte saveCard gönderin. Ödeme başarılı olduğunda sonuç token'ları taşır:
const result = await payment.use('iyzico').createPayment({
...order,
paymentCard: { cardHolderName, cardNumber, expireMonth, expireYear, cvc },
saveCard: true, // or { customerToken: user.cardUserKey, alias: 'My card' } to add it to an existing customer
});
if (result.status === 'success' && result.storedCard) {
await db.users.update(user.id, { customerToken: result.storedCard.customerToken });
// result.storedCard.cardToken is set when the provider returns it (iyzico)
}saveCard, initThreeDSPayment() ile de çalışır; bu durumda token'lar completeThreeDSPayment() sonucunda gelir.
Kayıtlı kartla ödeme
paymentCard yerine storedCard gönderin:
await payment.use('iyzico').createPayment({
...order,
storedCard: { customerToken: user.customerToken, cardToken: selectedCard.cardToken },
});PayTR'de listelenen kartta requiresCvc: true varsa cvc ekleyin.
Listeleme ve silme
const { cards } = await payment.use('iyzico').listCards({ customerToken: user.customerToken });
// cards: [{ cardToken, alias, binNumber, lastFourDigits, cardAssociation, bankName, ... }]
await payment.use('iyzico').deleteCard({ customerToken: user.customerToken, cardToken });Müşterinin kart seçmesi için lastFourDigits, bankName ve alias gösterin; token'ın kendisini asla göstermeyin.
iyzico bir kartı ödeme olmadan da kaydedebilir:
const saved = await payment.use('iyzico').saveCard({
customerToken: user.customerToken, // omit for a new customer; use email/externalId instead
email: user.email,
alias: 'Work card',
card: { cardHolderName, cardNumber, expireMonth, expireYear },
});
// saved.customerToken, saved.card?.cardTokenSağlayıcılar
| Sağlayıcı | Ödeme sırasında kaydetme | saveCard() | listCards() | deleteCard() | Token ile ödeme |
|---|---|---|---|---|---|
| iyzico | registerCard | /cardstorage/card | /cardstorage/cards | /cardstorage/card | cardUserKey + cardToken |
| PayTR | Direct API store_card=1 | desteklenmiyor | /odeme/capi/list | /odeme/capi/delete | utoken + ctoken |
| Parampos | henüz yok (#65) | — | — | — | — |
| Akbank | henüz yok (#65) | — | — | — | — |
- PayTR kartları yalnızca Direct API ödemesi sırasında kaydeder ve bu özelliğin (Kart Saklama) PayTR hesabınızda açık olması gerekir.
utokenödeme sonucunda ya da bildirimde (onCallback) gelir;ctoken'ılistCards()ile alın. iFrame API kart kaydedemez. - Desteklemeyen sağlayıcılar
NOT_SUPPORTEDfırlatır (ödeme isteğindekistoredCard/saveCardiçin:INVALID_REQUEST); HTTP handler400döner.
HTTP handler
| Route | İşlem | authorize gerekir mi |
|---|---|---|
POST /:provider/cards/save | cards/save | 🔒 |
POST /:provider/cards/list | cards/list | 🔒 |
POST /:provider/cards/delete | cards/delete | 🔒 |
Kart route'ları tek bir müşterinin kartlarıyla ilgilidir, bu yüzden yalnızca bir authorize hook'uyla açılabilir. transformRequest içinde customerToken'ı istek gövdesinden değil kendi oturumunuzdan alın; böylece bir müşteri başka bir müşterinin kartlarını listeleyemez ya da silemez:
transformRequest: async (ctx) => {
if (!ctx.action.startsWith('cards/')) return ctx.body;
const user = await getUser(ctx.request.headers.cookie);
return { ...ctx.body, customerToken: user.customerToken };
},cards/save ve cards/delete, Idempotency-Key başlığını kabul eder. Tarayıcı client'ında client.iyzico.saveCard(...), listCards(...) ve deleteCard(...) var.
Doğrulama
iyzico akışı (ödeme sırasında kaydetme, listeleme, token ile ödeme, silme) her gece gerçek iyzico sandbox'ına karşı çalıştırılır. PayTR token formülleri PayTR'nin resmi Postman koleksiyonunu izler; henüz bir PayTR hesabına karşı çalıştırılmadı (yardım aranıyor).