Başlarken
Paynoloji API Dökümanına hoşgeldiniz. Dökümanlarda ödeme kronolojisi, sırasıyla adım adım ele alınmıştır ve json-post yöntemiyle çalışmaktadır.
Önemli Uyarı: Entegrasyon yapacağınız web sitesi ve ip adresinizi, Paynoloji Yönetici ekranındaki "Ayarlar - Yetkilendirme" menüsünden ekleyiniz. Aksi takdirde, servislerimizle bağlantı kurmanız mümkün olmayacaktır.
Bir sorunuz varsa [email protected] adresinden bize ulaşabilirsiniz.
Token Alma
// API bilgilerini tanımla
define("APP_ID", "Müşteri APP ID");
define("APP_SECRET", "Müşteri APP SECRET");
// API isteği için veri dizisini oluştur
$requestData = [
"app_id" => APP_ID,
"app_secret" => APP_SECRET
];
// cURL öğesini başlat
$ch = curl_init("https://api.paynoloji.com/token");
// cURL ayarlarını tanımla
curl_setopt_array($ch, [
CURLOPT_POSTFIELDS => json_encode($requestData),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true
]);
// cURL isteğini gerçekleştir
$result = curl_exec($ch);
// cURL öğesini kapat
curl_close($ch);
// Sunucudan gelen cevabı çözümle
$response = json_decode($result, true);
// Elde edilen sonucu kullanma (örneğin, ekrana yazdırma)
print_r($response);
Servis Adresi: https://api.paynoloji.com/token
İstek Türü: POST / JSON
Değer | Tür | Açıklama |
---|---|---|
app_id | string | Paynoloji panelinizde API Ayarlar sayfasındaki API KEY değeri |
app_secret | string | Paynoloji panelinizde API Ayarlar sayfasındaki API SECRET değeri |
Başarılı Cevap
{
"code": 200,
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.xxx",
"createdAt": 1624625707,
"expireAt": 1624631707
}
Token geçerlilik süresi 1 saat olarak tanımlanmıştır.
Değer | Tür | Açıklama |
---|---|---|
code | integer | Yapılan isteğin sonucunu bildirir. İşlem başarılı ise 200 döner. |
token | string | Bir sonraki adım olan getPos methoduna gönderilecek olan değer. |
createdAt | string | Token oluşturma tarihi. |
expireAt | string | Token son kullanma tarihi. |
Başarısız Cevap
{
"code": 404,
"message": "Wrong app_id or app_secret"
}
Değer | Tür | Açıklama |
---|---|---|
code | integer | Yapılan isteğin sonucunu bildirir. İşlem hatalı ise aşağıdaki kodlar döner. |
message | string | Yapılan istekteki hata mesajını belirtir. |
Hata Mesajları
Hata Kodu | Hata Mesajı | Açıklama |
---|---|---|
404 | Mandatory parameters are missing | Hatalı istek türü ya da zorunlu parametrelerden birisi eksik. |
414 | * is required | Eksik gönderilen parametreler burada belirtilir. |
404 | Wrong app_id or app_secret | Hatalı app_id yada app_secret. |
Taksit Sorgulama
// TOKEN bilgilerini tanımla
define("Token", "Your Token");
// Kredi ve kart bilgilerini al
$credit_amount = $_POST['amount'];
$card_number = $_POST['number'];
// API isteği için veri dizisini oluştur
$pyz_data = [
'card_number' => $card_number,
'amount' => $credit_amount
];
// cURL öğesini başlat
$ch = curl_init("https://api.paynoloji.com/installments");
// cURL ayarlarını tanımla
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_TIMEOUT => 5,
CURLOPT_HTTPHEADER => ['Content-Type: application/json',
'Authorization: Bearer Token'
],
CURLOPT_POSTFIELDS => json_encode($pyz_data)
]);
// cURL isteğini gerçekleştir
$hRet = curl_exec($ch);
// cURL öğesini kapat
curl_close($ch);
// Sunucudan gelen cevabı çözümle
$pyz_res = json_decode($hRet, true);
// Cevap kodunu kontrol et ve işlem yap
if ($pyz_res['code'] == 200) {
print($hRet);
} else {
exit("Access denied");
}
Bu adımdan sadece kart için izin verilen taksit sayısını ve taksit oranlarını görüntüleyebilirsiniz. Taksitli satış yapmayacaksanız bir sonraki adıma geçebilirsiniz.
Servis Adresi: https://api.paynoloji.com/installments
Doğrulama Türü: Bearer Token
İstek Türü: POST / JSON
Değer | Tür | Zorunlu | Açıklama |
---|---|---|---|
card_number | string | Evet | Banka/Kredi kartı numarası |
amount | string / integer | Evet | Çekim yapılacak tutar (Numerik olmalı 2,1 kabul edilmez 2.1 kabul edilir.) |
Header | string | Evet | Header olarak Authorization: Bearer (Token) yollamanız gerekli |
Başarılı Cevap
{
"code": 200,
"message": "Başarılı"
"data": {
"binNumber": "Your Card Bin Number",
"amount": "1000.00",
"type:": "0",
"brand": "CARDFINANS",
"family": "CARDFINANS",
"bankName": "Finansbank A.Ş"
"installments": [
{
"commissionRate": 0,
"totalAmount": 1000,
"installmentAmount": "1000",
"installmentNumber": 1
},
{
"commissionRate": 5.96,
"totalAmount": 1059.6,
"installmentAmount": "59.6",
"installmentNumber": 2
},
{
"commissionRate": 7.83,
"totalAmount": 1078.3,
"installmentAmount": "78.3",
"installmentNumber": 3
},
{
"commissionRate": 9.7,
"totalAmount": 1097,
"installmentAmount": "97",
"installmentNumber": 4
},
{
"commissionRate": 11.56,
"totalAmount": 1115.6,
"installmentAmount": "115.6",
"installmentNumber": 5
},
{
"commissionRate": 13.43,
"totalAmount": 1134.3,
"installmentAmount": "134.3",
"installmentNumber": 6
},
{
"commissionRate": 15.3,
"totalAmount": 1153,
"installmentAmount": "153",
"installmentNumber": 7
},
{
"commissionRate": 10.03,
"totalAmount": 1100.3,
"installmentAmount": "110.3",
"installmentNumber": 8
},
{
"commissionRate": 19.04,
"totalAmount": 1190.4,
"installmentAmount": "190.4",
"installmentNumber": 9
},
{
"commissionRate": 20.91,
"totalAmount": 1209.1,
"installmentAmount": "209.1",
"installmentNumber": 10
},
{
"commissionRate": 22.78,
"totalAmount": 1227.8,
"installmentAmount": "227.8",
"installmentNumber": 11
},
{
"commissionRate": 24.65,
"totalAmount": 1246.5,
"installmentAmount": "246.5",
"installmentNumber": 12
}
]
}
}
Değer | Tür | Açıklama |
---|---|---|
code | integer | Yapılan isteğin sonucunu bildirir. İşlem başarılı ise 200 döner. |
card_number | string | Kredi kartı numarası |
amount | string | Tutar |
store_comission | string | Mağazanın tek çekim komisyon oranı |
installments | array | Karta yapılabilecek taksit listesi |
details | array | Karta yapılabilecek taksit detayı |
comission | string | Taksit sayısına göre belirlenen komisyon oranı. |
total_amount | string | Taksit sayısına göre belirlenen komisyonlu toplam tutar. |
Başarısız Cevap
{
"code": 404,
"message": " Invalid app_id or app_secret"
}
Değer | Tür | Açıklama |
---|---|---|
code | integer | Yapılan isteğin sonucunu bildirir. İşlem hatalı ise aşağıdaki kodlar döner. |
message | string | Yapılan istekteki hata mesajını belirtir. |
Hata Mesajları
Hata Kodu | Hata Mesajı | Açıklama |
---|---|---|
404 | Mandatory parameters are missing | Hatalı istek türü ya da zorunlu parametrelerden birisi eksik. |
411 | * is required | Eksik gönderilen parametreler burada belirtilir. |
404 | Token is missing | Bearer token gönderilmedi. |
400 | Access denied | Bearer token hatalı yada süresi dolmuş. |
408 | Undefined Card Number | Tanımlanmamış yada hatalı kart numarası. |
403 | Foreign Cards are not Allowed for this Merchant | Mağazada yabancı kart kullanılamaz. |
403 | Undefined Pos ID | Tanımlanmamış Pos. |
406 | getPos Error | Pos hatası. |
500 | System Error | Sistem hatası. |
410 | The credit card must be 16 digits | Kart numarası 16 karakterden oluşmalı. |
406 | Merchant is not active | Mağaza aktif değil. |
Ödeme Tamamlama
// Ödeme bilgilerini içeren veri dizisini oluştur
$paymentData = [
"card_holder" => $name,
"card_number" => $number,
"exp_month" => $month,
"exp_year" => $year,
"cvv" => $cvc2,
"amount" => $price,
"payment_token" => $result->payToken,
"redirect_url" => $redirect,
"other_code" => $id,
"note" => $note
];
// cURL öğesini başlat
$ch = curl_init("https://api.paynoloji.com/pay3D");
// cURL ayarlarını tanımla
curl_setopt_array($ch, [
CURLOPT_POSTFIELDS => json_encode($paymentData),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true
]);
// cURL isteğini gerçekleştir
$result = curl_exec($ch);
// cURL öğesini kapat
curl_close($ch);
// Sunucudan gelen cevabı çözümle
$result = json_decode($result, true);
// Elde edilen sonucu kullanma (örneğin, ekrana yazdırma)
print_r($result);
Servis Adresi: https://api.paynoloji.com/pay3D
İstek Türü: POST / JSON
Değer | Tür | Zorunlu | Açıklama |
---|---|---|---|
card_holder | string | Evet | Banka/Kredi kartının üzerindeki isim. |
card_number | string | Evet | Banka/Kredi kartı numarası. (Bir önceki getPos methoduna gönderilen kart ile aynı olmalı) |
exp_month | string | Evet | Banka/Kredi kartı son kullanma tarihi (Ay) |
exp_year | string | Evet | Banka/Kredi kartı son kullanma tarihi (Yıl) |
cvv | string | Evet | Banka/Kredi CVV kodu (Yıl) |
amount | string / integer | Evet |
Çekim yapılacak tutar (Numerik olmalı 2,1 kabul edilmez 2.1 doğru olanı). Bir önceki getPos apisine gönderilen amount ile aynı olmalı |
currency | string | Hayır | Para birim (Varsayılan TRY) |
installment | string / integer | Evet | Taksit sayısı (Zorunlu değil boş gönderilirse tek çekim yapılır.) |
redirectOkUrl | string | Evet | 3D işleminde sonra dönülecek başarılı callback adresi. |
redirectFailUrl | string | Evet | 3D işleminde sonra dönülecek başarısız callback adresi. |
notifyUrl | string | Evet | 3D işleminde sonra dönülecek callback adresi. |
paymentID | string | Evet | Benzersiz sipariş kodu.(pay3D methoduna gönderilen her istekte parametre değeri farklı olmalı) |
note | string | Hayır | Sipariş açıklaması |
Başarılı Cevap
{
"status": true,
"code": 200,
"redirectUrl": "https://api.paynoloji.com/redirect/xxx",
}
Değer | Tür | Açıklama |
---|---|---|
status | boolean | Yapılan isteğin sonucunu bildirir. İşlem başarılı ise true döner. |
code | integer | Yapılan isteğin sonucunu bildirir. İşlem başarılı ise 200 döner. |
redirectUrl | string | Ödeme için yönlendirilecek güvenli 3D sayfası. |
Başarısız Cevap
{
"code": 404,
"message": " Token is missing"
}
Değer | Tür | Açıklama |
---|---|---|
code | integer | Yapılan isteğin sonucunu bildirir. İşlem hatalı ise aşağıdaki kodlar döner. |
message | string | Yapılan istekteki hata mesajını belirtir. |
Hata Mesajları
Hata Kodu | Hata Mesajı | Açıklama |
---|---|---|
403 | Api is not active in the merchant | Mağaza apisi aktif değil. |
402 | This payment token already used |
payment_token değeri daha önce kullanılmış. getPos apisinden alınan payment_token sadece 1 kere kullanılır (3D sayfasına başarıyla yönlenmiş transactionlar için geçerli) |
402 | other_code must be unique | other_code parametresi benzersiz olmalı. |
403 | Payment token and card number do not match | getPos apisinde gönderilen kart numarası ile pay3D apisine gönderilen kart numarasını aynı değil. |
403 | Payment token and amount do not match | getPos apisinde gönderilen tutar ile pay3D apisine gönderilen tutar aynı değil. |
410 | Installment must be numeric | Taksit sayısı numerik olmalı. |
412 | Non-permitted installment | getPos apisinden alınan taksitlerden farklı bir taksit sayısı gönderildi. |
500 | Installment Error - ... | Taksit hatası - Gönderilen taksit sayısı oranlar tablosunda bulunamadı. |
404 | Wrong payment token | payment_token değeri hatalı. |
500 | System Error | Sistem hatası. |
410 | The credit card must be 16 digits | Kart numarası 16 karakterden oluşmalı. |
406 | Merchant is not active | Mağaza aktif değil. |
Sonuç
Başarılı Cevap
{
"status": true,
"resultCode": 200,
"resultMessage": 'Payment successful',
"VerifyHash": 'ece8dc908184c31dcc3d7247eae083572a712709',
"otherCode": 'afafb566cdea0aa37477324b702f0ba6',
"saleID": 2452
}
Değer | Tür | Açıklama |
---|---|---|
status | boolean | Ödemenin sonucunu bildirir. İşlem başarılı ise true döner. |
resultCode | integer | Ödemenin sonucunu bildirir. İşlem başarılı ise 200 döner. |
resultMessage | string | Payment successful. |
VerifyHash | string | Gelen cevabı doğrulamak için SHA256 ile şifrelenmiş değerdir. |
otherCode | string | pay3D methodunda gönderilen benzersiz kod. |
saleID | integer | Paynoloji tarafında oluşturulan satışın ID'si |
Başarısız Cevap
{
"status": false,
"resultCode": 302,
"resultMessage": '3D Tamamlanmadı',
"VerifyHash": 'ece8dc908184c31dcc3d7247eae083572a712709',
"otherCode": 'afafb566cdea0aa37477324b702f0ba6',
"saleID": 2452
}
Değer | Tür | Açıklama |
---|---|---|
status | boolean | Ödemenin sonucunu bildirir. İşlem başarısız ise false döner. |
resultCode | integer | Ödemenin sonucunu bildirir. İşlem başarısız ise hata kodu döner. |
resultMessage | string | Başarısız ödemenin hata mesajını belirtir. |
VerifyHash | string | Gelen cevabı doğrulamak için SHA256 ile şifrelenmiş değerdir. |
otherCode | string | pay3D methodunda gönderilen benzersiz kod. |
saleID | integer | Paynoloji tarafında oluşturulan satışın ID'si |
VerifyHash Doğrulama
$VerifyHash = hash("sha256", 'APP_ID_DEGERI' . "|" . 'APP_SECRET_DEGERI' . "|" . 'OTHER_CODE_DEGERI' . "|true");
if($VerifyHash == $_POST['VerifyHash']) {
$payment_status = true;
} else {
$payment_status = false;
}
VerifyHash kodunu aşağıdaki gibi oluşturup post ile gelen veriyi ile eşleştirerek güvenlik önleminizi arttırabilirsiniz.
Hazır PHP Kodu
define("APP_ID", "XXXXXXXXXXXXX");
define("APP_SECRET", "XXXXXXXXXXXXX");
define("CALLBACK_URL", "https://website.com/callback.php");
$pyz_data = [
'app_id' => APP_ID,
'app_secret' => APP_SECRET
];
$hCon = curl_init("https://api.paynoloji.com/token");
curl_setopt_array($hCon, [
CURLOPT_USERAGENT => APP_ID,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_HTTPHEADER => ['Content-Type:application/json'],
CURLOPT_POSTFIELDS => json_encode($pyz_data)
]);
$hRet = curl_exec($hCon);
curl_close($hCon);
$pyz_res = json_decode($hRet, true);
if ($pyz_res['code'] == 200) {
$authToken = $pyz_res['token'];
$data = [
'card_number' => $_POST['number'],
'amount' => $_POST['amount']
];
$hCon = curl_init("https://api.paynoloji.com/installments");
curl_setopt_array($hCon, [
CURLOPT_USERAGENT => APP_ID,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_HTTPHEADER => ['Content-Type:application/json', "Authorization: Bearer " . $authToken],
CURLOPT_POSTFIELDS => json_encode($data)
]);
$hRet = curl_exec($hCon);
curl_close($hCon);
$pyz_res = json_decode($hRet, true);
if ($pyz_res['code'] == 200) {
$payToken = $pyz_res['payToken'];
$other_code = md5(time());
$pyz_data = [
'card_holder' => $_POST['name'],
'card_number' => $_POST['number'],
'exp_month' => $_POST['expiry_month'],
'exp_year' => $_POST['expiry_year'],
'cvv' => $_POST['cvv'],
'amount' => $_POST['amount'],
'redirectOkUrl' => redirectOkUrl,
'redirectFailUrl' => redirectFailUrl,
'redirectOkUrl' => notifyUrl,
'paymentID' => paymentID,
'note' => note,
'currency' => currency,
'installment' => $_POST['installment'], // Taksitli kurgu yoksa 1 olarak gönderiniz.
];
$hCon = curl_init("https://api.paynoloji.com/pay3D");
curl_setopt_array($hCon, [
CURLOPT_USERAGENT => APP_ID,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_HTTPHEADER => ['Content-Type:application/json', "Authorization: Bearer " . $authToken],
CURLOPT_POSTFIELDS => json_encode($pyz_data)
]);
$hRet = curl_exec($hCon);
curl_close($hCon);
$pyz_res = json_decode($hRet, true);
$redirectUrl = $pyz_res['redirectUrl'];
header("Location: {$redirectUrl}");
exit();
} else {
exit("payToken: jeton alınamadı.");
}
} else {
exit("authToken: jeton alınamadı.");
}
Php ile tek çekimli ödeme başlatma kodlarını inceleyebilir dilerseniz buraya tıklayarak indirebilirsiniz.
Taksitli satış kurgusu için adımları incelemeniz gerekmektedir.
Örnek PHP Kodu
define("APP_ID", "XXXXXXXXXXXXX");
define("APP_SECRET", "XXXXXXXXXXXXX");
if (isset($_POST['VerifyHash']) AND isset($_POST['otherCode'])) {
$status = $_POST['status'];
$VerifyHash = $_POST['VerifyHash'];
$otherCode = $_POST['otherCode'];
$saleID = $_POST['saleID'];
$verify_key = APP_ID . '|' . APP_SECRET . '|' . $otherCode . '|true';
if ($status == 1 AND $VerifyHash == hash("sha256", $verify_key)) {
print("Ödemeniz başarılı.");
}else{
$result_code = $_POST['resultCode'];
$result_message = $_POST['resultMessage'];
print($result_code, $result_message);
exit();
}
}
Php ile geri dönüş kodlarını inceleyebilir dilerseniz buraya tıklayarak indirebilirsiniz.