İçeriğe geç

Checkout ve ödeme

Prepare → submit → status akışını izleyin. İdempotency-Key ve aynı işlem gövdesini tekrar denemelerde koruyun. Backend’in hesapladığı tutar, stok ve ödeme capabilities otoritedir. Gerekli müşteri doğrulama ve hesap eşleştirme koşullarını tamamlayın. Gerçek sağlayıcı yapılandırılmamışsa örnek ödeme göstererek başarı iddia etmeyin.

Önce /storefront/delivery-methods ve checkout yapılandırmasını okuyun. Adres, teslim yöntemi ve varsa teslim şubesi kullanıcı tarafından seçilir. Kargo ve mağazadan teslim alanları birbirinin yerine kullanılmaz. Örnekte api ve customerHeaders, müşteri rehberindeki aynı-domain istemcisidir.

const prepared = await api('/storefront/cart/checkout/prepare', {
method: 'POST', headers: customerHeaders(),
body: JSON.stringify({
cartId,
shippingAddressId,
billingAddressId,
sameAsShipping: true,
deliveryMethodId,
deliveryType, // API'nin döndürdüğü geçerli tür
pickupBranchId // kargoda null; mağazadan teslimde seçilen şube
})
})

prepared.contracts belgelerini sürüm ve hash ile kullanıcıya gösterin. Her gerekli belge için açık kabul alın; kodla otomatik onaylamayın. Toplam, stok ve quote hash eskiyse tekrar prepare yapıp güncel koşulları gösterin.

// acceptedContractIds, kullanıcının formda işaretlediği belge kimlikleridir.
const consents = prepared.contracts.map(({ id, version, hash }) => ({
id, version, hash, accepted: acceptedContractIds.has(id)
}))
const operationId = crypto.randomUUID()
const submitBody = JSON.stringify({
sessionId: prepared.id, quoteHash: prepared.quoteHash, consents
})
const placed = await api('/storefront/cart/checkout/submit', {
method: 'POST',
headers: { ...customerHeaders(), 'Idempotency-Key': operationId },
body: submitBody
})

Timeout olursa operationId ve submitBody değerlerini koruyarak devam edin. Yeni anahtarla tekrar sipariş oluşturmayın. 409 yanıtının hata koduna göre güncel sepet/oturum durumunu okuyun.

Ödeme yöntemi sunucunun etkin seçeneklerinden seçilir. Havale seçeneği açıksa:

const paymentOperation = crypto.randomUUID()
const attempt = await api('/storefront/payments/attempts', {
method: 'POST',
headers: { ...customerHeaders(), 'Idempotency-Key': paymentOperation },
body: JSON.stringify({
orderId: placed.order.id,
paymentMethod: 'bank-transfer',
returnUrl: location.origin + '/odeme-sonucu'
})
})

Havale talimatı ödeme alındığı anlamına gelmez. Sonucu API’nin sipariş/ödeme durumundan okuyun; URL parametresini veya yalnız yönlendirme sonucunu başarı kabul etmeyin. Production kart tahsilatı yapılandırılmadan kart seçeneğini göstermeyin. Starter mevcut sunucu capabilities ve ödeme akışlarını uygular. Testleri izole mağaza ve test sağlayıcısında yapın.