简体   繁体   English

不断收到PayPal的无效回复

[英]Keep getting INVALID response from PayPal

I keep getting an INVALID response. 我一直收到无效回复。 Here's my code: 这是我的代码:

    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
        }

I've included the log output and also quoted the result displayed on the Sandbox page: 我包括了日志输出,还引用了“沙箱”页面上显示的结果:

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&notify_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] 

I've also tried Encoding.UTF8 in both the decoding and encoding however doing so fails when used in both receiving and sending but not in receiving only. 我也在解码和编码中都尝试过Encoding.UTF8,但是这样做在接收和发送时都失败了,而不仅仅是在接收时才失败。 When sending UTF8, the handshake fails altogether. 发送UTF8时,握手完全失败。

The issue has been caused by the "+" sign inserted by the IPN Simulator in the payment_date field. 该问题是由IPN模拟器在payment_date字段中插入“ +”号引起的。 In my case it was Sat Jul 23 2016 08:52:03 GMT+0930 (AUS Central Standard Time) Taking out the "+" fixes the problem. 以我为例,这是2016年7月23日星期六格林尼治标准时间+0930(澳大利亚中央标准时间)取出“ +”号即可解决问题。

Essentially, the plus is being stripped out: 从本质上讲,加号被删除了:

string payment_date = Form.Request["payment_date"]; 字符串payment_date = Form.Request [“ payment_date”];

2016-07-22 16:09:33:751 W15 INFO MyPayPal.PayPal.PayPalListener.Page_Load.0 payment_date = [Sat Jul 23 2016 08:38:14 GMT 0930 (AUS Central Standard Time)] 2016-07-22 16:09:33:751 W15信息MyPayPal.PayPal.PayPalListener.Page_Load.0 payment_date = [Sat Jul 23 2016 08:38:14 GMT 0930(AUS Central Standard Time)]

Returning the parameter to PayPal without the plus was enough to invalidate the request. 不带加号将参数返回给PayPal足以使请求无效。

I will search here and elsewhere to try and figure out a way to allow for this however the plus (and presumably) a minus don't seem to feature in MSDN or RFC DateTime formats so how I can check it's original existence is a worry. 我将在这里和其他地方进行搜索,以尝试找出一种允许这种方式的方法,但是MSDN或RFC DateTime格式中似乎没有加号(可能是减号),因此,如何检查它的原始存在令人担忧。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM