PayU 3D Secure Entegrasyonu Nasıl Yapılır ?

3d entegrasyonun nasıl yapılacağı konusuna girmeden önce, 3d secure’nin çalışma mantığından bahsetmek istiyorum.

3d secure kart sahibi, ilgili satıcı firma ve banka üçlüsünde temel olarak kart hamilinin kimliğini doğrulamaya yönelik yapılan bir uygulama. Normal süreçten farklı olarak, ödeme işlemi sırasında kart hamili 3d secure şifre doğrulama ekranına yönlendirilir ve bu ekranda, cep telefonuna anlık olarak gönderilen şifre ve/veya CVC2 numarasını girerek işlemi sonuçlandırır. Bu şekilde işlemin kart hamilinin bilgisi dahilinde yapılmış olduğu doğrulanır.

3d ile ilgili teorik kısmı geçtikten sonra, dilerseniz PayU sisteminde 3d entegrasyonunun nasıl yapılacağına değinelim;

Öncelikle, PayU tarafında 3d secure kullanabilmeniz için, hesabınızın 3d secure olarak aktif edilmesi ya da banka kartı (debit kart) ile işlem deniyor olmanız gerekmektedir.

Gerekli aktivasyonlar yapılmış ise;  PayU sistemi size aşağıdaki gibi bir response bilgisi dönecektir. Bu response yanıtı içinde geçen, özellikle aşağıdaki, <return_code> ve <url_3ds> parametrelerine dikkat ediniz .

<return_code> “3DS_ENROLLED” olarak dönmüş ise, işleminiz 3d olarak gerçekleşecek demektir. Bu noktada en çok yapılan hatalardan biri, bazı yazılımcılar <status> parametresini kontrol ediyor ve SUCCESS cevabını gördükleri için işlemi onaylandı olarak kabul etmektedir. Bu uygulama kesinlikle yanlıştır. Mutlaka <return_code> parametresi de kontrol edilmelidir.

Peki <return_code> “3DS_ENROLLED” olarak dönmüş ise ne yapmamız gerekir ?

Burada yapmamız gereken kullanıcıyı redirection yapmak. Bu işlem için <url_3ds> parametresi ile gönderilen url adresini kullanacağız. Kullanıcıyı belirtilen bu urlye gönderdiğimizde 3d doğrulama ekranına ulaşacaktır.

3D Secure Response Örneği:

<?xml version=”1.0″?>
<epayment>
<refno>123456789</refno>
<alias>9592b7736c9e277fea8cc79c2e5b5a23</alias>
<status>SUCCESS</status>
<return_code>3DS_ENROLLED</return_code>
<return_message>3DS Enrolled Card.</return_message>
<date>2010-12-09 20:44:37</date>
<url_3ds>https://secure.payu.com.tr/order/alu_return_3ds.php?request_id=2Xrl85eakbSBr3WtcbixYQ%3D%3D</url_3ds>
<hash>623a8c7e88ccc9b9d4ed3bcd1271e5d5</hash>
</epayment>

Normal Non Secure İşlem Response Örneği:

<?xml version=”1.0″?>
<epayment>
<refno>123456789</refno>
<alias>9592b7736c9e277fea8cc79c2e5b5a23</alias>
<status>SUCCESS</status>
<return_code>AUTHORIZED</return_code>
<return_message>Successfull authorized</return_message>
<date>2012-11-06 20:52:20</date>
<hash>b560a38e2b3e7bcbac328bbd6218bc60</hash>
</epayment>

İşlemin Başarılı Olduğunu Nasıl Doğrularım ?

Kullanıcı 3d doğrulama ekranına başarılı olarak ulaşmış ve doğrulamayı tamamlamış ise, PayU sistemi önceden belirtmiş olduğunuz “BACK_REF” url adresine REFNO, ALIAS, STATUS, RETURN_CODE, RETURN_MESSAGE ve DATE parametrelerini de içeren bir cevap dönecektir.  Almış olduğunuz bu response cevabına göre siparişi onaylayabilir ya da hatalı olarak işleyebilirsiniz.

 

 

IPN Debug Nasıl Yapılır ?

Bazı durumlarda, PayU kullanıcı panelinize girdiğinizde IPN hatası şeklinde bir bildirim görürsünüz. Bu bildirim, sisteminize gelen IPN bildirimlerinin geçerli yanıt alamadığını kısacası IPN servisinin sağlıklı çalışmadığını göstermektedir.

Bu yazımda, IPN debug işleminin nasıl yapılacağına değinmeye çalışacağım. Debug işlemi ile PayU sisteminden bize gönderilen tüm parametreleri ve aynı zamanda bizim dönmüş olduğumuz cevabı görebileceğiz.

Aşağıdaki adımları takip edelim;

1. Öncelikle PayU kullanıcı panelimize giriyoruz. Ardından açılan ekranda IPN hatası alan işlemin referans numarasına tıklıyoruz.

IPN-debug1

2. Açılan ekrandan, “Bildirimi Tekrar Gönder” bağlantısına tıklıyoruz. Yandaki sayı, bildirimin kaç kere gönderilmiş olduğunu gösterir. Bu sayının üzerine tıklayarak, bildirimlerin başarı durumlarını görebilirsiniz.

 

IPN-debug2

3. Açılan ekrandan “IPN hata ayıklaması” kutucuğunu işaretliyoruz.

IPN-debug3

4. Son adım. Bu adımda IPN debug içeriği görüntülenmiş oluyor. PayU’dan bize gelen parametreleri ve aynı zamanda dönmüş olduğumuz yanıtı kontrol edebiliriz.

