3D Secure ile Ödeme
paySmart3D API, Paybull ödeme entegrasyon sistemine sipariş ve kredi kartı ayrıntı bilgilerini göndermek için kullanılır.
Üye işyeri web sitesi ödeme formunu gönderdikten sonra kullanıcı banka sayfasına yönlendirilecektir.
Ödeme, banka ağ geçidinde bir SMS koduyla doğrulanacaktır. Ödeme başarılı olduktan sonra, kullanıcı üye iş yerinin başarı URL'sine yönlendirilecektir,
aksi takdirde üye iş yeri tarafından belirlenen iptal URL'ne yönlendirilecektir.
/api/paySmart3D
URL'ine AJAX isteğini göndermeyiniz. Normal form gönderimi olmalıdır.
Enpoint, Headers(Başlıklar) ve Request(İstek) bilgileri aşağıda verilmiştir.
Method |
API Uç Noktası (Endpoint) |
İçerik-Türü |
POST |
/api/paySmart3D |
application/x-www-form-urlencoded |
Parametre |
Şart |
İçerik-Türü |
Authorization |
Zorunlu |
Bearer |
Parametre |
Veri Türü |
Şart |
Açıklama |
cc_holder_name |
string |
Zorunlu |
Kart Üzerindeki Ad Soyad. |
cc_no |
string |
Zorunlu |
Kart numarası. |
expiry_month |
string |
Zorunlu |
Kart son kullanma ayı. |
expiry_year |
string |
Zorunlu |
Kart son kullanma yılı. 2030 |
cvv |
string |
Zorunlu |
3 haneli güvenlik kodu, yabancı kartlarda 4 hanelidir. |
currency_code |
string |
Zorunlu |
Para birimi kodu. USD , TRY , EUR |
installments_number |
number |
Zorunlu |
Taksit Sayısı. |
invoice_id |
string |
Zorunlu |
Benzersiz fatura numarası. |
invoice_description |
string |
Zorunlu |
Sepet açıklaması. |
name |
string |
Zorunlu |
Ürünü satın alan kişinin adı. |
surname |
string |
Zorunlu |
Ürünü satın alan kişinin soyadı. |
total |
double |
Zorunlu |
Ödeme yapılacak tutar. 1000.44 |
merchant_key |
string |
Zorunlu |
PayBull üzerinden almış olduğunuz benzersiz Üye İşyeri Anahtarı |
items |
string |
Zorunlu |
Sepetteki ürünler |
cancel_url |
string |
Zorunlu |
Başarısız ödeme URL'i. |
return_url |
string |
Zorunlu |
Başarılı ödeme URL'i. |
response_method |
string |
Opsiyonel |
POST / GET parametreleri iletilir. |
hash_key |
string |
Zorunlu |
Benzersiz anahtar. İşlemin bankaya ulaşmadan, kullanıcının ödemeyle ilgili değişiklikler yapamamasını ve ödemenin güvenli olarak tamamlanmasını sağlanır. bkz.Hash Key Oluşturma |
is_commission_from_user |
string |
Opsiyonel |
commission_by parametresinin aktif olması için '1' iletilmesi gerekmektedir. |
commission_by |
string |
Opsiyonel |
Komisyonu son kullanıcı karşılayacak ise user , üye işyeri karşılayacak ise merchant (default) |
response_method |
string |
Opsiyonel |
POST / GET parametreleri iletilir. |
payment_completed_by |
string |
Opsiyonel |
app Gönderilmesi durumunda işlem direkt olarak bankaya iletilmektedir. / merchant gönderilmesi durumunda kart doğrulması yapıldıktan sonra ödeme onaylanır/iptal edilir. bkz:3D Model Ödeme Tamamlama |
bill_address1 |
string |
Opsiyonel |
Ürünü satın alan kişinin 1. Adres Satırı. |
bill_address2 |
string |
Opsiyonel |
Ürünü satın alan kişinin 2. Adres Satırı . |
bill_city |
string |
Opsiyonel |
Ürünü satın alan kişinin Şehir. |
bill_postcode |
string |
Opsiyonel |
Ürünü satın alan kişinin Posta kodu. |
bill_state |
string |
Opsiyonel |
Ürünü satın alan kişinin İlçe. |
bill_country |
string |
Opsiyonel |
Ürünü satın alan kişinin Ülke. |
bill_email |
string |
Opsiyonel |
Ürünü satın alan kişinin email adresi. |
bill_phone |
string |
Opsiyonel |
Ürünü satın alan kişinin telefon numarası. |
card_program |
string |
Opsiyonel |
WORLD , BONUS , MAXIMUM , BANKKART_COMBO , PARAF , AXESS , ADVANT , CARD_FNS değerlerinin biri gönderilir. |
ip |
string |
Opsiyonel |
Ürünü satın alan kişinin ip adresini temsil eder. |
transaction_type |
string |
Opsiyonel |
PreAuth / Auth parametresi iletilir. İşlem PreAuth iletilir ise; 20 gün içinde tamamlanması veya iptal edilmesi gerekir, aksi takdirde otomatik olarak iptal edilir. |
sale_web_hook_key |
string |
Opsiyonel |
İşlemin başarılı ya da başarısız durumunu, bildirim almak için kullanılır . Paybull Üye İş Yeri Panelinde Satış web kancası URL'ni atamalıdır. |
TARIM KART İŞLEM İÇİN PARAMETRELER
Parametre |
Veri Türü |
Şart |
Açıklama |
maturity_period |
Integer |
Zorunlu |
İşlem tarım ise bir tamsayı gönderilmelidir. |
payment_frequency |
Integer |
Zorunlu |
İşlem tarım ise bir tamsayı gönderilmelidir. |
HASH KEY OLUŞTURMA
function generateHashKey($total, $installment, $currency_code, $merchant_key, $invoice_id, $app_secret)
{
$data = $total . '|' . $installment . '|' . $currency_code . '|' . $merchant_key . '|' . $invoice_id;
$iv = substr(sha1(mt_rand()), 0, 16);
$password = sha1($app_secret);
$salt = substr(sha1(mt_rand()), 0, 4);
$saltWithPassword = hash('sha256', $password . $salt);
$encrypted = openssl_encrypt("$data", 'aes-256-cbc', "$saltWithPassword", null, $iv);
$msg_encrypted_bundle = "$iv:$salt:$encrypted";
$msg_encrypted_bundle = str_replace('/', '__', $msg_encrypted_bundle);
return $msg_encrypted_bundle;
}
public static string GenerateHashKey(string total,string installment,string currency_code,string merchant_key,string invoice_id,string app_secret){
var data = total + '|'+installment+'|'+currency_code+'|'+merchant_key+'|'+invoice_id;
var sha1 = new SHA1Managed();
Random rnd = new Random();
var iv = sha1.ComputeHash(Encoding.UTF8.GetBytes(rnd.ToString()));
var password = sha1.ComputeHash(Encoding.UTF8.GetBytes(app_secret)).ToString();
rnd = new Random();
var shaSalt = sha1.ComputeHash(Encoding.UTF8.GetBytes(rnd.ToString())).ToString();
var salt = shaSalt.Substring(0, 4);
var sha256 = new SHA256Managed();
var saltWithPassword = sha256.ComputeHash(Encoding.UTF8.GetBytes(password+salt));
var encrypted = EncryptString(data,saltWithPassword,iv);
var msg_encrypted_bundle = iv + ":" + salt + ":" + encrypted;
msg_encrypted_bundle = msg_encrypted_bundle.Replace("/","__");
return msg_encrypted_bundle;
}
public static string EncryptString(string plainText, byte[] key, byte[] iv){
Aes encryptor = Aes.Create();
encryptor.Mode = CipherMode.CBC;
encryptor.Key = key;
encryptor.IV = iv;
MemoryStream memoryStream = new MemoryStream();
ICryptoTransform aesEncryptor = encryptor.CreateEncryptor();
CryptoStream cryptoStream = new CryptoStream(memoryStream, aesEncryptor, CryptoStreamMode.Write);
byte[] plainBytes = Encoding.ASCII.GetBytes(plainText);
cryptoStream.Write(plainBytes, 0, plainBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] cipherBytes = memoryStream.ToArray();
memoryStream.Close();
cryptoStream.Close();
string cipherText = Convert.ToBase64String(cipherBytes, 0, cipherBytes.Length);
return cipherText;
}
function generateHashKey(total , installment , currency_code , merchant_key , invoice_id , app_secret) {
var data = total + "|" + installment + "|" + currency_code + "|" + merchant_key + "|" + invoice_id;
var randNumIv = Math.floor(Math.random() * (99999999999999999 - 10000000000000000) + 10000000000000000);
var hashNumIv = sha1(randNumIv);
hashNumIv = hashNumIv.create();
var iv = hashNumIv.slice(0,16);
var hashPass = sha1(app_secret);
hashPass = hashPass.create();
var password = hashPass.hex();
var randNumSalt = Math.floor(Math.random() * (99999999999999999 - 10000000000000000) + 10000000000000000);
var hashNumSalt = sha1(randNumIv);
hashNumSalt = hashNumSalt.create();
var salt = hashNumSalt.hex();
var strPassSalt = password + salt;
var hashStr = sha1(strPassSalt);
strPassSalt.create();
var saltWithPassword = strPassSalt.hex();
var encrypted = "";
var msg_encrypted_bundle = iv + ":" + salt + ":" + encrypted;
msg_encrypted_bundle = msg_encrypted_bundle.replaceAll("/" , "_");
return msg_encrypted_bundle;
}
import random
from Crypto.Hash import SHA1
from Crypto.Hash import SHA256
def generateHashKey(total, installment, currency_code, merchant_key, invoice_id , app_secret) :
data = total + "|" + installment + "|" + currency_code + "|" + merchant_key + "|" + invoice_id
randNumIv = str(random.randint(10000000000000000,99999999999999999))
hashNumIv = SHA1.new()
hashNumIv.update(randNumIv.encode("UTF-8"))
hashNumber = hashNumIv.hexdigest()
iv = hashNumber[:16]
hashAppSec = SHA1.new()
hashAppSec.update(app_secret.encode("UTF-8"))
password = hashAppSec.hexdigest()
randNumSalt = str(random.randint(10000000000000000,99999999999999999))
hashNumSalt = SHA1.new()
hashNumSalt.update(randNumSalt.encode("UTF-8"))
hashSalt = hashNumSalt.hexdigest()
salt = hashSalt[:4]
strPassSalt = password + salt
hashStr = SHA256.new()
hashStr.update(strPassSalt.encode("UTF-8"))
saltWithPassword = hashStr.hexdigest()
encrypted = ""
msg_encrypted_bundle = iv + ":" + salt + ":" + encrypted
msg_encrypted_bundle = msg_encrypted_bundle.replace("/" , "_")
return msg_encrypted_bundle
ÖRNEK KODLAR
payment_status = 1 Tamamlandı ,payment_status = 0 Başarısız
<form target="_top" action="https://test.paybull.com/ccpayment/api/paySmart3D" method="post" id="three_d_form">
<input type="hidden" name="cc_holder_name" value="John Dao"/>
<input type="hidden" name="cc_no" value="4508034508034509"/>
<input type="hidden" name="expiry_month" value="12"/>
<input type="hidden" name="expiry_year" value="26"/>
<input type="hidden" name="cvv" value="000"/>
<input type="hidden" name="currency_code" value="TRY"/>
<input type="hidden" name="installments_number" value="1"/>
<input type="hidden" name="invoice_id" value="PAYBULL-INVOICE-1"/>
<input type="hidden" name="invoice_description" value="INVOICE TEST DESCRIPTION"/>
<input type="hidden" name="name" value="John"/>
<input type="hidden" name="surname" value="Dao"/>
<input type="hidden" name="total" value="10.00"/>
<input type="hidden" name="merchant_key" value="$2y$10$w/ODdbTmfubcbUCUq/ia3OoJFMUmkM1UVNBiIQIuLfUlPmaLUT1he"/>
<input type="hidden" name="cancel_url" value="FAIL URL"/>
<input type="hidden" name="return_url" value="SUCCES URL"/>
<input type="hidden" name="hash_key" value="32d54deec44e1d10:b45b:FCi9MQ...."/>
<input type="hidden" name="items" value='[{"name":"URUN","price":10.00,"quantity":1,"description":"ACIKLAMA"}]'/>
<input type="submit" value="Öde" />
</form>
{
"order_no": 167879639814398,
"order_id": 167879639814398,
"invoice_id": "1678796401PAYBULL",
"status_code": 100,
"status_description": "Payment Successfully Completed",
"credit_card_no": "540667****5403",
"transaction_type": "Auth",
"payment_status": 1,
"payment_method": 1,
"error_code": 100,
"error": "Payment Successfully Completed",
"auth_code": 262818,
"merchant_commission": 0,
"user_commission": 0,
"merchant_commission_percentage": 0,
"merchant_commission_fixed": 0,
"installment": 1,
"amount": 10,
"hash_key": "6781df462c7582b9:b645:3ExMA6uvr6y3h3L7MXjhGFLSpPVP8ox2bx__tqx8__shp2MlEQLOkfo9Y0ceHySRVX",
"md_status": 1,
"original_bank_error_code": "",
"original_bank_error_description": ""
}
{
"order_no": "167879630753329",
"order_id": "167879630753329",
"invoice_id": "1678796307PAYBULL",
"status_code": "41",
"status_description": "N-status/Challenge authentication via ACS: https://emvacs.bkm.com.tr/acs/creq",
"credit_card_no": "540667****5403",
"transaction_type": "Auth",
"payment_status": 0,
"payment_method": 1,
"error_code": 41,
"error": "N-status/Challenge authentication via ACS: https://emvacs.bkm.com.tr/acs/creq",
"auth_code": "",
"merchant_commission": 0,
"user_commission": 0,
"merchant_commission_percentage": 0,
"merchant_commission_fixed": 0,
"installment": 1,
"amount": 10,
"hash_key": "166d91df38bcd714:720e:HMFSjSLvbicqoHJUu1p+wDZ8oqBSR3YsTjqa2q3nW8dHqePOYhH78yypXOO0Oe5l",
"md_status": 0,
"original_bank_error_code": 99,
"original_bank_error_description": "Authentication failed"
}
{
"order_no": "",
"order_id": "",
"invoice_id": "1678797131PAYBULL",
"status_code": 68,
"status_description": "Invalid hash key",
"credit_card_no": "",
"transaction_type": "Auth",
"payment_status": 0,
"payment_method": 1,
"error_code": 68,
"error": "Invalid hash key",
"auth_code": "",
"hash_key": "f37135dd8bc6ebca:4042:8lWRu9cq4cDTVGN0HrclX+Uz+x78LxrIWdsHWX16CvI="
})