ASP.NET PayU Entegrasyonu

PayU eticaret sitelerinin ödeme sistemlerinde kullanılmak üzere hayata geçirilmiş bir proje ve birçok eticaret sitesinde kullanılmakta. Birkaç bankanın kredi kartına taksit yapabilme imkanı sunuyor. Normal şartlarda her banka sanal posu için ayrı ayrı başvuru yapıp ayrı ayrı para ödemeniz gerekiyor. PayU sayesinde tüm bankalara başvurmanıza gerek kalmıyor. Tek çekim komisyonu biraz yüksek olsa da birden fazla kredi kartına taksit yapabileceğiniz için tercih edilebilir. Aşağıdaki kodları kullanarak sitenize entegre edebilirsiniz.
Asp.net payu entegrasyonu için aşağıdaki adımları takip edin.
Öncelikle aşağıdaki kodları head tagları arasına ekleyelim.

<script src="https://secure.payu.com.tr/openpayu/v2/client/json2.js" type="text/javascript"></script>
<script src="https://secure.payu.com.tr/openpayu/v2/client/openpayu-2.0.js" type="text/javascript"></script>
<script src="https://secure.payu.com.tr/openpayu/v2/client/plugin-payment-2.0.js" type="text/javascript"></script>
<script src="https://secure.payu.com.tr/openpayu/v2/client/plugin-installment-2.0.js" type="text/javascript"></script>
<!-- Style class for preloader -->
<link rel="stylesheet" type="text/css" href="https://secure.payu.com.tr/openpayu/v2/client/openpayu-builder-2.0.css" />

 

Kredi kartı formu için aşağıdaki kodları kullanıyoruz. id’leri değiştirmeden stilleri kendinize göre düzenleyebilirsiniz.

<table class="kredi">
<tbody>
<tr>
<td align="right" class="style6">Kart Sahibinin Adı :</td>
<td>
<div id="payu-card-cardholder-placeholder" class="card"></div></td>
</tr>
<tr>
<td align="right" class="style6">Kart Numarası :</td>
<td>
<div id="payu-card-number-placeholder" class="card"></div></td>
</tr>
<tr>
<td align="right" class="style6">Son Kullanma Tarihi :</td>
<td><select id="payu-card-expm" class="lipres-drop-down-list-date"><option value="01">01</option><option value="02">02</option><option value="03">03</option><option value="04">04</option><option value="05">05</option><option value="06">06</option><option value="07">07</option><option value="08">08</option><option value="09">09</option><option value="10">10</option><option value="11">11</option><option value="12">12</option></select><select id="payu-card-expy" class="lipres-drop-down-list-date"><option value="2012">2012</option><option value="2013">2013</option><option value="2014">2014</option><option value="2015">2015</option><option value="2016">2016</option><option value="2017">2017</option><option value="2018">2018</option><option value="2019">2019</option><option value="2020">2020</option><option value="2021">2021</option><option value="2022">2022</option><option value="2023">2023</option></select></td>
</tr>
<tr>
<td align="right" class="style6">CVV2 :</td>
<td>
<div id="payu-card-cvv-placeholder" class="card"></div>
<span><a href="#cvv2" rel="facebox">CVV2 Nedir ?</a></span></td>
</tr>
<tr>
<td align="right" class="style6">Taksit :</td>
<td> <asp:radiobuttonlist id="rblTaksit" runat="server" clientidmode="Static" repeatlayout="UnorderedList">
</asp:radiobuttonlist></td>
</tr>
<tr>
<td class="style6"></td>
<td></td>
</tr>
</tbody>
</table>

 
Javascript kodları