IPN-debug4

Örnek bir debug içeriği aşağıdaki gibidir. Response satırını kontrol ederseniz, başarılı bir bildirim olduğunu görebilirsiniz.

<EPAYMENT>2015072484530|9b2f686d85fc3d0d80a08410cf7c043d</EPAYMENT>


 

=== DEBUG INFORMATION: ===
Resending notification #3586222

=== REQUEST PARAMETERS ===
SALEDATE: 2015-07-21 15:29:38
PAYMENTDATE: 2015-07-21 15:31:06
REFNO: 7187014
REFNOEXT: 86842
ORDERNO: 178
ORDERSTATUS: COMPLETE
PAYMETHOD: CreditCard
PAYMETHOD_CODE: CCVISAMC
FIRSTNAME: Serkan
LASTNAME: Yıldırım
IDENTITY_NO: –
IDENTITY_ISSUER:
CARD_TYPE: Visa
IDENTITY_CNP:
COMPANY:
REGISTRATIONNUMBER:
FISCALCODE:
CBANKNAME:
CBANKACCOUNT:
ADDRESS1: Billing address
ADDRESS2: Billing address
CITY: City
STATE: State / Dept.
ZIPCODE: 12345234
COUNTRY: Turkey
COUNTRY_CODE: tr
PHONE: –
FAX: 4543958674234
CUSTOMEREMAIL: deneme@payu.com.tr
FIRSTNAME_D: Ömer
LASTNAME_D: Akkentli
COMPANY_D: Company Name
ADDRESS1_D: Delivery Address
ADDRESS2_D: Delivery Address
CITY_D: City
STATE_D: State / Dept.
ZIPCODE_D: 12345
COUNTRY_D: Turkey
COUNTRY_D_CODE: tr
PHONE_D: 454395867
EMAIL_D: deneme@payu.com.tr
IPADDRESS: 127.0.0.1
IPCOUNTRY:
COMPLETE_DATE: 2015-07-21 15:32:59
CURRENCY: TRY
LANGUAGE: tr
IPN_PID[]: 9474043
IPN_PNAME[]: Ürün1
IPN_PCODE[]: T234435
IPN_INFO[]: Ürün bilgisi 1
IPN_QTY[]: 1
IPN_PRICE[]: 0.01
IPN_VAT[]: 0.00
IPN_VER[]:
IPN_DISCOUNT[]: 0.00
IPN_PROMONAME[]:
IPN_PROMOCODE[]:
IPN_ORDER_COSTS[]: 0
IPN_DELIVEREDCODES[]:
IPN_DOWNLOAD_LINK:
IPN_TOTAL[]: 0.01
IPN_TOTALGENERAL: 0.01
IPN_SHIPPING: 0.00
IPN_COMMISSION: 0.00
IPN_DATE: 20150724084508
IPN_PAID_AMOUNT: 0.01
IPN_INSTALLMENTS_PROGRAM: Axess
IPN_INSTALLMENTS_NUMBER: One time payment
IPN_INSTALLMENTS_PROFIT: 0.00
AUTH_CODE: 968645
BANK_MERCHANT_ID: 100100000
BANK_RRN: 520215374123
CARD_BIN: 435508
CARD_HOLDER_NAME:
CARD_MASK: 4355-xxxx-xxxx-4358
ISSUING_BANK: AKBA
NUMBER_OF_INSTALLMENTS: 0
TERMINAL_BANK: AKBA
USED_LOYALTY_POINTS: 0
HASH: 865c0fa20e1e8e67c3ee19a55cec6346
=== RESPONSE HEADERS ===
HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Server: nginx
Date: Fri, 24 Jul 2015 05:45:31 GMT
Content-Type: text/html
Content-Length: 79
Connection: keep-alive
X-Powered-By: PHP/5.3.13
Cache-Control: max-age=0
Expires: Fri, 24 Jul 2015 05:45:30 GMT
Pragma: no-cache
Cache-Control: no-cache

=== RESPONSE BODY ===
<EPAYMENT>2015072484530|9b2f686d85fc3d0d80a08410cf7c043d</EPAYMENT>
=== HASH STRING===
192015-07-21 15:29:38192015-07-21 15:31:067718701458684231788COMPLETE10CreditCard8CCVISAMC6Serkan11Yıldırım1-04Visa00000015Billing address15Billing address4City13State / Dept.8123452346Turkey2tr1-13454395867423427deneme@payu.com.tr5Ömer8Akkentli12Company Name16Delivery Address16Delivery Address4City13State / Dept.5123456Turkey2tr945439586727deneme@payu.com.tr9127.0.0.10192015-07-21 15:32:593TRY2tr794740437Ürün17T23443516Ürün bilgisi 11140.0140.00040.0000100040.0140.0140.0040.00142015072408450840.015Axess16One time payment40.00696864591001000001252021537412364355080194355-xxxx-xxxx-43584AKBA104AKBA10

Php’de IPN Entegrasyonu Uygulama

IPN servisi nedir ? neden gereklidir ? gibi sorulara, önceki yazılarımda yanıt vermeye çalıştım. Bu yazımda ise, Php de IPN kurulumunun nasıl yapılacağına değineceğim.

Kuruluma başlamadan önce, ilk olarak PayU destek ekibi ile iletişime geçerek, php dili için yazılmış örnek IPN servisi kodlarını talep ediniz. Farklı bir programlama dili ile çalışıyor iseniz, örneğin .net kullanıyorsanız, .net için geliştirilen kodları talep edebilirsiniz. Ben bu yazımda php dili ile yapılan uygulamayı paylaşacağım.

