现在我正在尝试使用paypal沙盒从我的网站制作订阅计划。我已经在商业帐户中设置了notify_url并启用了此功能。返回和取消返回正确工作。但是当使用买方(个人)帐户进行测试并同意订阅付款时,没有任何交易日志也不会调用我的网站notify_url。
我的问题与[问题]类似:notify_url is not reached or may be false response in sandbox paypal
感谢您的帮助。
答案 0 :(得分:5)
如果您的帐户已启用IPN,请登录该帐户并查看IPN历史记录。您应该能够从这里告诉您的IPN是否正在发送,或者它们是处于重试还是失败状态。如果您在此处看到您的IPN,则可以单击消息ID,它将显示服务器返回的状态。这可能有助于找出问题的原因。此外,以下是一些可能有助于解决IPN问题的基本故障排除步骤。
此外,如果您使用的是自定义脚本,请尝试使用PayPal’s sample IPN scripts之一。它们是非常基本的脚本,但它们是经过测试的工作示例。这有助于确定您的脚本或IPN是否存在问题。
IPN问题排查提示
这些是影响开发人员使用IPN时最常见的问题。还注意到最常见的解决方案。希望这些信息可以帮助那些人!
无效的理由
要使PayPal返回VERIFIED,您的IPN脚本需要回发首先发布到它的所有变量。换句话说,如果您的脚本只需要操作1或2个变量,那么仅将脚本所关注的变量/值回发给PayPal是不够的。您的脚本应该回发最初从PayPal发布到它的所有内容。这是PayPal返回验证的唯一方式
如果您在Sandbox中进行测试,则需要确保将脚本发回www.sandbox.paypal.com。如果您在实际网站上,该脚本应回发到www.paypal.com。如果您在Sandbox中进行测试并且您的脚本发回实时站点(反之亦然),您将收到INVALID
PayPal的IPN服务器希望您的脚本将POST回发布到它的所有变量,更重要的是,它们的编码方式与发送到您脚本的方式相同。如果您的脚本无意中更改了字符的编码或将编码字符解释为另一个字符并返回POST,您可能会看到INVALID。这可能偶尔发生并且倾向于发生,例如,当收到付款并且买方可能在其名称中具有重音字符或订单是针对项目名称中具有非标准字符的某个项目时。这些实例很难排除故障,但它在此列出,因为它可能会导致INVALID,当您期望VERIFIED。当您发现某些IPN为无效并且其余所有IPN都已经过验证时,请查找此问题。
故障排除提示 - IPN没有发布!
确保您已确认付款所在帐户的电子邮件地址。
如果您认为IPN未发布到您的脚本,您可以通过检查服务器的访问日志来验证这一点。服务器访问日志将告诉您PayPal是否"命中您的脚本"一点都不访问日志跟踪访问服务器的计算机的IP地址和/或主机名。您可以访问服务器的访问日志取决于服务器管理员。如果您不知道日志的位置,请与他们核实。
错误日志 如果在运行脚本时发生错误,大多数脚本语言都会输出到错误日志。如果您在访问日志中看到PayPal正在发送IPN但您没有看到脚本的预期最终结果,则可能是脚本中存在逻辑或语法错误。检查错误日志以进行验证。同样,如果您不知道检查这些日志的方式或位置,则需要咨询服务器的管理员。
检查路径
一个容易犯的错误。在测试/使用IPN时,请始终确保脚本的路径正确,并且您发现自己没有收到IPN帖子。例如,避免使用" localhost"网址。由于这是服务器通信设置的后端服务器,因此localhost的路径将导致IPN尝试发布到自身而不是网络外部发送到您自己的服务器/脚本。
IPN是从PayPal发起的HTTP POST。如果您的服务器上有防火墙,请确保您的防火墙没有阻止来自PayPal的帖子。
如果您的脚本中包含语法或逻辑错误,则可能无法看到正确的结果。测试脚本的一种简单方法是发送一个"虚拟"发布到脚本并将一些代码写入"做一些事情"如果来自PayPal的响应是无效的。实质上,如果您将PayPal的响应验证时触发的代码复制到响应为INVALID时运行的脚本部分,则可以向脚本发送虚拟帖子以查看代码是否有效。由于脚本的虚拟帖子将返回INVALID(因为帖子不是来自PayPal),这就是为什么你要将代码添加到'如果无效'你脚本的一部分。
某些商家的设置使得他们希望将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尝试或重新POST的消息的确认(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,这可用于将您需要的任何参数传递给您自己的脚本,以测试语法以及该脚本如何与预期的变量一起工作。所有这些真正需要的是设置一个带有post操作的表单到你自己的IPN处理程序以及你想要测试的变量/值的隐藏输入。
例如:
<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>
正如许多天使线所列出的那样,这里有一个链接到他已经建立的local testing的好例子。