<?php
########################## ÖDEME LİNKİ OLUŞTURMAK İÇİN ÖRNEK KODLAR ########################
# #
################################ DÜZENLEMESİ ZORUNLU ALANLAR ###############################
#
## API Entegrasyon Bilgileri - Mağaza paneline giriş yaparak BİLGİ sayfasından alabilirsiniz.
$merchant_id = 'AAAAAA';
$merchant_key = 'XXXXXXXXXXXXXXXX';
$merchant_salt = 'XXXXXXXXXXXXXXXX';
#
## Gerekli Bilgiler
#
$name = "Örnek Ürün / Hizmet Adı";
# Ürün / Hizmetin açıklaması. En az 4 en fazla 200 karakter.
#
$price = 1445;
# 14.45 TL için 14.45 * 100 = 1445 (100 ile çarpılmış ve integer olarak gönderilmelidir.)
#
$currency = "TL";
# TL - USD - EUR - GBP gönderilebilir.
#
$max_installment = "12";
# 2 - 12 arası gönderilebilir. 1 gönderilirse bireysel kartlar taksit yapılamaz.
#
$link_type = "product";
# collection (fatura/cari tahsilat) veya product (ürün/hizmet satışı) gönderilebilir.
# collection ise email (ödeme yapan tarafın eposta adresi olmalı).
# product ise min_count (satın alma adet alt limiti) gereklidir.
#
$lang = "tr";
# tr veya en gönderilebilir.
$get_qr = 1;
# Opsiyoneldir 1 veya 0 gönderilebilir. 1 gönderildiğinde yanıt içerisinde
# QR kod oluşturabilmeniz için PNG formatında Base64 kodu döner.
$required = $name.$price.$currency.$max_installment.$link_type.$lang;
if($link_type == "product"){
$min_count = "1";
# Alt adet limiti.
$required .= $min_count;
}elseif($link_type == "collection"){
$email = time()."@example.com";
# Ödeme yapan kullanıcının eposta adresi.
$required .= $email;
}
## Opsiyonel bilgiler, gönderilmesi zorunlu değildir.
#
$expiry_date = "2020-03-23 17:00:00";
# Link'in son kullanma tarihi. Gönderilmezse, sürekli açık kalır.
# Örnek format: 2021-05-31 17:00:00
#
$max_count = "1";
# Yalnızca product modunda kullanılabilir.
# Link'in stok adedini belirler. Gönderilmezse, stok limiti uygulanmaz.
# Stok adedi kadar ödeme yapıldığında link pasif olur.
#
//$pft = "0"; // OPSİYONEL
# 2 - 12 arası gönderilebilir. Gönderilen en yüksek sayıya kadar olan tüm taksit seçenekleri
# Peşin Fiyatına Taksit olarak ayarlanır.
# DİKKAT: Peşin Fiyatına Taksit olarak belirlediğiniz taksit sayıları için yapılan tüm
# ödeme işlemlerinde, taksit komisyonları sizden kesilecektir.
#
$callback_link = "";
# Link ile yapılan ödemenin sonucunun gönderileceği URL. En fazla 400 kararkter.
# http:// ya da https:// ile başlamalı, localhost olmamalı ve port içermemelidir.
# callback_id gönderildiğinde bu alan zorunlu olmaktadır.
#
$callback_id = "";
# Bildirimde dönülecek bildirim ID'si. Alfanumerik ve en fazla 64 karakter olabilir.
# callback_link gönderildiğinde bu alan zorunlu olmaktadır.
$debug_on = 1;
# Entegrasyon hatalarını alabilmek için 1 olarak bırakın.
#
############################################################################################
################ Bu kısımda herhangi bir değişiklik yapmanıza gerek yoktur. ################
#
$paytr_token=base64_encode(hash_hmac('sha256', $required.$merchant_salt, $merchant_key, true));
$post_vals=array(
'merchant_id' => $merchant_id,
'name' => $name,
'price' => $price,
'currency' => $currency,
'max_installment' => $max_installment,
'link_type' => $link_type,
'lang' => $lang,
'min_count' => $min_count,
'email' => $email,
'expiry_date' => $expiry_date,
'max_count' => $max_count,
'callback_link' => $callback_link,
'callback_id' => $callback_id,
'debug_on' => $debug_on,
'get_qr' => $get_qr,
'paytr_token' => $paytr_token
);
#
############################################################################################
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.paytr.com/odeme/api/link/create");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1) ;
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_vals);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
$result = @curl_exec($ch);
if(curl_errno($ch))
die("PAYTR LINK CREATE API request timeout. err:".curl_error($ch));
curl_close($ch);
$result=json_decode($result,1);
if($result['status']=='error')
die($result['err_msg']);
elseif($result['status']=='failed')
print_r($result);
else
print_r($result);
# Python 3.6+
# Link API Create Servisi icin kullanılacak örnek kod yapısı.
import base64
import hmac
import hashlib
import requests
import json
import random
# API Entegrasyon Bilgilier - Mağaza paneline giriş yaparak BİLGİ sayfasından alabilirsiniz.
merchant_id = 'AAAAAA'
merchant_key = b'XXXXXXXXXXXXXXXX'
merchant_salt = 'XXXXXXXXXXXXXXXX'
## Gerekli Bilgiler
name = 'Örnek Ürün / Hizmet Adı'
# Ürün / Hizmetin açıklaması. En az 4 en fazla 200 karakter.
price = '1445'
# 14.45 TL için 14.45 * 100 = 1445 (100 ile çarpılmış ve integer olarak gönderilmelidir.)
currency = 'TL'
# TL - USD - EUR - GBP gönderilebilir.
max_installment = '12'
# 2 - 12 arası gönderilebilir. 1 gönderilirse bireysel kartlar taksit yapılamaz.
link_type = 'product'
# collection (fatura/cari tahsilat) veya product (ürün/hizmet satışı) gönderilebilir.
# collection ise email (ödeme yapan tarafın eposta adresi olmalı).
# product ise min_count (satın alma adet alt limiti) gereklidir.
lang = 'tr'
# tr veya en gönderilebilir.
get_qr = 1
# Opsiyoneldir 1 veya 0 gönderilebilir. 1 gönderildiğinde yanıt içerisinde
# QR kod oluşturabilmeniz için PNG formatında Base64 kodu döner.
email =''
min_count =''
required = name + price + currency + max_installment + link_type + lang
if link_type == 'product':
min_count = '1'
# Alt adet limiti.
required+=min_count
elif link_type == 'collection':
email= random.randint(1, 9999999).__str__() + '@example.com'
# Ödeme yapan kullanıcının eposta adresi.
required+=email
## Opsiyonel bilgiler, gönderilmesi zorunlu değildir.
expiry_date= '2021-03-23 17:00:00'
# Link'in son kullanma tarihi. Gönderilmezse, sürekli açık kalır.
# Örnek format: 2021-05-31 17:00:00
max_count='1'
# Yalnızca product modunda kullanılabilir.
# Link'in stok adedini belirler. Gönderilmezse, stok limiti uygulanmaz.
# Stok adedi kadar ödeme yapıldığında link pasif olur.
#
#pft='0'; // OPSİYONEL
# 2 - 12 arası gönderilebilir. Gönderilen en yüksek sayıya kadar olan tüm taksit seçenekleri
# Peşin Fiyatına Taksit olarak ayarlanır.
# DİKKAT: Peşin Fiyatına Taksit olarak belirlediğiniz taksit sayıları için yapılan tüm
# ödeme işlemlerinde, taksit komisyonları sizden kesilecektir.
#
callback_link =''
# Link ile yapılan ödemenin sonucunun gönderileceği URL. En fazla 400 kararkter.
# http:// ya da https:// ile başlamalı, localhost olmamalı ve port içermemelidir.
# callback_id gönderildiğinde bu alan zorunlu olmaktadır.
callback_id=''
# Bildirimde dönülecek bildirim ID'si. Alfanumerik ve en fazla 64 karakter olabilir.
# callback_link gönderildiğinde bu alan zorunlu olmaktadır.
debug_on=1
# Entegrasyon hatalarını alabilmek için 1 olarak bırakın.
# Bu kısımda herhangi bir değişiklik yapmanıza gerek yoktur.
hash_str = required + merchant_salt
paytr_token = base64.b64encode(hmac.new(merchant_key, hash_str.encode(), hashlib.sha256).digest())
params = {
'merchant_id': merchant_id,
'name': name,
'price': price,
'currency': currency,
'max_installment': max_installment,
'link_type': link_type,
'lang': lang,
'min_count': min_count,
'email': email,
'expiry_date': expiry_date,
'max_count': max_count,
'callback_link': callback_link,
'callback_id': callback_id,
'debug_on': debug_on,
'get_qr': get_qr,
'paytr_token': paytr_token
}
result = requests.post('https://www.paytr.com/odeme/api/link/create', params)
res = json.loads(result.text)
if res['status'] == 'error':
print('Error: ' + res['err_msg'])
elif res['status'] == 'failed':
print(result.text)
else:
print(result.text)
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Collections.Specialized;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Web.Script.Serialization;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Routing;
namespace WebApplication1.Controllers
{
public class CreateController : Controller
{
public ActionResult List()
{
// ####################### DÜZENLEMESİ ZORUNLU ALANLAR #######################
//
// API Entegrasyon Bilgileri - Mağaza paneline giriş yaparak BİLGİ sayfasından alabilirsiniz.
string merchant_id = "AAAAAA";
string merchant_key = "XXXXXXXXXXXXXXXX";
string merchant_salt = "XXXXXXXXXXXXXXXX";
//
// ## Gerekli Bilgiler
string name = "Örnek Ürün / Hizmet Adı";
// Ürün / Hizmetin açıklaması. En az 4 en fazla 200 karakter.
int price = 1445;
// 14.45 TL için 14.45 * 100 = 1445 (100 ile çarpılmış ve integer olarak gönderilmelidir.)
string max_installment = "12";
// 2 - 12 arası gönderilebilir. 1 gönderilirse bireysel kartlar taksit yapılamaz.
string currency = "TL";
//TL - USD - EUR - GBP gönderilebilir.
string link_type = "product";
//collection (fatura/cari tahsilat) veya product (ürün/hizmet satışı) gönderilebilir.
//collection ise email (ödeme yapan tarafın eposta adresi olmalı).
//product ise min_count (satın alma adet alt limiti) gereklidir.
string lang = "tr";
//tr veya en gönderilebilir.
get_qr = '';
// Opsiyoneldir 1 veya 0 gönderilebilir. 1 gönderildiğinde yanıt içerisinde
// QR kod oluşturabilmeniz için PNG formatında Base64 kodu döner.
////////////////////////////////////////////////////////////////////////////////////////
// Opsiyonel bilgiler, gönderilmesi zorunlu değildir.
string expiry_date = "2020-11-23 17:00:00";
// Link'in son kullanma tarihi. Gönderilmezse, sürekli açık kalır.
// Örnek format: 2021-05-31 17:00:00
string callback_id = "";
// Bildirimde dönülecek bildirim ID'si. Alfanumerik ve en fazla 64 karakter olabilir.
//callback_link gönderildiğinde bu alan zorunlu olmaktadır.
string callback_link = "";
//Link ile yapılan ödemenin sonucunun gönderileceği URL. En fazla 400 kararkter.
//http:// ya da https:// ile başlamalı, localhost olmamalı ve port içermemelidir.
//callback_id gönderildiğinde bu alan zorunlu olmaktadır.
string max_count = "";
//Yalnızca product modunda kullanılabilir.
//Link'in stok adedini belirler. Gönderilmezse, stok limiti uygulanmaz.
//Stok adedi kadar ödeme yapıldığında link pasif olur.
string pft = "";
//2 - 12 arası gönderilebilir. Gönderilen en yüksek sayıya kadar olan tüm taksit seçenekleri
//Peşin Fiyatına Taksit olarak ayarlanır.
//DİKKAT: Peşin Fiyatına Taksit olarak belirlediğiniz taksit sayıları için yapılan tüm
//ödeme işlemlerinde, taksit komisyonları sizden kesilecektir.
string debug_on = "1";
//Entegrasyon hatalarını alabilmek için 1 olarak bırakın.
////////////////////////////////////////////////////////////////////////////////////////////
///
string min_count = "";
string email = "";
string Birlestir = "";
NameValueCollection data = new NameValueCollection();
data["merchant_id"] = merchant_id;
data["name"] = name;
data["price"] = price.ToString();
// Token oluşturma fonksiyonu, değiştirilmeden kullanılmalıdır.
if (link_type == "product")
{
min_count = "1";
Birlestir = string.Concat(name,price.ToString(),currency,max_installment,link_type,lang,min_count,merchant_salt);
}
else if (link_type == "collection")
{
email = "test@mail.com";
Birlestir = string.Concat(name,price.ToString(),currency,max_installment,link_type,lang,email,merchant_salt);
}
HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(merchant_key));
byte[] b = hmac.ComputeHash(Encoding.UTF8.GetBytes(Birlestir));
string paytr_token = Convert.ToBase64String(b);
// Gönderilecek veriler oluşturuluyor
data["currency"] = currency;
data["max_installment"] = max_installment;
data["link_type"] = link_type;
data["lang"] = lang;
data["get_qr"] = get_qr;
data["min_count"] = min_count;
data["email"] = email;
data["expiry_date"] = expiry_date;
data["callback_link"] = callback_link;
data["callback_id"] = callback_id;
data["debug_on"] = debug_on;
data["paytr_token"] = paytr_token;
//
using (WebClient client = new WebClient())
{
client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
byte[] result = client.UploadValues("https://www.paytr.com/odeme/api/link/create", "POST", data);
string ResultAuthTicket = Encoding.UTF8.GetString(result);
dynamic json = JValue.Parse(ResultAuthTicket);
if (json.status == "error")
{
Response.Write("PAYTR LINK CREATE API request timeout. Error:" + json.err_msg + "");
}
else
{
Response.Write(json);
/* Başarılı yanıt içerik örneği
[status] => success
[id] => XXXXXX
[link] => https://www.paytr.com/link/XXXXXX
*/
}
}
return View();
}
}
}
var crypto = require('crypto');
var express = require('express');
var app = express();
var request = require('request');
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
var merchant_id = 'AAAAAA';
var merchant_key = 'XXXXXXXXXXXXXXXX';
var merchant_salt = 'XXXXXXXXXXXXXXXX';
app.get("/create", function (req, res) {
var name = 'Örnek Ürün / Hizmet Adı'; // Ürün / Hizmetin açıklaması. En az 4 en fazla 200 karakter.
var price = '1445'; // 14.45 TL için 14.45 * 100 = 1445 (100 ile çarpılmış ve integer olarak gönderilmelidir.)
var currency = 'TL'; //TL - USD - EUR - GBP gönderilebilir.
var max_installment = '12'; // 2 - 12 arası gönderilebilir. 1 gönderilirse bireysel kartlar taksit yapılamaz.
//collection (fatura/cari tahsilat) veya product (ürün/hizmet satışı) gönderilebilir.
//collection ise email (ödeme yapan tarafın eposta adresi olmalı).
//product ise min_count (satın alma adet alt limiti) gereklidir.
var link_type = 'product';
var lang = 'tr'; //tr veya en gönderilebilir.
var get_qr = '';
// Opsiyoneldir 1 veya 0 gönderilebilir. 1 gönderildiğinde yanıt içerisinde
// QR kod oluşturabilmeniz için PNG formatında Base64 kodu döner
var required = name + price + currency + max_installment + link_type + lang;
var email = '';
var min_count = '';
if (link_type == 'product') {
min_count = '1';
// Alt adet limiti.
required += min_count;
} else {
(link_type == 'collection')
email = 'test@example.com';
// Ödeme yapan kullanıcının eposta adresi.
required += email;
}
var max_count = '1';
// Opsiyonel bilgiler, gönderilmesi zorunlu değildir.
var expiry_date = '2021-06-23 17:00:00';
// Link'in son kullanma tarihi. Gönderilmezse, sürekli açık kalır.
// Örnek format: 2021-05-31 17:00:00
//$pft = '0'; // OPSİYONEL
// 2 - 12 arası gönderilebilir. Gönderilen en yüksek sayıya kadar olan tüm taksit seçenekleri
// Peşin Fiyatına Taksit olarak ayarlanır.
// DİKKAT:Peşin Fiyatına Taksit olarak belirlediğiniz taksit sayıları için yapılan tüm ödeme işlemlerinde, taksit komisyonları sizden kesilecektir.
//
//Link ile yapılan ödemenin sonucunun gönderileceği URL. En fazla 400 kararkter.
//http:// ya da https:// ile başlamalı, localhost olmamalı ve port içermemelidir.
//callback_id gönderildiğinde bu alan zorunlu olmaktadır.
var callback_link = '';
// Bildirimde dönülecek bildirim ID'si. Alfanumerik ve en fazla 64 karakter olabilir.
//callback_link gönderildiğinde bu alan zorunlu olmaktadır.
var callback_id = '';
var debug_on = '1'; //Entegrasyon hatalarını alabilmek için 1 olarak bırakın.
var paytr_token = crypto.createHmac('sha256', merchant_key).update(required + merchant_salt).digest('base64');
var options = {
'method': 'POST',
'url': 'https://www.paytr.com/odeme/api/link/create',
'headers': {
'Content-Type': 'application/x-www-form-urlencoded'
},
form: {
'merchant_id': merchant_id,
'name': name,
'price': price,
'currency': currency,
'max_installment': max_installment,
'link_type': link_type,
'lang': lang,
'get_qr': get_qr,
'min_count': min_count,
'email': email,
'expiry_date': expiry_date,
'max_count': max_count,
'callback_link': callback_link,
'callback_id': callback_id,
'debug_on': debug_on,
'paytr_token': paytr_token,
}
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
var res_data = JSON.parse(body);
if (res_data.status == 'success') {
res.send(body);
} else {
res.end(body);
}
});
});
app.get("/delete", function (req, res) {
var id = 'XXXX'; // Link ID - create metodunda dönülen değerdir.
var debug_on = '1'; // Hataları ekrana basmak için kullanılır.
var paytr_token = crypto.createHmac('sha256', merchant_key).update(id + merchant_id + merchant_salt).digest('base64');
var options = {
'method': 'POST',
'url': 'https://www.paytr.com/odeme/api/link/delete',
'headers': {
'Content-Type': 'application/x-www-form-urlencoded'
},
form: {
'merchant_id': merchant_id,
'id': id,
'debug_on': debug_on,
'paytr_token': paytr_token,
}
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
var res_data = JSON.parse(body);
if (res_data.status == 'success') {
res.send(response.body);
/* Başarılı yanıt içerik örneği
[status] => success
*/
} else {
console.log(response.body);
res.end(response.body);
}
});
});
app.get("/sendsms", function (req, res) {
var id = 'XXXX'; // Link ID - create metodunda dönülen değerdir.
var cell_phone = '05555555555'; // SMS gönderilecek numara. 05 ile başlamalı ve 11 hane olmalıdır.
var debug_on = '1'; // Hataları ekrana basmak için kullanılır.
var paytr_token = crypto.createHmac('sha256', merchant_key).update(id + merchant_id + cell_phone + merchant_salt).digest('base64');
var options = {
'method': 'POST',
'url': 'https://www.paytr.com/odeme/api/link/send-sms',
'headers': {
'Content-Type': 'application/x-www-form-urlencoded'
},
form: {
'merchant_id': merchant_id,
'id': id,
'cell_phone': cell_phone,
'debug_on': debug_on,
'paytr_token': paytr_token,
}
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
var res_data = JSON.parse(body);
if (res_data.status == 'success') {
res.send(response.body);
} else {
console.log(response.body);
res.end(response.body);
}
});
});
app.get("/sendmail", function (req, res) {
var id = 'XXXX'; // Link ID - create metodunda dönülen değerdir.
var email = ''; // Eposta gönderilecek adres. Standart email adresi formatına uygun olmalıdır.
var debug_on = '1'; // Hataları ekrana basmak için kullanılır.
var paytr_token = crypto.createHmac('sha256', merchant_key).update(id + merchant_id + email + merchant_salt).digest('base64');
var options = {
'method': 'POST',
'url': 'https://www.paytr.com/odeme/api/link/send-email',
'headers': {
'Content-Type': 'application/x-www-form-urlencoded'
},
form: {
'merchant_id': merchant_id,
'id': id,
'email': email,
'debug_on': debug_on,
'paytr_token': paytr_token,
}
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
var res_data = JSON.parse(body);
if (res_data.status == 'success') {
res.send(response.body);
} else {
console.log(response.body);
res.end(response.body);
}
});
});
app.post("/callback", function (req, res) {
var callback = req.body;
token = callback.id + callback.merchant_oid + merchant_salt + callback.status + callback.total_amount;
var paytr_token = crypto.createHmac('sha256', merchant_key).update(token).digest('base64');
if (paytr_token != callback.hash) {
throw new Error("PAYTR notification failed: bad hash");
}
////////////////////////////// POST İÇERİSİNDE DÖNEN DEĞERLER //////////////////////////////
// [hash] => Doğrulama yapmak için kullanılacak hash bilgisi.
// [merchant_oid] => PayTR tarafından oluşturulan sipariş referans numarası.
// [status] => Ödemenin başarılı durumunda success değeri alır(Link API'de başarısız ödemeler için callback yapılmamaktadır).
// [total_amount] => Toplam ödeme tutarı(Örneğin taksitli ödeme ise vade farklı toplam tutar).
// [payment_amount] => Ödeme tutarı.
// [payment_type] => Ödeme yöntemi.
// [currency] => Ödeme para birimi.
// [callback_id] => Link oluşturmada(create) ilettiğiniz callbak_id bilgisi.
// [merchant_id] => PayTR mağaza numaranınz.
// [test_mode] => Eğer mağazanız test modunda ise 1 döner.
////////////////////////////////////////////////////////////////////////////////////////////
if (callback.status == 'success') {
//basarili
} else {
/// basarisiz
}
res.send('OK');
});
var port = 3200;
app.listen(port, function () {
console.log("Server is running. Port:" + port);
});