Destek ekibi tarafından gönderilen aşağıdaki kodları, web sunucunuzda ilgili yere upload ediniz.

Örneğin;  http://www.webadresim.com/ipn.php  gibi.

Sonraki adımda ilk olarak, aşağıdaki satıra güncel secret key bilginizi giriniz. Secret key doğru olarak girilmez ise, hash yanlış hesaplanacağı için, IPN bildirimi başarısız olacaktır.

$pass		= "AABBCCDDEEFF";

Gelelim diğer önemli kısıma;

PayU sistemi, IPN bildirimini başarılı olarak aldığınızı doğrulamak için, sizden bir yanıt beklemektedir. Bu yanıtın formatı aşağıdaki gibidir.

<EPAYMENT>TARİH|HASH</EPAYMENT>
<EPAYMENT>”.$date_return.”|”.$result_hash.”</EPAYMENT>

Burada, gerekli olan hash değerini aşağıdaki parametrelerle oluşturuyoruz.

IPN_PID[0]
IPN_PNAME[0]
IPN_DATE
DATE

$return = strlen($_POST["IPN_PID"][0]).$_POST["IPN_PID"][0].strlen($_POST["IPN_PNAME"][0]).$_POST["IPN_PNAME"][0];
$return .= strlen($_POST["IPN_DATE"]).$_POST["IPN_DATE"].strlen($date_return).$date_return;
Parametre adı Uzunluk Değer
IPN_PID[0] 1 1
IPN_PNAME[0] 16 Software program
IPN_DATE 14 20050303123434
DATE 14 20050303123434

Yukarıdaki örnek parametrelerle oluşturulan hash string değeri aşağıdaki gibi olmaktadır.

1116Software program14200503031234341420050303123434

Hesaplanan hash değeri:

9449ef06f16a0862950008691194d30f

Şimdi yanıtımızı oluşturalım:

<EPAYMENT>20050303123434|9449ef06f16a0862950008691194d30f</EPAYMENT>

[php]
<?php /* Make sure strlen behaves as intended by setting multibyte function overload to 0*/ ini_set(“mbstring.func_overload”, 0); if(ini_get(“mbstring.func_overload”) > 2)
{ /* check if mbstring.func_overload is still set to overload strings(2)*/
echo “WARNING: mbstring.func_overload is set to overload strings and might cause problems\n”;
}

/* Internet Payment Notification */

$pass = “AABBCCDDEEFF”; /* SECRET KEY */
$result = “”; /* string for compute HASH for received data */
$return = “”; /* string to compute HASH for return result */
$signature = $_POST[“HASH”]; /* HASH received */
$body = “”;

/* read info received */
ob_start();
while(list($key, $val) = each($_POST)){
$$key=$val;

/* get values */
if($key != “HASH”){

if(is_array($val)) $result .= ArrayExpand($val);
else{
$size = strlen(StripSlashes($val));
$result .= $size.StripSlashes($val);
}

}

}
$body = ob_get_contents();
ob_end_flush();

$date_return = date(“YmdGis”);

$return = strlen($_POST[“IPN_PID”][0]).$_POST[“IPN_PID”][0].strlen($_POST[“IPN_PNAME”][0]).$_POST[“IPN_PNAME”][0];
$return .= strlen($_POST[“IPN_DATE”]).$_POST[“IPN_DATE”].strlen($date_return).$date_return;

function ArrayExpand($array){
$retval = “”;
for($i = 0; $i < sizeof($array); $i++){ $size = strlen(StripSlashes($array[$i])); $retval .= $size.StripSlashes($array[$i]); } return $retval; } function hmac ($key, $data){ $b = 64; // byte length for md5 if (strlen($key) > $b) {
$key = pack(“H*”,md5($key));
}
$key = str_pad($key, $b, chr(0x00));
$ipad = str_pad(”, $b, chr(0x36));
$opad = str_pad(”, $b, chr(0x5c));
$k_ipad = $key ^ $ipad ;
$k_opad = $key ^ $opad;
return md5($k_opad . pack(“H*”,md5($k_ipad . $data)));
}

$hash = hmac($pass, $result); /* HASH for data received */

$body .= $result.”\r\n\r\nHash: “.$hash.”\r\n\r\nSignature: “.$signature.”\r\n\r\nReturnSTR: “.$return;

if($hash == $signature){
echo “Verified OK!”;

/* Burada Yanıt dönüyoruz */
$result_hash = hmac($pass, $return);
echo “<EPAYMENT>”.$date_return.”|”.$result_hash.”</EPAYMENT>”;

/* Bu kısımda kendi kodlarımızı yazacağız. Örneğin bildirimi başarılı olarak aldıktan sonra siparişi güncellemek için update komutlarımızı yazabiliriz.*/

}else{
/* geçersiz ipn bildirimi durumunda e-posta gönderilir. */
mail(“webmaster@gecad.ro”,”BAD IPN Signature”, $body,””);
}
?>
[/php]

IPN Kurulumu Nasıl Yapılır ?

IPN servisi kurulumu için, öncelikle PayU kullanıcı paneline erişebiliyor olmanız gerekmektedir. Aşağıdaki linkten erişim sağlayabilirsiniz.

https://secure.payu.com.tr/cpanel/index.php

PayU kullanıcı paneline erişebiliyorsanız, Hesap Yönetimi > Hesap ayarları > IPN ayarları bağlantısını takip edin.

