問題の概要:
IPNリスナーを実装しましたが、PayPalがIPNリスナーに送信していることを知っています(生成されたテキストファイルのため)。正しいパラメーターがQueryStringで送信されますが、クエリ文字列に「&cmd=notify-validate」を追加すると検証を行ってPayPalに送信すると、次のHTML応答が返されます。
。
返されたHTMLをコピーして空白のHTMLドキュメントに貼り付けると、次のように表示されます。
最初はセッションが期限切れになったと思っていましたが、ブラウザからサンドボックスにアクセスすると、自動的にログインしました。HTMLドキュメントのリンクをクリックしてログインしていることを確認し、シミュレータで別のテストIPNを処理してみました。サンドボックスにありますが、私はこの結果を取得し続けます。私は自分が間違っていることを理解できません。悲しいことに、それは約1時間前に正しく機能していたということです:(
検証応答を送信および取得するためのIPNリスナーコード:
Dim payPalUrl As String = PayPalPayment.PayPalURL 'This returns https://www.sandbox.paypal.com/cgi-bin/webscr
Dim req As HttpWebRequest = CType(WebRequest.Create(payPalUrl), HttpWebRequest)
'Set values for the request back
req.Method = "POST"
req.ContentType = "application/x-www-form-urlencoded"
Dim params() As Byte = Request.BinaryRead(Request.ContentLength)
Dim ipnRequest As String = Encoding.ASCII.GetString(params)
Dim ipnPost As String = ipnRequest
ipnRequest &= "&cmd=notify-validate"
req.ContentLength = ipnRequest.Length
myUtility.AuditIPN(filename, ipnRequest)
''for proxy
'Dim proxy As New WebProxy(New System.Uri("http://url:port#"))
'req.Proxy = proxy
'Send the request to PayPal and get the response
Dim streamOut As New StreamWriter(req.GetRequestStream(), Encoding.ASCII)
streamOut.Write(ipnRequest)
streamOut.Close()
Dim streamIn As New StreamReader(req.GetResponse().GetResponseStream())
Dim ipnResponse = streamIn.ReadToEnd()
streamIn.Close()
'Rest of the code here... not necessary for this problem
PayPalへの支払いの転記(必要な場合)。注:フォームを作成し、Response.Write()をページに作成します。これはフォームの生成です。
Dim form As New StringBuilder
form.AppendLine("<!DOCTYPE html>")
form.AppendLine("<html xmlns=""http://www.w3.org/1999/xhtml"">")
form.AppendLine("<head runat=""server"">")
form.AppendLine(String.Format("<title>{0} {1}</title>", "PayPal payment for", ItemName))
form.AppendLine("<link href=""../css/paypal.css"" rel=""stylesheet"" />")
form.AppendLine("</head>")
form.AppendLine("<body>")
form.AppendLine("<div class=""paypal""></div>")
form.AppendLine(String.Format("<p>Accessing PayPal to process your payment for the {0}.</p>", ItemName))
form.AppendLine("<div class=""loading""></div>")
form.AppendLine("<form id=""myform"" action=""https://www.sandbox.paypal.com/cgi-bin/webscr"" method=""post"">")
form.AppendLine("<input type=""hidden"" name=""cmd"" value=""_xclick"">")
form.AppendLine(String.Format("<input type=""hidden"" name=""business"" value=""{0}"">", BusinessEmail))
form.AppendLine(String.Format("<input type=""hidden"" name=""item_name"" value=""{0}"">", ItemName))
form.AppendLine(String.Format("<input type=""hidden"" name=""amount"" value=""{0}"">", Amount))
form.AppendLine(String.Format("<input type=""hidden"" name=""currency_code"" value=""{0}"">", Currency))
form.AppendLine(String.Format("<input type=""hidden"" name=""return"" value=""{0}"">", ReturnURL))
form.AppendLine("<input type=""hidden"" name=""button_subtype"" value=""products"">")
form.AppendLine("<input type=""hidden"" name=""bn"" value=""HHMRKWQT8NRTW:PP-BuyNowBF_P"">")
form.AppendLine("<input type=""hidden"" name=""no_note"" value=""0"">")
form.AppendLine("</form>")
form.AppendLine("<script type=""text/javascript"">")
form.AppendLine(" document.forms[""myform""].submit();")
form.AppendLine("</script>")
return form.ToString()
この問題に関して他に何か投稿する必要がある場合は、現在私の脳が完全に揚げられているので知らせてください。
あなたの時間と助けは大歓迎です!
注:私のコードはVB.NETにありますが、C#でも開発しているので、C#のサンプルコードに眉をひそめることはありません。
答え:
代わりにHTMLを受け取った場合、notify-validateはPayPalに正しく送信されません。&cmd = _notify-validate(cmdキーの直後にアンダースコアを付ける)である必要があります。ぼんやりとした昏迷で、どういうわけか同じように削除したに違いありません。私のIPNリスナーはVERIFIEDを正常に返しています:)