MVC 3 PayPal IPN ответ всегда недействителен - PullRequest
0 голосов
/ 10 марта 2012

Я использую эту статью для игры с PayPal (http://www.codeproject.com/Articles/42894/Introduction-to-PayPal-for-C-ASP-NET-developers).

После того, как платеж PayPal (песочница) завершен, я возвращаюсь к своему представлению с этой строкой запроса:

tx=9S599242S3646572T&st=Completed&amt=9.00&cc=AUD&cm=Registration+started%3a+2012-03-10+18%3a33%3a27&item_number=

используя этот код

authToken = WebConfigurationManager.AppSettings["PDTToken"];

txToken = Request.QueryString.Get("tx");

query = string.Format("cmd=_notify-synch&tx={0}&at={1}", 
                      txToken, authToken);

string url = WebConfigurationManager.AppSettings["PayPalSubmitUrl"];
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);

req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = query.Length;

StreamWriter stOut = new StreamWriter(req.GetRequestStream(), 
                         System.Text.Encoding.ASCII);
stOut.Write(query);
stOut.Close();

StreamReader stIn = new StreamReader(req.GetResponse().GetResponseStream());
strResponse = stIn.ReadToEnd();
stIn.Close();

PayPal отвечает примерно так:

SUCCESS
first_name=Firstname
last_name=Lastname
payment_status=Completed
payer_email=firstname%40lastname.com
payment_gross=50.00
mc_currency=USD
custom=Custom+value+you+passed+with+your+HTML+form
etc.

ОК, но (возможно, исходя из этого отклика) Я хочу проверить эту транзакцию, поэтому я использую приведенный ниже код (взят из этой статьи)

    string postUrl = ConfigurationManager.AppSettings["PayPalSubmitUrl"];
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(postUrl);

    //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);
    string ipnPost = strRequest;
    strRequest += "&cmd=_notify-validate";
    req.ContentLength = strRequest.Length;

    StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), 
                             System.Text.Encoding.ASCII);
    streamOut.Write(strRequest);
    streamOut.Close();

    StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream());
    string strResponse = streamIn.ReadToEnd();
    streamIn.Close();

но HttpContext.Current.Request.ContentLength равно 0, поэтому я всегда получаю ответ INVALID. Я что-то не так делаю?

1 Ответ

0 голосов
/ 14 марта 2012

Попробуйте следующее:

  1. Убедитесь, что URL, который вы отправляете обратно в PayPal, правильный
  2. Замените

    byte[] param = Request.BinaryRead(HttpContext.Current.Request.ContentLength);
    

    на

    byte[] param = HttpContext.Current.Request.BinaryRead(HttpContext.Current.Request.ContentLength);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...