<script type="text/javascript">// <![CDATA[
$(function () {
//**********************************************************
//installment setup
//**********************************************************
//used to control some stuff when card program is change
OpenPayU.Installment.onCardChange(function (data) { //optional
//data.program - Axess, Bonus, Maximum, Advantage, CardFinans, World
$('#card-program').html(JSON.stringify(data.program));
});
//**********************************************************
//payment setup
//**********************************************************
OpenPayU.Payment.setup({ id_account: "IDBURAYA", orderCreateRequestUrl: "AjaxIslemlerServisi.asmx/PayuPay" });
$('#payu-cc-form-submit').click(function () {
$("#payu-card-installment").val($('#rblTaksit li input:checked').val());
//add preloader
OpenPayU.Builder.addPreloader('Lütfen Bekleyin ... ');
//**********************************************************
//begin payment
// Bu bölümde arkada siparişde oluşturuyorsak eğer ek bilgileride buradan gönderebiliriz.Bu bilgiler opsiyonel göndermesenizde sorun oluşturmaz. //**********************************************************
//Req_Id, First_Name, Last_Name, Email, PhoneNumber
OpenPayU.Payment.create({
//merchant can send to his server side script other additional data from page. (OPTIONAL)
orderCreateRequestData: {
First_Name: $('#txtAd').val()
}
}, function (response) {
//update buyer experience
if (response.Status.StatusCode == 'OPENPAYU_SUCCESS') {
alert('Success');
$("#lblOdemeSonucu").val(JSON.stringify(response));
var btn = document.getElementById("btnSiparisiOnayla");
if (btn) btn.click();
} else {
alert('Bir hata oluştu.Lütfen kart bilgilerinizi kontrol edin.');
$("#lblOdemeSonucu").val(JSON.stringify(response));
//remove preloader OpenPayU.Builder.removePreloader();
//$('#error').html(response.status + '\n' + JSON.stringify(response) );
}
return false;
});
return false;
});
} ());
// ]]></script>

 
 
Daha sonra AjaxIslemlerServisi.asmx adından bir web servisi ekliyoruz projemize ve bunun içine payupay adında bir fonksiyon ekliyoruz.

