不断收到来自PayPal的无效回复
本文关键字:PayPal 无效 回复 | 更新日期: 2023-09-27 17:57:40
我一直收到无效响应。这是我的代码:
protected void Page_Load(object sender, EventArgs e)
{
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
ServicePointManager.Expect100Continue = true;
mclog.Info("entered PayPalListener Page_Load");
//Post back to either sandbox or live
string strSandbox = "https://www.sandbox.paypal.com/cgi-bin/webscr";
string strLive = "https://www.paypal.com/cgi-bin/webscr";
mclog.Info(string.Format("strSandbox = [{0}]", strSandbox));
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strSandbox);
//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 = strRequest + "&cmd=_notify-validate";
req.ContentLength = strRequest.Length;
mclog.Info(string.Format("strRequest = [{0}]", strRequest));
//Send the request to PayPal and get the response
StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), Encoding.ASCII);
streamOut.Write(strRequest);
streamOut.Close();
StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream());
string strResponse = streamIn.ReadToEnd();
streamIn.Close();
mclog.Info(string.Format("Response was [{0}]", strResponse));
if (strResponse == "VERIFIED")
{
//check the payment_status is Completed
//check that txn_id has not been previously processed
//check that receiver_email is your Primary PayPal email
//check that payment_amount/payment_currency are correct
//process payment
}
else if (strResponse == "INVALID")
{
//log for manual investigation
}
else
{
//Response wasn't VERIFIED or INVALID, log for manual investigation
}
我已经包含了日志输出,还引用了Sandbox页面上显示的结果:
2016-07-19 16:16:54:870 W15 INFO MyPayPal.PayPal.PayPalListener.Page_Load.0 entered PayPalListener Page_Load
2016-07-19 16:16:54:870 W15 INFO MyPayPal.PayPal.PayPalListener.Page_Load.0 strSandbox = [https://www.sandbox.paypal.com/cgi-bin/webscr]
2016-07-19 16:16:54:870 W15 INFO MyPayPal.PayPal.PayPalListener.Page_Load.0 strRequest = [payment_type=instant&payment_date=Wed%20Jul%2020%202016%2008%3A08%3A21%20GMT+0930%20%28AUS%20Central%20Standard%20Time%29&payment_status=Completed&address_status=confirmed&payer_status=verified&first_name=John&last_name=Smith&payer_email=buyer@paypalsandbox.com&payer_id=TESTBUYERID01&address_name=John%20Smith&address_country=United%20States&address_country_code=US&address_zip=95131&address_state=CA&address_city=San%20Jose&address_street=123%20any%20street&business=seller@paypalsandbox.com&receiver_email=seller@paypalsandbox.com&receiver_id=seller@paypalsandbox.com&residence_country=US&item_name1=something&item_number1=AK-1234&tax=2.02&mc_currency=USD&mc_fee=0.44&mc_gross=12.34&mc_gross_1=12.34&mc_handling=2.06&mc_handling1=1.67&mc_shipping=3.02&mc_shipping1=1.02&txn_type=cart&txn_id=919215415¬ify_version=2.1&custom=xyz123&invoice=abc1234&test_ipn=1&verify_sign=AFcWxV21C7fd0v3bYYYRCpSSRl31Ak5zhWFvRQAir0SAm0lY6s-KEoQl&cmd=_notify-validate]
2016-07-19 16:16:55:448 W15 INFO MyPayPal.PayPal.PayPalListener.Page_Load.0 Response was [INVALID]
我也在解码和编码中尝试过Encoding.UTF8,但当在接收和发送中都使用时,这样做会失败,而不仅仅是在接收中。当发送UTF8时,握手完全失败。
问题是由IPN模拟器在payment_date字段中插入的"+"号引起的。就我而言2016年7月23日星期六08:52:03 GMT+0930(澳大利亚中部标准时间)去掉"+"可以解决问题。
本质上,优势正在被剥离:
string payment_date=Form.Request["payment_date"];
2016-07-22 16:09:33:751 W15信息MyPayPal.PayPalListener.Page_Load.0 payment_date=[2016年7月23日星期六08:38:14 GMT 0930(澳大利亚中央标准时间)]
在没有加号的情况下将参数返回给PayPal就足以使请求无效。
我会在这里和其他地方搜索,试图找到一种允许这样做的方法,但是加号(可能还有减号)似乎在MSDN或RFC DateTime格式中没有,所以我如何检查它的原始存在是一个问题。