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.
13 yorum
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
Bir sitede bu kodları kullanabilmeniz için lisans satınalmanız gerekli diyor. sizin yaptığınız örnektede böyle birşeye gerek varmı.
Payu.com.tr ye başvurduktan ve kullanıcı bilgilerinizi aldıktan sonra benim verdiğim kodları kullanıyorsunuz.
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. : )
ASP için örnek bulma şansımız var mı? Teşekkürler
Şu sitede ASP ile yapılmış örnek var :
http://www.payuentegrasyonum.com/asp-payu-entegrasyonu-ornek-kod
merhaba, bu kodları indirebileceğimiz bir link var mıdır.
payu web sitesinde dökümanlar vardır.
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?
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.
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?
SSL sertifikası kurmanızı istiyor sistem. Güvenli bağlantı olması gerkeiyor.
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.