Ana içeriğe geç

Secure (3D) Ödeme

3D Secure ödeme iki uç ve bir dönüş isteğinden oluşur:

  1. Başlatma — Sunucunuz secure-payment çağırır. Kart verisi bu isteğin gövdesindedir. Başarılı yanıt result.redirect_url ve transaction.token döner.
  2. Yönlendirme — Müşterinin tarayıcısını result.redirect_url adresine yönlendirirsiniz. Bu adres gateway'e aittir ve sağlayıcının 3D Secure formunu sunar. Adres bir kez sunulur; 15 dakika içinde açılmazsa ödemenin süresi dolar.
  3. Dönüş — 3D Secure adımı bitince gateway ödemeyi tamamlar ve tarayıcı callback_url adresinize bir form POST eder: transaction_token, channel_reference, successful. Bkz. Dönüş POST'u.
  4. Sonuç — Sunucunuz transaction_token ile retrieve-payment çağırır. Sipariş durumunu yalnızca bu imzalı yanıttaki result.successful değerine göre değiştirin.

1. Başlatma​

use Gurmehub\Odemehub\Request\SecurePayment;

$payment = $client->securePayment(new SecurePayment(
channelReference: 'SIP-10231',
amount: '450.00',
installmentNumber: 1,
ip: $_SERVER['REMOTE_ADDR'],
callbackUrl: 'https://magazam.com/odeme/donus',
customer: $customer,
card: $card,
));

if (! $payment->result->successful) {
// $payment->result->message
return;
}

// transaction.token dönüşte eşleştirmek için saklanır
$_SESSION['transaction_token'] = $payment->transactionToken;

header('Location: '.$payment->redirectUrl);
exit;

customer ve card nesnelerinin tam hâli: secure-payment.

result.successful: true ödemenin alındığını göstermez; yalnızca 3D Secure işleminin başlatıldığını gösterir. false ise redirect_url null'dır ve ödeme başlatılmamıştır.

2. Yönlendirme​

result.redirect_url bir gateway adresidir ({BASE_URL}/gateway/secure/{transaction.token}). Tarayıcıyı bu adrese yönlendirin (HTTP 302 ya da bağlantı).

DurumDavranış
Adres 15 dakika içinde açıldıSağlayıcının 3D Secure formu sunulur.
Adres 15 dakika içinde açılmadıÖdemenin süresi dolar. Adres sonradan açılırsa tarayıcı doğrudan callback_url adresine successful=0 ile gönderilir.
Adres ikinci kez açıldıForm yeniden sunulmaz (404).

3. Dönüş​

callback_url adresinize application/x-www-form-urlencoded bir POST gelir:

AlanAçıklama
transaction_tokenÖdemenin token'ı. Sakladığınız transaction.token ile eşleştirin.
channel_referenceÖdemenin channel_reference değeri.
successful"1" ya da "0". İmzasızdır; sonuç olarak kullanılmaz.

Bu istek müşterinin tarayıcısından, gateway'in sayfasından gönderilen bir formdur. Ödemeyi transaction_token ile eşleştirin. Ayrıntılar: Dönüş POST'u.

4. Sonuç​

use Gurmehub\Odemehub\Request\RetrievePayment;

$payment = $client->retrievePayment(new RetrievePayment(
transactionToken: $_POST['transaction_token'],
));

if ($payment->result->successful) {
// ödendi
} else {
// $payment->result->message
}

Kayıtlı kartla ve kart saklayarak​

  • Kayıtlı kartla ödemede card yerine transaction.saved_card_token gönderin; akış aynıdır. Bkz. Kayıtlı Kartlar.
  • Kartı saklamak için card.should_save: true gönderin. Kart ödeme tamamlandığında saklanır; token'ı retrieve-payment yanıtının saved_card alanında döner.

Kontrol listesi​

  • transaction.token değerini başlatma yanıtından saklayın; iade, iptal ve sorguda kullanılır.
  • redirect_url adresine 15 dakika içinde yönlendirin.
  • Sipariş durumunu dönüş formundaki successful alanına göre değil, retrieve-payment yanıtına göre değiştirin.
  • Dönüş işleyicisi aynı transaction_token ile birden fazla kez çağrılabilir.