我正在尝试将PayPal IPN集成到我的网站中,但它在回发PayPal时始终失败。我已经通过沙盒测试了这个,使用了IPN模拟器和网站本身。 如果通过IPN模拟器通过代码运行,我得到“未发送IPN,并且未验证握手。请查看您的信息“错误消息。如果我通过系统本身运行它,我会得到一个http 500错误。
我已经在互联网上搜索了几天可能的解决方案,包括之前发布的StackOverflow和PayPal论坛的帖子,并且相信我已经尝试了很多我发现的内容,包括:
网站以https。
我已经与我的托管服务提供商验证了SSL证书和TLS协议符合PayPal的安全升级要求。
我将沙盒帐户设置为通过我的测试商家帐户的沙箱配置文件使用UTF-8编码。正如您在代码中看到的那样,我要求在侦听器中使用UTF-8编码。
我尝试使用设置了尾部斜杠且没有尾部斜杠的通知网址。
我已经确认我发回的信息与我收到的信息完全相同,只添加了“cmd = _notify-validate”名称值对。
该站点使用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();
}