PayPal MVC5 IPN监听器 - 在回发到PayPal时失败

时间:2016-09-20 20:34:13

标签: c# asp.net paypal asp.net-mvc-5 paypal-ipn

我正在尝试将PayPal IPN集成到我的网站中,但它在回发PayPal时始终失败。我已经通过沙盒测试了这个,使用了IPN模拟器和网站本身。 如果通过IPN模拟器通过代码运行,我得到“未发送IPN,并且未验证握手。请查看您的信息“错误消息。如果我通过系统本身运行它,我会得到一个http 500错误。

我已经在互联网上搜索了几天可能的解决方案,包括之前发布的StackOverflow和PayPal论坛的帖子,并且相信我已经尝试了很多我发现的内容,包括:

  1. 网站以https。

  2. 运行
  3. 我已经与我的托管服务提供商验证了SSL证书和TLS协议符合PayPal的安全升级要求。

  4. 我将沙盒帐户设置为通过我的测试商家帐户的沙箱配置文件使用UTF-8编码。正如您在代码中看到的那样,我要求在侦听器中使用UTF-8编码。

  5. 我尝试使用设置了尾部斜杠且没有尾部斜杠的通知网址。

  6. 我已经确认我发回的信息与我收到的信息完全相同,只添加了“cmd = _notify-validate”名称值对。

  7. 该站点使用Visual Studio在MVC5(C#)中构建,目前仍处于开发阶段。监听程序例程代码如下。代码在req.GetRequestStream命令上一致地失败。我知道例程执行到此为止。但它永远不会从命令中返回。

    有趣的是,如果我将我的监听器代码指向生产PayPal环境,我可以完成往返,没有其他编码或处理更改。我收到了一个INVALID响应 - 预计因为IPN不是源于生产环境 - 但它至少会返回。如果我将我的听众指向沙盒环境,我根本得不到任何回应。

    有什么想法吗?我完全失去了。

    听众代码如下:

            public ActionResult IPN()
        {
            string url = "https://ipnpb.sandbox.paypal.com/cgi-bin/webscr";
            //string url = "https://ipnpb.paypal.com/cgi-bin/webscr";
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    
            //Set values for the request back
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            byte[] param = Request.BinaryRead(Request.ContentLength);
            string strRequest = Encoding.UTF8.GetString(param);
    
            strRequest = "cmd=_notify-validate&" + strRequest;
            req.ContentLength = strRequest.Length;
    
            //Send the request to PayPal and get the response
            StreamWriter streamOut = new StreamWriter(req.GetRequestStream())
            streamOut.Write(strRequest);
            streamOut.Close();
    
            StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream());
            string response = streamIn.ReadToEnd();
            streamIn.Close();
    
            if (response == "VERIFIED")
            {
                 // verified processing
            }
            else if (response == "INVALID")
            {
                //log for manual investigation
            }
            else
            {
                //log response/ipn data for manual investigation
            }
            return View();
        }
    

0 个答案:

没有答案