Здравейте
Опитвам се да направя електронен магазин, който позволява разплащане чрез 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.Наместете и адреса на картинката на бутона за плащане. Коригирайте го според вашите нужди и сте готови.