[WebMethod(true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void PayuPay(string First_Name)
{
PayuClass pc = new PayuClass();
string sonuc = pc.PayuPay();
Context.Response.Clear();
Context.Response.ContentType = "application/json";
Context.Response.AddHeader("content-disposition", "attachment; filename=export.json");
Context.Response.AddHeader("content-length", sonuc.Length.ToString());
Context.Response.Flush();
Context.Response.Write(sonuc);
//return sonuc;
}

 
PayU Class için aşağıdaki kodları kullanıyoruz

public class PayuClass
{
public string signature = "SignatureBuraya";
public string pos_id = "PosIdBuraya"; // merchant account id
public string hashsign = "";
public PayuClass()
{
//
// TODO: Add constructor logic here
//
}
public string PayuPay(string Req_Id, string First_Name)
{
string Last_Name = "Abuzer";
string Email="abuzer@musteriemail.com";
string PhoneNumber="000000000";
int Taksit=1;
string post_data = GenerateXml(Req_Id, First_Name, Last_Name, Email, PhoneNumber, Taksit);
hashsign = ComputeHash(post_data+signature,new SHA256CryptoServiceProvider());
var sonuc_xml = HttpPost("https://secure.payu.com.tr/openpayu/v2/order.xml","DOCUMENT="+HttpContext.Current.Server.UrlEncode(post_data));
// Convert XML to a JSON string
XmlDocument doc = new XmlDocument();
doc.LoadXml(sonuc_xml);
string JSON = ConvertJson.XmlToJSON(doc);
// Replace \ with \\ because string is being decoded twice
JSON = JSON.Replace(@"\", @"\\");
return JSON;
}
//Payu xml i oluşturur
private string GenerateXml(string Req_Id, string First_Name, string Last_Name, string Email, string PhoneNumber, int Taksit)
{
string xml = @"<!--?xml version=""1.0"" encoding=""UTF-8""?--><openpayu xmlns="" http:="" www="" openpayu="" com="" xsd=""><ordercreaterequest> <reqid>{0}</reqid><customerip>{1}</customerip><extorderid>{2}</extorderid><merchantposid>{13}</merchantposid><description>{3}</description><currencycode>{4}</currencycode><totalamount>{5}</totalamount><buyer><firstname>{6}</firstname><lastname>{7}</lastname><countrycode>{8}</countrycode><email>{9}</email><phonenumber>{10}</phonenumber><language>{11}</language></buyer><products>{12}</products><paymethod>DEFAULT</paymethod></ordercreaterequest></openpayu>";
string tutar = 300; // Buraya sepet tutarı ne kadarsa bunu yazabilirsiniz fakat payu ödemeyi yaparken bu tutarı değil GenerateProductXml ile ürettiğiniz ürünlerin toplamını dikkate alıyor
//yani buraya verdiğiniz değeri kendi sisteminize kaydetmek için kullanabilirsiniz.
xml = String.Format(xml, Req_Id, HttpContext.Current.Request.UserHostAddress, "1520", "AZ", "TRY", tutar, First_Name, Last_Name, "tr", Email, PhoneNumber, "tr", GenerateProductXml(), pos_id);
return xml;
}
private string GenerateProductXml()
{
//Burada sepetteki ürünleri liste olarak getiren metodumuz var
var UrunListesi = dbx.UrunleriGetir();
string urunxml = "";
int cek_indirimi = 10;
string kargo_ucreti = 5;
foreach (SepetUrun surun in UrunListesi)
{
urunxml += String.Format(@"<product><name>{0}</name><unitprice>{1}</unitprice><quantity>{2}</quantity></product>", surun.Urun_Adi, surun.birim_fiyat.ToString().Replace(",", "."), surun.adet);
}
urunxml += String.Format(@"<product><name>{0}</name><unitprice>{1}</unitprice><quantity>{2}</quantity></product>", "Kargo Ücreti -", kargo_ucreti.ToString().Replace(",", "."), "1");
if (cek_indirimi > 0)
{
// - değerler göndererek fiyattan indirim yaptırabiliyoruz.Hediye Çeki Gibi
urunxml += String.Format(@"<product><name>{0}</name><unitprice>{1}</unitprice><quantity>{2}</quantity></product>", "Çek İndirimi -","-"+ cek_indirimi.ToString().Replace(",", "."), "1");
}
return urunxml;
}
private string HttpPost(string url, string post_data)
{
var req = System.Net.WebRequest.Create(url);
req.ContentType = "application/x-www-form-urlencoded";
req.Headers.Add("OpenPayu-Signature:sender="+pos_id+";signature=" + hashsign + ";algorithm=SHA256;content=DOCUMENT");
req.Method = "POST";
byte[] bytes = Encoding.UTF8.GetBytes(post_data);
req.ContentLength = bytes.Length;
System.IO.Stream os = req.GetRequestStream();
os.Write(bytes, 0, bytes.Length);
os.Close();
System.Net.WebResponse resp = req.GetResponse();
if (resp == null)
return null;
var sr = new StreamReader(resp.GetResponseStream());
return sr.ReadToEnd().Trim();
}
public string ComputeHash(string input, HashAlgorithm algorithm)
{
Byte[] inputBytes = Encoding.UTF8.GetBytes(input);
Byte[] hashedBytes = algorithm.ComputeHash(inputBytes);
return BitConverter.ToString(hashedBytes).Replace("-","").ToLower();
}

 
Ve son olarak convert json class’ı

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Xml;
using System.Collections;
///
/// Summary description for ConvertJson
///
public class ConvertJson
{
public ConvertJson()
{
//
// TODO: Add constructor logic here
//
}
public static string XmlToJSON(XmlDocument xmlDoc)
{
StringBuilder sbJSON = new StringBuilder();
//sbJSON.Append("{ ");
XmlToJSONnode(sbJSON, xmlDoc.DocumentElement, false);
//sbJSON.Append("}");
return sbJSON.ToString();
}
// XmlToJSONnode: Output an XmlElement, possibly as part of a higher array
private static void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName)
{
if (showNodeName)
sbJSON.Append("\"" + SafeJSON(node.Name) + "\": ");
sbJSON.Append("{");
// Build a sorted list of key-value pairs
// where key is case-sensitive nodeName
// value is an ArrayList of string or XmlElement
// so that we know whether the nodeName is an array or not.
SortedList childNodeNames = new SortedList();
// Add in all node attributes
if (node.Attributes != null)
foreach (XmlAttribute attr in node.Attributes)
StoreChildNode(childNodeNames, attr.Name, attr.InnerText);
// Add in all nodes
foreach (XmlNode cnode in node.ChildNodes)
{
if (cnode is XmlText)
StoreChildNode(childNodeNames, "value", cnode.InnerText);
else if (cnode is XmlElement)
StoreChildNode(childNodeNames, cnode.Name, cnode);
}
// Now output all stored info
foreach (string childname in childNodeNames.Keys)
{
ArrayList alChild = (ArrayList)childNodeNames[childname];
if (alChild.Count == 1)
OutputNode(childname, alChild[0], sbJSON, true);
else
{
sbJSON.Append(" \"" + SafeJSON(childname) + "\": [ ");
foreach (object Child in alChild)
OutputNode(childname, Child, sbJSON, false);
sbJSON.Remove(sbJSON.Length - 2, 2);
sbJSON.Append(" ], ");
}
}
sbJSON.Remove(sbJSON.Length - 2, 2);
sbJSON.Append(" }");
}
// StoreChildNode: Store data associated with each nodeName
// so that we know whether the nodeName is an array or not.
private static void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue)
{
// Pre-process contraction of XmlElement-s
if (nodeValue is XmlElement)
{
// Convert <aa></aa> into "aa":null
// <aa>xx</aa> into "aa":"xx"
XmlNode cnode = (XmlNode)nodeValue;
if (cnode.Attributes.Count == 0)
{
XmlNodeList children = cnode.ChildNodes;
if (children.Count == 0)
nodeValue = null;
else if (children.Count == 1 && (children[0] is XmlText))
nodeValue = ((XmlText)(children[0])).InnerText;
}
}
// Add nodeValue to ArrayList associated with each nodeName
// If nodeName doesn't exist then add it
object oValuesAL = childNodeNames[nodeName];
ArrayList ValuesAL;
if (oValuesAL == null)
{
ValuesAL = new ArrayList();
childNodeNames[nodeName] = ValuesAL;
}
else
ValuesAL = (ArrayList)oValuesAL;
ValuesAL.Add(nodeValue);
}
private static void OutputNode(string childname, object alChild, StringBuilder sbJSON, bool showNodeName)
{
if (alChild == null)
{
if (showNodeName)
sbJSON.Append("\"" + SafeJSON(childname) + "\": ");
sbJSON.Append("null");
}
else if (alChild is string)
{
if (showNodeName)
sbJSON.Append("\"" + SafeJSON(childname) + "\": ");
string sChild = (string)alChild;
sChild = sChild.Trim();
sbJSON.Append("\"" + SafeJSON(sChild) + "\"");
}
else
XmlToJSONnode(sbJSON, (XmlElement)alChild, showNodeName);
sbJSON.Append(", ");
}
// Make a string safe for JSON
private static string SafeJSON(string sIn)
{
StringBuilder sbOut = new StringBuilder(sIn.Length);
foreach (char ch in sIn)
{
if (Char.IsControl(ch) || ch == '\'')
{
int ich = (int)ch;
sbOut.Append(@"\u" + ich.ToString("x4"));
continue;
}
else if (ch == '\"' || ch == '\\' || ch == '/')
{
sbOut.Append('\\');
}
sbOut.Append(ch);
}
return sbOut.ToString();
}
}

Kolay gelsin.
 

You may also like

13 yorum

  1. merhaba hocam ben
    string sonuc = pc.PayuPay(); hata alıyorum
    var UrunListesi = dbx.UrunleriGetir(); satırında
    dbx.UrunleriGetir() getirdiğiniz fonksiyonu yazabilirmisiniz yüzeysel olarak

  2. Bir sitede bu kodları kullanabilmeniz için lisans satınalmanız gerekli diyor. sizin yaptığınız örnektede böyle birşeye gerek varmı.

  3. Hocam emeğinize sağlık, Son aramam da denk geldiniz… Payu üyeliğini tamamladım Müşterimin… Böyle bir kaynak arıyordum. Umarım becerebiliriz. : )

  4. Merhaba,
    Bu ve internette varolan bunun gibi örneklerde ödeme işlemini kendi sitemizde yapıyoruz. Kodların en başında kredi kartı bilgileri için gereken html kodları var. Bir sitede bu şekilde değilde aynı paypal tarzı ürünid, tutar, fiyat vs bilgileri direk payu nun kendi sitesine post edip ödeme işlemlerini oraya bırakmışlar paypal mantığının aynısı. Kullanıcı kredi kartıyla ödeyeceğim seçeneğini seçip ödeme yap dediğinde direk bilgiler payuya post ediliyor ve gerisine biz karışmıyoruz sadece geri dönen değerleri alıp veritabanı işlemleri kalıyor. Bu şekilde daha güvenli ve sağlıklı geldi bana hemde az işlevli. Bunun için nasıl bir yol izlememiz gerektiğiyle ilgili bir bilginiz var mıdır?

    1. PayU nun paypal mantığı çalışan uygulaması da mevcut. Güvenlik olarak diğerinden farkı yok.Sonucta yine bilgiler payu’ya post olacak. PayU.com.tr de gerekli dökümanları bulabilirsiniz. Sayfanızda popup açtırıp ödeme yaptırabilirsiniz.
      kolay gelsin.

  5. The request was aborted: Could not create SSL/TLS secure channel hatası alıyorum kaç saattir çözemedim. hatayı çözmek için fikriniz var mıdır?

  6. merhaba, veritabanı fonksiyonlarında neler yaptığınızıda paylaşabilirmisiniz. paylaşımınız için çok teşekkür ederim, allah sizden razıolsun.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.