php – notify_url从未在买家付费订阅时致电

现在我正在尝试使用paypal沙盒从我的网站制作订阅计划.我已经在商业帐户中设置了notify_url并启用了此功能.返回和取消返回正确工作.但是当使用买方(个人)帐户进行测试并同意订阅付款时,没有任何交易日志也不会调用我的网站notify_url.

我的问题与[问题]类似:notify_url is not reached or may be false response in sandbox paypal

谢谢你的帮助.

解决方法:

如果您的帐户已启用IPN,请登录该帐户并查看IPN历史记录.您应该能够从这里判断您的IPN是否正在发送,或者它们是处于重试还是失败状态.如果您在此处看到您的IPN,则可以单击消息ID,它将显示服务器退回的状态.这可能有助于找出问题的原因.此外,以下是一些可能有助于解决IPN问题的基本故障排除步骤.

此外,如果您使用的是自定义脚本,请尝试使用PayPal’s sample IPN scripts之一.它们是非常基本的脚本,但它们是经过测试的工作示例.这有助于确定您的脚本或IPN是否存在问题.

IPN故障排除提示

这些是影响开发人员使用IPN时最常见的问题.还注意到最常见的解决方案.希望这些信息有助于那里的人!

无效的原因

>确保您回发所有变量/值.

要使PayPal返回VERIFIED,您的IPN脚本需要回发首先发布到它的所有变量.换句话说,如果您的脚本只需要操作1或2个变量,那么仅将脚本所关注的变量/值回发给PayPal是不够的.您的脚本应该回发最初从PayPal发布到它的所有内容.这是PayPal返回VERIFIED的唯一方法

>确保您没有回到错误的URL.

如果您在Sandbox中进行测试,则需要确保将脚本发回www.sandbox.paypal.com.如果您在实际网站上,该脚本应回发到www.paypal.com.如果您在Sandbox中进行测试并且您的脚本发回实时站点(反之亦然),您将收到INVALID

>编码

PayPal的IPN服务器期望您的脚本将POST回发布到它的所有变量,更重要的是,它们的编码方式与发送到脚本的方式相同.如果您的脚本无意中更改了字符的编码或将编码字符解释为另一个字符并返回POST,您可能会看到INVALID.这可能偶尔发生并且倾向于发生,例如,当收到付款并且买方可能在其名称中具有重音字符或订单是针对项目名称中具有非标准字符的某个项目时.这些实例很难排除故障,但它在此列出,因为它可能会导致INVALID,当您期望VERIFIED.当您发现某些IPN为INVALID且其余所有IPN都已经过验证时,请查找此问题.

疑难解答提示 – IPN没有发布!

>收到帐户的电子邮件地址.

确保您已确认付款所在帐户的电子邮件地址.

>访问日志

如果您认为IPN未发布到您的脚本,您可以通过检查服务器的访问日志来验证这一点.服务器访问日志将告诉您PayPal是否“正在命中您的脚本”.访问日志跟踪访问服务器的计算机的IP地址和/或主机名.您可以访问服务器的访问日志取决于服务器管理员.如果您不知道日志的位置,请与他们核实.

>错误日志
如果在运行脚本时发生错误,大多数脚本语言都会输出到错误日志.如果您在访问日志中看到PayPal正在发送IPN但您没有看到脚本的预期最终结果,则可能是脚本中存在逻辑或语法错误.检查错误日志以进行验证.同样,如果您不知道如何或在何处检查这些日志,则需要咨询服务器的管理员.
>检查路径

一个容易犯的错误.在测试/使用IPN时,请始终确保脚本的路径正确,并且您发现自己没有收到IPN帖子.例如,避免使用“localhost”网址.由于这是服务器通信设置的后端服务器,因此localhost的路径将导致IPN尝试发布到自身而不是网络外部到您自己的服务器/脚本.

>防火墙

IPN是从PayPal发起的HTTP POST.如果您的服务器上有防火墙,请确保您的防火墙没有阻止来自PayPal的帖子.

>测试以确保您的脚本按预期工作.

如果您的脚本中包含语法或逻辑错误,则可能无法看到正确的结果.测试脚本的一种简单方法是向脚本发送“虚拟”帖子,如果PayPal的响应为INVALID,则将一些代码写入“做某事”.实质上,如果您将PayPal的响应验证时触发的代码复制到响应为INVALID时运行的脚本部分,则可以向脚本发送虚拟帖子以查看代码是否有效.由于脚本的虚拟帖子将返回INVALID(因为帖子不是来自PayPal),因此您希望将代码添加到脚本的“if INVALID”部分.

