PayPal подтверждает неудачу с недействительным - PullRequest
1 голос
/ 03 января 2012

Я пытаюсь настроить PayPal Ipn, и он не проходит проверку некоторых заказов. Я обнаружил, что произойдет сбой, если имя пользователя содержит несколько нестандартных букв, таких как &last_name=Montalvo Agüera Нужно ли менять кодировку?

var request = "cmd=_notify-validate&.......";

const string strLive = "https://www.paypal.com/cgi-bin/webscr";
  var req = (HttpWebRequest)WebRequest.Create(strLive);
            //Set values for the request back
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";

            req.ContentLength = request.Length;

            var streamOut = new StreamWriter(req.GetRequestStream(), Encoding.ASCII);
            streamOut.Write(request);
            streamOut.Close();
            var streamIn = new StreamReader(req.GetResponse().GetResponseStream());
            var strResponse = streamIn.ReadToEnd();
            streamIn.Close();

            Response.Write(strResponse);

Ответы [ 2 ]

0 голосов
/ 03 января 2012

Вы можете попробовать это так:

string strLive = "https://www.paypal.com/cgi-bin/webscr";
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strLive);

        //Set values for the request back
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
        byte[] param = Request.BinaryRead(HttpContext.Current.Request.ContentLength);
        string strRequest = Encoding.ASCII.GetString(param);
        strRequest += "&cmd=_notify-validate";
        req.ContentLength = strRequest.Length;

        //for proxy
        //WebProxy proxy = new WebProxy(new Uri("http://url:port#"));
        //req.Proxy = proxy;

        //Send the request to PayPal and get the response
        StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);

Если это все еще не работает, попробуйте изменить кодировку на UTF8

0 голосов
/ 03 января 2012

Вам необходимо url-кодировать параметры. Вот что означает строка req.ContentType = "application/x-www-form-urlencoded";. Это вы даете обещание HTTP-серверу (в данном случае это Paypal's www.paypal.com). Обещание заключается в том, что любые отправленные вами данные будут закодированы в формате URL. Это означает, что вы должны избегать любых специальных символов. Сюда входят такие символы, как ? и & и %, а также такие символы, как ü.

Чтобы URL-кодировать имя, вам нужно создать запрос с URL-кодированным именем:

string request = "cmd=_notify-validate&......."; // don't include "last_name="
string name = "Montalvo Agüera";
request += "last_name=" + Server.UrlEncode(name);
...