Постване да данни към EPay и PayPall

by mitkoka 28. Октомври 2008 08:35

Здравейте

Опитвам се да направя електронен магазин, който позволява разплащане чрез EPay и PayPal. Докато в PayPal има доста добро описане за това как трябва да бъде изградена системата,  в сайта на EPay това изобщо не е така. Има доста кратко описане как информацията се изпраща до сървъра и дадените примери са написъни на PHP и Perl. Аз като .Net програмист се опитвам да намеря решение на проблема и съвсем скоро ще го дам. Междувременно събрах доста информаця за това как точно става изпращането на данни от страница към сървър. Оказва се, че в ASP.NET не може да се използва action атрибута на Form тага. Затова за да се пренасочи постването на данни към друг сървър трябва да се напише някаква сървърна логика.

Ето как го направих:

 

  protected void Page_Load(object sender, EventArgs e)
        {
            ctlEPayForm.Text = _GetPaypalForm();
            String strJS = _GetPayPalPostJS("_xclick");
            ctlPostScript.Text = strJS;
        }

 ctlEPayForm и  ctlPostScript са LiteralControl-и.

 

       private String _GetPayPalPostJS(String strFormId)
        {
            StringBuilder strScript = new StringBuilder();
            strScript.Append("<script language='javascript'>");
            strScript.Append("var ctlForm = document.forms.namedItem('{0}');");
            strScript.Append("ctlForm.submit();");
            strScript.Append("</script>");
            return String.Format(strScript.ToString(), strFormId);
        }

        private String _GetPaypalForm()
        {
            StringBuilder strForm = new StringBuilder();

            strForm.Append("<form id=\"_xclick\" name=\"_xclick\" target=\"_blank\" action=\"https://www.Epay.bg\" method=\"post\">");
            strForm.AppendFormat("<input type=\"hidden\" name=\"{0}\" value=\"{1}\">", "PAGE", "paylogin");
            string encodedTo64 = EncodeTo64(GetPayRequest());
            strForm.AppendFormat("<input type=\"hidden\" name=\"{0}\" value=\"{1}\">", "ENCODED", encodedTo64);
            string encodedToEncodeHMACSHA1 = EncodeHMACSHA1(encodedTo64, "aaa");
            strForm.AppendFormat("<input type=\"hidden\" name=\"{0}\" value=\"{1}\">", "CHECKSUM", HttpUtility.UrlEncode("encodedToEncodeHMACSHA1"));
            strForm.AppendFormat("<input type=\"hidden\" name=\"{0}\" value=\"{1}\">", "URL_CANCEL", "Адрес при отказ от плащане");
            strForm.Append("<input type=\"image\" src=\"път до бутон" border=\"0\" name=\"submit\" alt=\"Текст до бутон\">");
            strForm.Append("</form>");
            return strForm.ToString();
        }

 

Идеята е да се ремдира втори form елемент, който да направи постването на данните.Ето и функциите за кодиране на заявката към EPay:

        private string EncodeHMACSHA1(string message,string key)
        {
            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
            byte[] keyByte = encoding.GetBytes(key);
            HMACSHA1 hmacsha1 = new HMACSHA1(keyByte);
            byte[] messageBytes = encoding.GetBytes(message); 
            byte[] hashmessage = hmacsha1.ComputeHash(messageBytes);
            string result = ByteToString(hashmessage);
            return result;
        }

        private string ByteToString(byte[] buff)
        {
            string sbinary = string.Empty;
            for (int i = 0; i < buff.Length; i++)
            {
                sbinary += buff[i].ToString("X2"); // hex format
            }
            return (sbinary);
        }

        private string EncodeTo64(string toEncode)
        {
            byte[] toEncodeAsBytes
            = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
            string returnValue
            = System.Convert.ToBase64String(toEncodeAsBytes);
            return returnValue;
        }

 Това е кодиране е изискванене EPay. Следва да се подготви заявката за плащане.

 Ето и самата заявка:

        private string GetPayRequest()
        {
            string min = "SET_THIS_CORRECT";
            string email = "a@merch.bg";   
            string invoice = "34534525";
            string sum = "22.80";
            string exp_date = "01.08.2020";
            string descr = "Test";
           
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("MIN={0}", min);
            sb.AppendLine();
            sb.AppendFormat("EMAIL={0}", email);
            sb.AppendLine();
            sb.AppendFormat("INVOICE={0}", invoice);
            sb.AppendLine();
            sb.AppendFormat("AMOUNT={0}", sum);
            sb.AppendLine();
            sb.AppendFormat("TIME={0}", exp_date);
            sb.AppendLine();
            sb.AppendFormat("DESCR={0}", descr);

            return sb.ToString(); ;
        }

 

При натискане на бутона потребителят бива препратен към сайта на EPay, където извършва плащането и след това бива върнат обратно към сайта на търговеца.

И това е. Ако имате въпроси не се колебайте да се свържете с мен.Кодът е работещ само трябва да се добави още един ред към _GetPaypalForm() указващ пътя до сайта на търговеца при приключване на плащането.Може да бъде видян от сайта на EPay.Наместете и адреса на картинката на бутона за плащане. Коригирайте го според вашите нужди и сте готови.

 

Система за плащане с кредитни карти в интернет магазин

by mitkoka 23. Септември 2008 20:13

 Статията не довършена. За повече информация ви препоръчвам следният сайт:

http://www.west-wind.com/presentations/aspnetecommerce/aspnetecommerce.asp

като и страниците на EPay и PayPal.

До сега не съм видял български уеб магазин, който да позволява плащане чрез кредитни карти.Причините са извесни - най - вече сигурниста. Все пак се среща разплащане чрез PayPal,но не и директно с кредитни карти. Целта на тази публикация е да разясни как става интегрирането на сигурна системa за разплащане, която не е базирана на paypal.com.

Вероятно малко уеб сайтове биха използвали такава система поне за сега. По голямата част от плащанията стават чрез наложен платеж, защото тук риска от кражба на данни не съществува. Така или иначе смятам, че скоро все повече клиенти ще са склонни да плащат по различен начин, а именно чрез сметките си в PayPal или EPay или директно чрез кредитната си карта.

Нека първо да разгледаме разплащането чрез системата PayPal.

При плащането чрез PayPal платецът не предоставя номер на кредитна карта на търговеца.