>发布到您的返回URL(返回方法)

一些商家被设置为使得他们希望将IPN数据发布到他们的按钮代码中的返回变量的值(返回).这是PayPal付款后买家指向的网址.要将IPN数据发布到您的返回URL,您必须在按钮代码中将rm变量设置为“2”,否则您可能看不到任何IPN数据发布到您的返回URL.有关更多信息,请参阅此文章. **请注意,此信息是关于IPN数据可以通过返回传递以及它如何与返回URL一起使用(按钮代码变量’return’).如果启用了PDT自动返回,则此信息不适用于您,因为PDT是其自己的单独功能.有关PDT的更多信息,请访问此处.

故障排除提示 – IPN延迟

在大多数情况下,当您的服务器没有响应200k的许多事务IPN时,会导致IPN的一致延迟.例如,当您的服务器未使用200ok PayPal回复时,会尝试重新发布数据.在没有收到200k的数据的这么多重新发布之后,你的IPN被转移到一个较慢的循环服务器,因此延迟.

首先检查您的IPN日志以了解POST的状态:

在历史记录部分下的帐户中,您应该有一个“IPN历史记录”部分,您可以在其中查看最近28天的IPN,有些情况可以重新发送.如果您没有显示此链接,请登录您的帐户,而不是转到此处:
https://www.paypal.com/us/cgi-bin/webscr?cmd=_display-ipns-history

这些日志将具有几种不同的状态:

已发送 – 表示PayPal已将消息发送给您的IPN侦听器
失败 – 表示PayPal未收到针对原始POST尝试或重新P​​OST的消息的确认(200ok)
排队 – 表示PayPal已准备好发送消息
重试 – 表示PayPal未收到200ok且消息重新发送1到15次,并且PayPal正在继续重新发送消息
已禁用 – 表示由于IPN /帐户已被禁用,因此不会重新发送邮件

如果您看到失败或重试,这很可能是解决此问题的原因,您需要查看服务器日志以确定200ok未被发送回PayPal IPN的原因.一旦确定并纠正了这一点,并且您的服务器以200ok响应,它就会从该限制下降这个百分比/倒计时,它将开始从正常周期服务器发布IPN.

如果没有失败,可能是PayPal服务器本身的延迟,在这种情况下,您将需要创建PayPal商户技术服务的票证作为paypal.com/mts进行进一步审查.

Curl vs fsockopen:
这通常是个人偏好,但在某些情况下,您要使用的主机提供商不支持其中一个,因此您可能需要在两者之间切换.以下是使用fsockopen的示例:

$header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Host: www.paypal.com\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n";
$header .= "Connection: Close\r\n\r\n";
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

这是相同的事情,但使用curl:

$url= 'https://www.sandbox.paypal.com/cgi-bin/webscr';

$curl_result=$curl_err='';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req)));
curl_setopt($ch, CURLOPT_HEADER , 0);   
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$res = @curl_exec($ch);
$curl_err = curl_error($ch);
curl_close($ch);

基本上,如果您遇到问题,并且您认为可能是主机/服务器不支持的一种方法,而不是简单地替换您正在使用的方法.

本地测试:
这可能是生产和测试任何脚本中最重要的步骤.关于IPN,这可用于将您需要的任何参数传递给您自己的脚本,以测试语法以及该脚本如何与预期的变量一起工作.所有这些真正需要的是设置一个表单,其中包含对您自己的IPN处理程序的post操作以及您要测试的变量/值的隐藏输入.

例如:

<form target="_new" method="post" action="https://www.YourDomain.com/Path/IPNhandler.php">
<input type="hidden"  name="SomePayPalVar" value="SomeValue1"/>
<input type="hidden"  name="SomeOtherPPVar" value="SomeValue2"/>

Than etc for all  other variables you want to test with.

</br>
<input  type="submit"/>
</form>

正如许多angelleye的帖子所列,这里有一个他已经建立的local testing好例子的链接.

上一篇:如何存储Android应用内结算的订阅数据?


下一篇:为在线数据库构建基于 Kudu 的实时数据同步