https://secure.payu.com.tr/cpanel/ipn_settings.php

Bu sayfada yer alan URL kısmına bir IPN url adresi girmeniz gerekmektedir. Gireceğiniz bu url PayU tarafından verilen bir bilgi olmayıp, yazılımcı tarafından belirlenmektedir. Url adresini bilmiyor iseniz, yazılım desteği aldığınız kişi ya da firma ile iletişime geçerek bu bilgiyi temin etmeniz gerekmektedir. Eğer bir yazılımcı iseniz, IPN bildirimlerinin size ulaşabilmesi için, uygulamayı çalıştırmak üzere bu url’yi belirlemeniz gerekmektedir.

IPN url adresi her zaman aktif ve erişilebilir olmalıdır. Aksi durumda, bildirimler sağlıklı olarak size ulaşmayacaktır.

IPN-ayarlari

IPN url adresini belirledikten sonra, sıra geldi bildirimleri aktifleştirmeye:

Hesap Yönetimi > Hesap ayarları sayfasına gidiyoruz.

https://secure.payu.com.tr/cpanel/account_settings.php

Burada yer alan “Bildirimler” başlığı altından, IPN (Instant Payment Notification) seçeneğini işaretliyoruz. Eğer, hem IPN hem de e-mail yolu ile ile bildirim almak istiyorsanız, Email Text & IPN seçeneğini işaretleyebilirsiniz.

“Şunun için bildirim gönder” seçeneği IPN bildirimlerinin hangi durumlarda gönderileceğini belirlemektedir. “Onaylanmış siparişler” varsayılan olarak seçili olarak gelmektedir. Tamamlanmış siparişler seçeneğini de aktif ediniz. Eğer siparişin iptal ya da iadesi durumunda da IPN bildirimi almak istiyorsanız, “İptal edilmiş ve iade edilmiş siparişler” seçeneğini de işaretleyiniz.

Bu noktada şu hususlara mutlaka değinmek gerektiğini düşünüyorum.

Onaylanmış siparişler: İşlemde başarılı olarak ön provizyon alındığında gelen IPN bildirimini ifade eder.

Tamamlanmış siparişler: Ön otorizasyon kapama başarılı olduğunda, işlem satışa dönüştüğünde gelen IPN bildirimidir. Siparişi işleme almadan önce mutlaka, bu bildirimden gelen, “COMPLETE” tamamlandı yanıtını kontrol etmeniz sizlere tavsiyemdir. 

İptal edilmiş ve iade edilmiş siparişler: Bu bildirim herhangi bir sipariş iade ya da iptal edildiğinde gelmektedir. Yazılım sisteminiz ve PayU arasında mutabakatı sağlamak adına, bu bildirimi de aktif etmenizi tavsiye ederim.

IPN-bildirimler

IPN-bildirimler

Kredi Kartı “Luhn Algoritması” Nedir ?

Luhn algoriması, adını bu algoritmayı
geliştiren Hans Peter Luhn’dan almaktadır. Temeli 1950’lere dayanan bu algoritma aslında çok da yeni sayılmaz.

Günlük hayatta gerek fiziksel ortamda gerekse de online dünyada kullandığımız kredi kartlarının numaraları hiç de gelişigüzel belirlenmemektedir. Kart numaraları belirli bir standart çerçevesinde belirlenmektedir. İşte biz bu standarta luhn algoritması diyoruz.

Luhn algoritmasının
çalışma prensibi şu şekildedir;

Örnek kart numaramız 4242-4242-4242-4242 şeklinde olsun.

Kontrolümüzü 3 adımda  gerçekleştireceğiz.

İlk adım:

Çift hanedeki rakamlar toplanır.

2,2,2,2,2,2,2,2 için

2+2+2+2+2+2+2+2=16

İkinci adım:

Tek hanedeki sayıları 2 ile çarpıyor ve basamaklarını topluyoruz.

4,4,4,4,4,4,4,4 için

4×2=8 > 8
4×2=8 > 8
4×2=8 > 8
4×2=8 > 8
4×2=8 > 8
4×2=8 > 8
4×2=8 > 8
4×2=8 > 8

Bu örnekte sonuç tek basamaklı olduğu için sadece 8 olarak alıyoruz.

8+8+8+8+8+8+8+8=64

Üçüncü adım:

İki toplam sonucunu birbiri ile topluyoruz. Çıkan sonuç 10’un tam katı ise, diğer bir ifade ile mod10’u sıfır ise, kredi kartı numarası geçerlidir diyebiliriz.

16+64=80 (10’un tam katı olduğu için kart numarası geçerlidir.)

IPN servisi nedir? Neden gereklidir ?

IPN,  ingilizce “Instant Payment Notification” sözcüklerinin kısaltmasından meydana gelmektedir. Türkçesi “Anında Ödeme Bildirimi” olarak çevrilebilir.

IPN ile ilgili, kısa
bir açıklama yaptıktan sonra, dilerseniz asıl önemli hususa IPN servisinin ne işe yaradığına ve nasıl çalıştığına değinelim.

IPN, adından da anlaşılacağı  üzere bir bildirim servisidir. Bu bildirim şu şekilde çalışır;

PayU sisteminden herhangi bir başarılı  sipariş geçtiğinde, eğer IPN servisi kurulumu yapılmış ise, sistem sizin tarafınızdan belirlenen url’ye siparişe ait detayları içeren bir bildirim gönderecektir. Bu bildirim http post metodu ile gönderilir. Bildirimin içeriğinde;

  • Referans numarası
  • Siparişin durumu
  • Taksit sayısı
  • Ödenen komisyon tutarı
  • İşlem tarihi
  • Adres ve fatura bilgileri
  • Ürün bilgileri

