Checkout Session Rehberi
Hosted ödeme deneyiminde session lifecycle, secure mode, redirect, webhook ve final state doğrulama modeli.
Bu sayfa Checkout Session'ın ne olduğunu, ne zaman kullanılacağını ve Hosted Checkout ile API-only payment flow arasındaki farkları açıklar.
Checkout Session, HSRC Pay'in hosted veya semi-hosted ödeme deneyimini yöneten oturum katmanıdır. Kullanıcıdan payment method ve checkout bağlamı toplanır; Confirm ile provider execution süreci başlatılır.
Checkout Session nedir?
Checkout Session, merchant'ın ödeme deneyimini hızlı ve kontrollü şekilde başlatması için oluşturduğu ödeme oturumudur. Session; amount, currency, customer bağlamı, redirect URL'leri, expiry, payment method seçimi ve final payment state ilişkisini taşır.
Bu model özellikle frontend ödeme formunu sıfırdan yönetmek istemeyen veya 3DS/redirect gibi multi-step flow'ları daha güvenli bir hosted deneyimde ele almak isteyen merchantlar için uygundur.
Ne zaman kullanılmalı?
- Hızlı entegrasyon istiyorsanız
- Hosted ödeme formu tercih ediyorsanız
- 3DS/requires_action handling'i checkout deneyimine bırakmak istiyorsanız
- Frontend'de card data exposure alanını azaltmak istiyorsanız
- Redirect, cancel ve return URL davranışını standartlaştırmak istiyorsanız
API-only flow ile farkı
| Başlık | Hosted Checkout | API-only Payment |
|---|---|---|
| UI sorumluluğu | HSRC Pay checkout deneyimi yönetir | Merchant frontend yönetir |
| 3DS handling | Checkout içinde yönetilebilir | Merchant nextAction handle eder |
| Card data exposure | Daha dar frontend sorumluluğu | Merchant UI daha fazla sorumluluk taşır |
| Customization | Daha kontrollü ve sınırlı | Daha esnek |
| Integration complexity | Daha düşük | Daha yüksek |
| Önerilen kullanım | Hızlı ve standart ödeme deneyimi | Özel UX, custom checkout veya platform entegrasyonu |
Session lifecycle
Checkout Session status değerleri: PENDING, PROCESSING, COMPLETED, EXPIRED, CANCELLED, FAILED.
- Merchant
POST /v1/checkout-sessionsile oturum oluşturur (PENDING,tokenüretilir). - Payer, merchant'ın verdiği
url(hosted sayfa) veyaGET /v1/checkout-sessions/token/:tokenile oturuma girer. - Checkout UI payment method ve payer alanlarını toplar; bağlı Payment
CREATEDolur. - Confirm ile provider execution başlar; Payment
SUCCEEDED/AUTHORIZED/REQUIRES_ACTION/REQUIRES_PAYMENT_METHODolabilir. - Session
PROCESSINGüzerinden terminal state'e (COMPLETED,FAILED,CANCELLED,EXPIRED) geçer. - Merchant webhook veya
GET /v1/payments/:idile nihai sonucu doğrular.
Kullanıcı deneyimi
Checkout confirm tarafında şu alanlar toplanabilir:
- Payer adı, e-posta ve telefon
- Fatura adresi
- Teslimat adresi
shipping_same_as_billinggibi sadeleştirme sinyalleri- Merchant tarafından tanımlanan custom fields
Bu alanlar payment execution başlamadan önce oturum bağlamında tamamlanır.
3DS / requires_action yönetimi
Secure mode açık olduğunda veya issuer/provider behavior challenge gerektirdiğinde Payment REQUIRES_ACTION olur; confirmResult.paymentNextAction (redirect_user_to_url) checkout içinde yönlendirme sağlar.
API-only modelde merchant frontend aynı sorumluluğu paymentNextAction ile taşır.
Redirect ve return URL davranışı
Return URL kullanıcı deneyimini kapatmak içindir; nihai finansal kanıt değildir. Kullanıcı browser'ı kapatabilir, redirect gecikebilir veya provider async sonuç üretebilir.
Nihai doğrulama
Frontend redirect sonucuna tek başına güvenilmemelidir. Nihai ödeme sonucu backend/API status sorgusu veya webhook/event delivery üzerinden doğrulanmalıdır.
Webhook ile sonucu doğrulama
Merchant backend ödeme sonucunu webhook ile kapatmalıdır. Webhook handler:
- Idempotent olmalı
- Duplicate delivery'yi tolere etmeli
- Payment ID ve trace/request ID üzerinden kayıt eşleştirmeli
payment.requires_action,payment.succeeded,payment.authorized,checkout_session.completedvecharge.declinedevent tiplerini ayrı yorumlamalı
Güvenlik notları
- Production card data ve credential'ları sandbox ortamına taşımayın.
- Raw card data, CVV, challenge HTML veya provider secret loglamayın.
- Checkout token'larını kısa ömürlü ve bağlama özel ele alın.
- Return/cancel URL'leri açık redirect risklerine karşı doğrulayın.
Örnek entegrasyon akışı
const { data } = await api.post("/v1/checkout-sessions", {
amount: 12500,
currency: "TRY",
url: "https://pay.merchant.example/checkout",
return_url: "https://merchant.example/return",
metadata: { order_id: "ord_123" },
});
// Payer: merchant hosted sayfa veya token ile oturum
redirectUserTo(`${data.checkout_session.url}?token=${data.checkout_session.token}`);// Webhook tarafı
if (event.type === "payment.succeeded") {
await markOrderPaid(event.paymentId);
}Best practices
- Hosted checkout kullanırken de backend doğrulamasını ihmal etmeyin.
- Session expiry ve cancel davranışına kullanıcı dostu dönüş yolu sunun.
requires_actionsonucunu normal flow parçası kabul edin.- Session ile Payment ilişkisini operasyon ekranlarında izlenebilir tutun.
- Sandbox'ta success, decline, timeout ve 3DS senaryolarını test edin.