Secure (3D) Ödeme
3D Secure ödeme iki uç ve bir dönüş isteğinden oluşur:
- Başlatma — Sunucunuz
secure-paymentçağırır. Kart verisi bu isteğin gövdesindedir. Başarılı yanıtresult.redirect_urlvetransaction.tokendöner. - Yönlendirme — Müşterinin tarayıcısını
result.redirect_urladresine 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. - Dönüş — 3D Secure adımı bitince gateway ödemeyi tamamlar ve tarayıcı
callback_urladresinize bir formPOSTeder:transaction_token,channel_reference,successful. Bkz. Dönüş POST'u. - Sonuç — Sunucunuz
transaction_tokenileretrieve-paymentçağırır. Sipariş durumunu yalnızca bu imzalı yanıttakiresult.successfuldeğerine göre değiştirin.
1. Başlatma
- PHP
- Node.js
- Python
- Java
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;
const payment = await client.securePayment({
channelReference: 'SIP-10231',
amount: '450.00',
installmentNumber: 1,
ip: req.ip,
callbackUrl: 'https://magazam.com/odeme/donus',
customer,
card,
});
if (!payment.result.successful) {
// payment.result.message
return;
}
req.session.transactionToken = payment.transactionToken;
res.redirect(payment.redirectUrl!);
from odemehub.request import SecurePayment
payment = client.secure_payment(SecurePayment(
channel_reference="SIP-10231",
amount="450.00",
installment_number=1,
ip=request.remote_addr,
callback_url="https://magazam.com/odeme/donus",
customer=customer,
card=card,
))
if not payment.result.successful:
... # payment.result.message
session["transaction_token"] = payment.transaction_token
return redirect(payment.redirect_url)
import com.odemehub.request.SecurePayment;
var payment = client.securePayment(SecurePayment.builder()
.channelReference("SIP-10231")
.amount("450.00")
.installmentNumber(1)
.ip(request.getRemoteAddr())
.callbackUrl("https://magazam.com/odeme/donus")
.customer(customer)
.card(card)
.build());
if (!payment.getResult().isSuccessful()) {
// payment.getResult().getMessage()
}
session.setAttribute("transactionToken", payment.getTransactionToken());
return "redirect:" + payment.getRedirectUrl();
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ı).
| Durum | Davranış |
|---|---|
| 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:
| Alan | Açı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ç
- PHP
- Node.js
- Python
- Java
use Gurmehub\Odemehub\Request\RetrievePayment;
$payment = $client->retrievePayment(new RetrievePayment(
transactionToken: $_POST['transaction_token'],
));
if ($payment->result->successful) {
// ödendi
} else {
// $payment->result->message
}
const payment = await client.retrievePayment({ transactionToken: req.body.transaction_token });
if (payment.result.successful) {
// ödendi
} else {
// payment.result.message
}
from odemehub.request import RetrievePayment
payment = client.retrieve_payment(RetrievePayment(transaction_token=request.form["transaction_token"]))
if payment.result.successful:
... # ödendi
else:
... # payment.result.message
import com.odemehub.request.RetrievePayment;
var payment = client.retrievePayment(new RetrievePayment(transactionToken));
if (payment.getResult().isSuccessful()) {
// ödendi
} else {
// payment.getResult().getMessage()
}
Kayıtlı kartla ve kart saklayarak
- Kayıtlı kartla ödemede
cardyerinetransaction.saved_card_tokengönderin; akış aynıdır. Bkz. Kayıtlı Kartlar. - Kartı saklamak için
card.should_save: truegönderin. Kart ödeme tamamlandığında saklanır; token'ıretrieve-paymentyanıtınınsaved_cardalanında döner.
Kontrol listesi
transaction.tokendeğerini başlatma yanıtından saklayın; iade, iptal ve sorguda kullanılır.redirect_urladresine 15 dakika içinde yönlendirin.- Sipariş durumunu dönüş formundaki
successfulalanına göre değil,retrieve-paymentyanıtına göre değiştirin. - Dönüş işleyicisi aynı
transaction_tokenile birden fazla kez çağrılabilir.