gibi bir çok parametre gönderilmektedir. Burada bir konuya açıklık getirmek gerekirse;

Yukarıdaki bilgilerin birçoğu zaten işlem sırasında gönderilen response yanıtında bulunmaktadır. O halde IPN servisi neden gereklidir ?

IPN gereklidir. Çünkü response bilgisinde her ne kadar bu bilgiler yer alıyor olsa da IPN kadar detaylı değildir. Bundan daha önemli olan husus ise, response bilgisi senkron bir yapı içerisinde geri döndürülmektedir. Yani bu senkron yapının bir yerinde bir kırılma ya da kesinti olursa bütün işleyiş sekteye uğrayacaktır. Bu durumda, belki de sistemde onay verilmiş bir ödemeyi kendi sisteminizde başarılı olarak işleyemeyeceksiniz. Çünkü almanız gereken response bilgisini alamadınız.

IPN bildirimi response den farklı olarak, asenkron olarak çalışır. Bu yapıda IPN, siz başarılı olarak bu sipariş bildirimini aldım yanıtını verene kadar bildirim göndermeyi sürdürür. Bu yanıtının nasıl verileceği hususu teknik bir konu olduğu için şimdilik o konuya girmeyeceğim. IPN entegrasyonu uygulaması ile ilgili farklı bir yazımda ayrıca bu konuya değineceğim.

IPN servisi, sisteminizden başarılı yanıt alamadığı sürece sonsuza dek bildirim göndermeyi sürdürecektir. Adeta bir bombardımana tutar gibi defalarca göndermeyi sürdürecektir. Bu yönüyle biraz yüzsüz bir servis olduğunu söyleyebilirim. Aynı kapıyı defalarca aşındırmaktadır. 🙂

Eğer PayU sistemi ile kendi yazılım tarafınızda özellikle mutabakat sorunları yaşıyor iseniz, PayU’da başarılı görünen bir sipariş sizin tarafınızda başarısız görünüyorsa, yazılımcızla görüşerek mutlaka IPN servisini aktif etmesini isteyiniz. Emin olun başınız ağrımayacaktır.

Aşağıdaki görseli birçoğunuz bilir. Veresiye veren ile peşin çalışan arasındaki farkı anlatır. Ben bu görseli biraz değiştirdim. IPN kullanan ve IPN kullanmayan arasındaki fark. Tercih sizin 🙂

IPN

IPN servisinin neden gerekli olduğunu paylaştıktan sonra, dilerseniz şimdi IPN kurulumunun nasıl yapılacağını görelim;

Konu ile ilgili hazırladığım makaleye buradan ulaşabilirsiniz.

 

PayU Ortak Ödeme Sayfası İndirim Uygulaması

PayU ortak ödeme sayfası entegrasyonunda, indirim, hediye çeki vs. opsiyonları gerçekleştirmek için herhangi bir parametre kullanılmıyor. Peki ortak ödeme sayfasında indirim yapmak isterseniz, nasıl bir uygulama yapmanız gerekiyor ? Bu yazımda sizlerle indirim uygulamasının nasıl yapılacağını paylaşacağım.

Ortak ödeme sayfasında indirim uygulaması yapmak için, indirim miktarını negatif tutarlı bir ürün gibi gönderebilirsiniz.

Bu şekilde yapmanız durumunda göndermiş olduğunuz bu negatif tutarlı ürün, ödeme sayfasında sepet toplamına indirim olarak yansıyacaktır. Aşağıdaki ekran  görüntüsünü inceleyebilirsiniz.

ortak ödeme sayfası indirim

Göndermeniz gereken
form alanları aşağıdaki gibidir.

<input type=”hidden” name=”ORDER_PNAME[0]” value=”Cd player”>

<input type=”hidden” name=”ORDER_PCODE[0]” value=”cdplayer”>

<input type=”hidden” name=”ORDER_PINFO[0]” value=”cdplayer”>

<input type=”hidden” name=”ORDER_PRICE[0]” value=”10″>

<input type=”hidden” name=”ORDER_QTY[0]” value=”1″>

<input type=”hidden” name=”ORDER_VAT[0]” value=”18″>

<input type=”hidden” name=”ORDER_PRICE_TYPE[0]” value=”NET”>

<input type=”hidden” name=”LU_COMPLEX_PDISCOUNT_PERC[0]” value=””>

<input type=”hidden” name=”ORDER_PNAME[1]” value=”Discount 10%”>

<input type=”hidden” name=”ORDER_PCODE[1]” value=”DISCOUNT”>

<input type=”hidden” name=”ORDER_PINFO[1]” value=”discount information”>

<input type=”hidden” name=”ORDER_PRICE[1]” value=”-3.20″>

<input type=”hidden” name=”ORDER_QTY[1]” value=”1″>

<input type=”hidden” name=”ORDER_VAT[1]” value=”18″>

<input type=”hidden” name=”ORDER_PRICE_TYPE[1]” value=”NET”>

<input type=”hidden” name=”LU_COMPLEX_PDISCOUNT_PERC[1]” value=””>

 

Burada <input type=”hidden” name=”ORDER_PCODE[1]” value=”DISCOUNT”> satırına dikkat ediniz. İndirim için ORDER_PCODE=DISCOUNT olmalıdır.

PayU Havale İle Ödeme Entegrasyonu

