2012-01-03 4 views
1

PayPal Ipnを設定しようとしていますが、一部の注文確認に失敗しています。ユーザー名に標準以外の文字があると失敗することがわかりました&last_name=Montalvo Agüera エンコードを変更する必要はありますか?PayPal検証が無効で失敗する

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); 

答えて

0

パラメータをurl-encodeする必要があります。それはラインreq.ContentType = "application/x-www-form-urlencoded";の意味です。 HTTPサーバー(この場合はPayPalの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); 
+0

いいえ、これは動作しません。 – Tomas

+0

はまだ無効です。成功を収めずに問題を解決しようとする2日間。私は「即時支払い通知(IPN)の詳細」ページからIPNメッセージを受け取りますが、一部は失敗します。私はちょうど検証を削除すると思う。 – Tomas

+0

質問を編集して、2つのリクエスト例があります - 1つは動作し、もう1つは問題ありませんか?おそらく何か別のことが起こっているでしょう。 – scraimer

0

あなたはこのようにそれを試すことができます:それはまだdoesnの場合

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

私は同じ問題を抱えています。一部の注文のステータスが無効です。 – Tomas

+0

UTF8に変更すると「すべてのバイトが書き込まれるまでストリームを閉じることができません」というエラーが表示されます。 – Tomas

+0

私はpaypalに連絡するべきだと思います – kleinohad