Ödeme  sistemleri tarafında, kullanıcıların tüm gereksinimlerine cevap verebilmeyi amaç edinen PayU, bir süre önce kullanıcılarına, havale ile ödeme alabilme imkanı da sunmaya başladı.

Havale ile ödeme servisi ile, PayU kullanıcıları kredi kartı ve banka kartına bağlı kalmaksızın, müşterilerinden havale yolu ile ödeme alabilecek ve aynı şekilde tüm bu ödemeleri tek kullanıcı panelinden kontrol edebilecektir. Bunun yanında PayU’nun sağlamış olduğu diğer katma değerli servislerden yararlanabilecektir.

Nasıl aktif ederim ? 

Hali hazırda bir PayU kullanıcısı iseniz, ilgili hesap yöneticinizle iletişime geçerek, havale ile ödeme servisinden faydalanmak istediğinizi belirtiniz. Gerekli aktivasyon işlemleri > tamamlandıktan sonra, havale ile ödeme servisini sisteminize entegre edebilirsiniz.

Sistem Nasıl İşliyor ?

  • Kullanıclar, ödeme sayfasında havale ile ödeme seçeneğini seçer ve ilgili tutarı, referans numarası belirterek PayU hesaplarına transfer eder.
    PayU-Havale-Eft-İle-ÖdemePayU-Havale-Eft-İle-Ödeme
  • PayU, bu transferi onaylar ve iş yeri paneline siparişi yansıtır. Aynı zamanda IPN servisi ile de iş yeri tarafına bildirim yapar.
  • PayU, işyerine belirlenen takvime göre ödemeyi yapar.
  • Siparişin iptal ya da iade edilmesi durumunda, iş yeri iadeyi kontrol panelinden gerçekleştirir ve PayU, ilgili tutarı müşterinin hesabına iade eder.

Nasıl entegre edebilirim ?

Yukarıda anlattıklarımdan farklı olarak, bu kısımda işin teknik boyutuna değinerek entegrasyonun uygulama safhasını açıklamaya çalışacağım.

Öncelikle, havale ile ödeme entegrasyonu yapabilmek için, Automatic Live Update yani site içi ödeme modelini kullanıyor olmanız gerekmektedir. Ortak ödeme sayfası kullanıyor iseniz, havale ile ödeme entegrasyonu şu aşamada gerçekleştirilememektedir. Bunun yanında IPN servisi kullanıyor olmanızda, siparişlerin kendi yazılım tarafınıza sağlıklı bir şekilde işlenebilmesi açısından bir gerekliliktir.

Gelelim api modelinde entegrasyonun nasıl gerçekleştirileceğine;

Bu noktada Alu entegrasyonunun nasıl yapıldığına değinmeyeceğim. İhtiyaç duymanız halinde, buradan entegrasyon dokümanını inceleyebilirsiniz.

Havale ile ödeme entegrasyonu için, dilerseniz örnek bir request üzerinden ilerleyelim. Bu şekilde alu entegrasyonunu birkaç modifiye ile havale ile ödeme alabilecek şekle getirebilirsiniz.

Aşağıdaki örnek havale ile ödeme isteğini inceleyebilirsiniz.

Array
(
    [BACK_REF] =
    [BILL_ADDRESS] =Billing address
    [BILL_ADDRESS2] =Billing address 
    [BILL_CITY] =City
    [BILL_COUNTRYCODE] =TR
    [BILL_EMAIL] =deneme@payu.com.tr
    [BILL_FAX] =4543958674234
    [BILL_FNAME] =test
    [BILL_LNAME] =test
    [BILL_PHONE] =4543958674234
    [BILL_STATE] =State / Dept.
    [BILL_ZIPCODE] =12345234
    [CLIENT_IP] =127.0.0.1
    [DELIVERY_ADDRESS] =Delivery Address
    [DELIVERY_ADDRESS2] =Delivery Address
    [DELIVERY_CITY] =City
    [DELIVERY_COMPANY] =Company Name
    [DELIVERY_COUNTRYCODE] =TR
    [DELIVERY_EMAIL] =deneme@payu.com.tr
    [DELIVERY_FNAME] =test
    [DELIVERY_LNAME] =test
    [DELIVERY_PHONE] =454395867
    [DELIVERY_STATE] =State / Dept.
    [DELIVERY_ZIPCODE] =12345
    [LANGUAGE] =TR
    [MERCHANT] =OPU_TEST
    [ORDER_DATE] =2015-06-30 08:43:50
    [ORDER_PCODE[0]] =T234435
    [ORDER_PINFO[0]] =Ürün bilgisi 1
    [ORDER_PNAME[0]] =Ürün1
    [ORDER_PRICE[0]] =10
    [ORDER_QTY[0]] =1
    [ORDER_REF] =30973
    [ORDER_SHIPPING] =0
    [ORDER_VAT[0]] =0
    [PAY_METHOD] =WIRE
    [PRICES_CURRENCY] =TRY
)

Yukarıdaki örnek istekte, standart bir kredi kartı ile ödeme isteğinden farklı olarak, PAY_METHOD değişkeni “WIRE” olarak gönderilmiş ve kredi kartı bilgilerini içeren parametreler (CC_NUMBER, EXP_MONTH, EXP_YEAR) vs. requeste dahil edilmemiştir.

Tüm bu bilgilerle, PayU sistemine başarılı bir havale isteği gönderdiğinizde, sistem banka hesap bilgilerinin de yer aldığı aşağıdaki gibi bir bir response dönecektir.

Bu aşamada yapmanız gereken, banka bilgilerini müşteriye yansıtarak herhangi birine ilgili tutarı transfer etmesini istemek. Ayrıca transfer işlemini gerçekleştirirken refno parametresi ile size bildirilen referans numarasını açıklama olarak girmesini talep ediniz.

Kullanıcı transferi gerçekleştirdikten sonra, PayU ödemeyi kontrol edecek ve üye iş yeri panelinize “Tamamlandı” olarak siparişi yansıtacaktır. Tamamlandı ibaresini gördüğünüz sipariş için müşteriye ürün ve hizmet gönderiminde bulunabilirsiniz.

<epayment>
<refno>6616861</refno>
<alias>97052b3756423218a892b40bbc6eac33</alias>
<status>SUCCESS</status>
<return_code>PENDING_AUTHORIZATION</return_code>
<return_message>Order saved and pending authorization.</return_message>
<date>2015-07-06 09:53:54</date>
<order_ref>16157</order_ref>
<auth_code></auth_code>
<rrn></rrn>
<wire_accounts>
<item>
<bank_identifier>TURKIYE GARANTI BANKASI, A.S.</bank_identifier>
<bank_account>TR520006200002800006296206</bank_account>
<routing_number></routing_number>
<iban_account></iban_account>
<bank_swift>TGBATRISXXX</bank_swift>
<country>Turkey</country>
<wire_recipient_name>PayU Ödeme Kuruluşu AŞ</wire_recipient_name>
<wire_recipient_vat_id>0550442060</wire_recipient_vat_id>
</item>
<item>
<bank_identifier>IS BANK</bank_identifier>
<bank_account>TR770006400000110111847674</bank_account>
<routing_number></routing_number>
<iban_account>TR770006400000110111847674</iban_account>
<bank_swift>ISBKTRIS</bank_swift>
<country>Turkey</country>
<wire_recipient_name>PayU Ödeme Kuruluşu AŞ</wire_recipient_name>
<wire_recipient_vat_id>0550442060</wire_recipient_vat_id>
</item>
<item>
<bank_identifier>AKBANK</bank_identifier>
<bank_account>TR840004600171888000098912</bank_account>
<routing_number></routing_number>
<iban_account>TR840004600171888000098912</iban_account>
<bank_swift>AKBKTRIS</bank_swift>
<country>Turkey</country>
<wire_recipient_name>PayU Ödeme Kuruluşu AŞ</wire_recipient_name>
<wire_recipient_vat_id>0550442060</wire_recipient_vat_id>
</item>
<item>
<bank_identifier>DENIZ BANK</bank_identifier>
<bank_account>TR870013400000577316300009</bank_account>
<routing_number></routing_number>
<iban_account>TR870013400000577316300009</iban_account>
<bank_swift>DENITRIS</bank_swift>
<country>Turkey</country>
<wire_recipient_name>PayU Ödeme Kuruluşu AŞ</wire_recipient_name>
<wire_recipient_vat_id>0550442060</wire_recipient_vat_id>
</item>
<item>
<bank_identifier>FINANSBANK</bank_identifier>
<bank_account>TR680011100000000056754760</bank_account>
<routing_number></routing_number>
<iban_account>TR680011100000000056754760</iban_account>
<bank_swift>FNNBTRIS </bank_swift>
<country>Turkey</country>
<wire_recipient_name>PayU Ödeme Kuruluşu AŞ</wire_recipient_name>
<wire_recipient_vat_id>0550442060</wire_recipient_vat_id>
</item>
<item>
<bank_identifier>Bank Asya</bank_identifier>
<bank_account>TR740020800039037392350007</bank_account>
<routing_number></routing_number>
<iban_account>TR740020800039037392350007</iban_account>
<bank_swift>ASYATRIS</bank_swift>
<country>Turkey</country>
<wire_recipient_name>PayU Ödeme Kuruluşu AŞ</wire_recipient_name>
<wire_recipient_vat_id>0550442060</wire_recipient_vat_id>
</item>
<item>
<bank_identifier>YAPI KREDI BANKASI</bank_identifier>
<bank_account>TR440006701000000043710707</bank_account>
<routing_number></routing_number>
<iban_account>TR440006701000000043710707</iban_account>
<bank_swift>YAPITRISFEX</bank_swift>
<country>Turkey</country>
<wire_recipient_name>PayU Ödeme Kuruluşu AŞ</wire_recipient_name>
<wire_recipient_vat_id>0550442060</wire_recipient_vat_id>
</item>
<item>
<bank_identifier>TURK EKONOMI BANKASI</bank_identifier>
<bank_account>TR070003200000000030539275</bank_account>
<routing_number></routing_number>
<iban_account>TR070003200000000030539275</iban_account>
<bank_swift>TEBUTRIS</bank_swift>
<country>Turkey</country>
<wire_recipient_name>PayU Ödeme Kuruluşu AŞ</wire_recipient_name>
<wire_recipient_vat_id>0550442060</wire_recipient_vat_id>
</item>
</wire_accounts>
<hash>752d0e316ccc4bba0d6e585f6c0cf802</hash>
</epayment>

Nedir Bu ? “Hash Mistmatch”

PayU entegrasyonu üzerinde çalışan bir çok kişinin, belki de en çok takıldığı ve çözümü noktasında zorlandığı konulardan biri hash problemi. Bu yazımda, hash sorununa açıklık getirmeye çalışacağım.

Hash hesaplamasının ne olduğunu, bir  şekilde sanal pos entegrasyonu ile uğraşan yazılımcılar biliyordur. Ancak, bilmeyenler için öncelikle hashin ne olduğunu açıklamaya çalışacağım.

Hash bir güvenlik doğrulamasıdır. Verilerin her iki uçta (PayU sunucuları ve Sunucularınız) arasında güvenli bir şekilde taşınmasını sağlar. Şöyle ki, ödeme talebi PayU sunularına gönderilirken, “674161a50fb8e2800403297a4af2cc14” gibi şifreli bir hash değeri ile  birlikte gönderilir. Aynı şekilde PayU sunucuları tarafında da bir hash değeri oluşturulur. Burada önemli olan nokta sizin oluşturduğunuz hash değeri ile PayU tarafında oluşturulan hash değerinin birebir eşleşmesidir. Aksi durumda HASH_MISTMATCH  (hash uyuşmazlığı) hatası meydana gelir.

Hash hesaplamasının nasıl yapılacağı yazılımcıları ilgilendiren teknik bir konudur.  Bunun yanında, bu hata multifaktöriyel yani birden çok kritere bağlı olarak gelişebilmektedir. Hash hesaplaması, hash hesabına dahil edilen parametreler, parametrelerin alabileceği uygun değerler, parametrelerin sıralaması, encoding, kullanılan hash fonksiyonu gibi bir çok kritere bağlı kalınarak hesaplanmaktadır.

Hash hesaplaması sırasında takılan yazılımcılara önerim;

Bir şekilde hash mistmach hatası ile karşılaşırsanız, öncelikle göndermiş olduğunuz requesti gözden geçiriniz. Olması gereken tüm parametreleri eklediniz mi ? Parametreler alfabetik olarak sıralanmış mı ? Encoding UTF-8 olarak mı düzenlenmiş ? Secret key doğru olarak girilmiş mi ?

Yukarıda belirttiğim sorular, hash hesaplama sırasında en çok hata yapılan hususlardan oluşuyor. Bu soruların cevabı evet ise, %70 ihtimalle hash  problemini çözdünüz demektir. 🙂

Bu kısım biraz daha teknik ağırlıklı oldu. Şüphesiz yukarıdaki açıklamaların hiçbir anlam ifade etmediği, karşılaştığı sorun karşısında çaresiz çözüm arayan sanal pos kullanıcıları var. Onlara önerim, sisteminizde bir sipariş sırasında hash mistmach hatası alırsanız, mutlaka yazılımcınıza ulaşarak entegrasyon yapısını kontrol etmesini isteyiniz.

Hash hesaplamasının nasıl yapılacağı ile ilgili detayları, sonraki yazılarımda ayrıca detaylıca paylaşacağım.

 

Live Update (Ortak Ödeme Sayfası) Entegrasyonu

Live Update (Ortak Ödeme Sayfası), kullanıcıların ödeme adımında PayU tarafından tasarlanan ödeme sayfasına yönlendirilerek, ödeme yapmalarını mümkün kılar.

Temel olarak, ödeme bilgileri içeren bir isteğin, https://secure.payu.com.tr/order/lu.php adresine HTTP POST metodu ile  gönderilmesi ile çalışmaktadır. Bu istek, PayU’nun beklediği formata uygun olması durumunda, kullanıcı kart bilgilerini girerek ödemeyi onaylayacağı ödeme sayfasına yönlendirilir.

Şimdi dilerseniz bu isteğin nasıl oluşturulacağını adım adım inceleyelim.

Öncelikle, gönderilmesi gereken parametreler aşağıdaki gibidir.

MERCHANT: Üye iş yeri için, PayU tarafından tanımlanan işyeri kimliğidir. Bir nevi takma isim (nick name) gibi düşünebilirsiniz.
BACK_REF: Ödeme işlemi sonrası, kullanıcının üye iş yeri web sitesine geri gönderileceği url adresini ifade eder. Ödemeniz onaylandı ya da bir teşekkür sayfası gibi.
ORDER_REF:Siparişin üye iş yeri  tarafında görünen referans numarasıdır. Bu alan PayU sisteminde  harici referans numarası olarak kayıt edilir. Harf ya da sayısal veriler içerebilir.
ORDER_DATE:Siparişin oluşturulma tarihi. (YYYY-AA-GG SS:DD:SS biçiminde olmalıdır. örneğin: “2015-07-01 14:15:45”)
ORDER_PNAME[]: Ürün ismi (155 karakter maksimum)
ORDER_PCODE[]:Ürün kodu bilgisi
ORDER_PINFO[]:Ürün bilgisi,(ürün özellikleri,ekstra bilgiler vs.)
ORDER_PRICE[]:Ürün fiyatı
ORDER_PRICE_TYPE[]:Kdv türünü belirler. Alabileceği değerler “GROSS” Kdv dahil ya da “NET” Kdv hariç şeklindedir. Parametre gönderilmemesi durumunda, varsayılan olarak, “NET” şeklinde değerlendirilecektir.
ORDER_QTY[]: Her bir ürünün adet bilgisi
ORDER_VAT[]: Her bir ürünün Kdv oranı (2-8-24) gibi sadece kdv oranı yazılmalıdır. % ifadesine gerek yoktur.
ORDER_SHIPPING: Kargo ücreti ve diğer gönderim masrafları
PRICES_CURRENCY: Para birimi (TL için “TRY”)
BILL_FNAME: Müşteri adı
BILL_LNAME: Müşteri Soyadı
BILL_EMAIL:  Müşteri e-posta adresi

Previous Posts Next Posts