当买家支付订阅费用时,notify_url 从不调用
Posted
技术标签:
【中文标题】当买家支付订阅费用时,notify_url 从不调用【英文标题】:notify_url never call when buyer paid for subscription 【发布时间】:2013-03-24 14:25:00 【问题描述】:现在我正在尝试使用贝宝沙盒从我的网站制定订阅计划。我已经在企业帐户中设置了 notify_url 并打开了此功能。退货和取消退货正常工作。但是当用买家(个人)账户测试并同意订阅付款时,没有交易日志永远不会调用我的网站 notify_url。
我的问题与[question]类似:notify_url is not reached or may be false response in sandbox paypal
感谢您的帮助。
【问题讨论】:
【参考方案1】:如果您在帐户中启用了 IPN,请登录该帐户并查看 IPN 历史记录。您应该能够从这里判断您的 IPN 是否正在发送,或者它们是否处于重试或失败状态。如果您在这里看到您的 IPN,您可以单击消息 ID,它会显示您的服务器正在返回的状态(如果它正在返回一个状态)。这可能有助于隔离问题的原因。此外,这里还有一些可能有助于解决 IPN 问题的基本故障排除步骤。
此外,如果您使用的是自定义脚本,请尝试使用PayPal’s sample IPN scripts 之一。它们是非常基本的脚本,但它们是经过测试的工作示例。这有助于确定是您的脚本问题还是一般 IPN 问题。
IPN 故障排除提示
这些是在使用 IPN 时影响开发人员的最常见问题。还记录了最常见的解决方案。希望这些信息对那里的人有所帮助!
无效的原因
确保回发所有变量/值。要让 PayPal 返回 VERIFIED,您的 IPN 脚本需要发回最初发布到它的所有变量。换句话说,如果您的脚本只需要操作 1 或 2 个变量,那么仅将您的脚本所关注的变量/值发回 PayPal 是不够的。您的脚本应该发回最初从 PayPal 发布到它的所有内容。这是 PayPal 返回 VERIFIED 的唯一方式
确保您没有发回错误的 URL。如果您在沙盒中进行测试,您需要确保您的脚本回传到 www.sandbox.paypal.com。如果您在实时站点上,则该脚本应发回 www.paypal.com。如果您在沙盒中进行测试并且您的脚本发布回实时站点(反之亦然),您将收到 INVALID
编码PayPal 的 IPN 服务器希望您的脚本将回传所有发布到它的变量,更重要的是,它们的编码方式与发送到您的脚本的方式相同。如果您的脚本无意中更改了字符的编码或将编码字符解释为另一个字符并返回,您可能会看到 INVALID。这可能偶尔发生并且往往会发生,例如,当收到付款并且买家的名称中可能有重音字符或订单是针对某些商品名称中包含非标准字符的商品时。这些实例很难排除故障,但在此处列出,因为当您期望 VERIFIED 时,它可能会导致 INVALID。当您看到某些 IPN 无效且所有其他 IPN 均已验证时,请查找此问题。
疑难解答提示 - IPN 未发布!
接收帐户的电子邮件地址。确保您已确认收款帐户上的电子邮件地址。
访问日志如果您觉得 IPN 没有发布到您的脚本,您可以通过检查您的服务器的访问日志来验证这一点。服务器访问日志将告诉您 PayPal 是否完全“命中您的脚本”。访问日志跟踪访问服务器的计算机的 IP 地址和/或主机名。您是否可以访问服务器的访问日志取决于服务器管理员。如果您不知道日志在哪里,请与他们联系。
错误日志 如果在运行脚本时发生错误,大多数脚本语言都会输出到错误日志。如果您在访问日志中看到 PayPal 正在发送 IPN,但您没有从脚本中看到预期的最终结果,那么您很可能在脚本中存在逻辑或语法错误。检查您的错误日志以进行验证。同样,如果您不知道如何或在何处查看这些日志,则需要咨询您的服务器管理员。
检查路径
一个容易犯的错误。在测试/使用 IPN 时,请始终确保脚本的路径正确,并且您会发现您没有收到 IPN 帖子。例如,避免使用“localhost”网址。由于这是后端服务器到服务器的通信,因此设置到 localhost 的路径将导致 IPN 尝试发布到自身而不是网络外部到您自己的服务器/脚本。
防火墙IPN 是从 PayPal 发起的 HTTP POST。如果您的服务器上有防火墙,请确保您的防火墙没有阻止来自 PayPal 的帖子。
测试以确保您的脚本按预期工作。如果您的脚本中有语法或逻辑错误,您很可能看不到正确的结果。测试脚本的一种简单方法是向脚本发送“虚拟”帖子,并在 PayPal 的响应无效时编写一些代码来“做某事”。本质上,如果您将验证来自 PayPal 的响应时要触发的代码复制到响应无效时运行的脚本部分,您可以向脚本发送虚拟帖子以查看您的代码是否有效。由于脚本的虚拟帖子将返回 INVALID(因为帖子不是来自 PayPal),这就是为什么要将代码添加到脚本的“if INVALID”部分的原因。
帖子到您的返回 URL(返回方法)一些商家设置为希望将 IPN 数据发布到其按钮代码(返回)中的返回变量的值。这是 PayPal 付款后买家被定向到的 URL。要将 IPN 数据发布到您的返回 URL,您必须在按钮代码中将 rm 变量设置为等于“2”,否则您可能看不到任何 IPN 数据发布到您的返回 URL。有关更多信息,请参阅这篇文章。 ** 请注意,此信息是关于 IPN 数据可以通过返回传递以及它如何与您的返回 URL 一起使用(按钮代码变量“返回”)。如果您启用了启用 PDT 的自动返回,则此信息不适用于您,因为 PDT 是它自己的独立功能。有关 PDT 的更多信息,请参见此处。
故障排除提示 - IPN 延迟
在大多数情况下,当您的服务器对许多事务 IPN 没有响应 200ok 时,会导致 IPN 持续延迟。例如,当您的服务器没有回复 200ok 时,PayPal 会尝试重新发布数据。在大量转发未收到 200ok 的数据后,您的 IPN 将被移动到速度较慢的循环服务器,因此会出现延迟。
首先检查您的 IPN 日志以了解 POST 的状态:
在您的帐户历史记录部分下,您应该有一个“IPN 历史记录”部分,您可以在其中查看过去 28 天的 IPN 值,并且在某些情况下可以重新发送它们。如果您没有显示此链接,请登录您的帐户,请访问此处: https://www.paypal.com/us/cgi-bin/webscr?cmd=_display-ipns-history
这些日志将有几个不同的状态:
Sent - 表示 PayPal 将消息发送到您的 IPN 侦听器 失败 - 表示 PayPal 没有收到对原始 POST 尝试或重新 POST 消息的确认 (200ok) Queued - 表示 PayPal 已准备好发送消息 Retrying - 表示 PayPal 没有收到 200ok 并且消息被重新发送了 1 到 15 次,并且 PayPal 正在继续重新发送消息 Disabled - 表示由于IPN/帐号已被禁用,消息不会被重新发送
如果您看到 Failed 或 Retrying 这很可能是解决此问题的原因,您需要查看您的服务器日志以确定 200ok 未发送回 PayPal IPN 的原因。一旦确定并纠正了这一点,并且您的服务器以 200ok 响应,它会将这个百分比/计数从该限制中降低,并且它将开始从正常周期服务器发布 IPN。
如果没有失败,则可能是 PayPal 服务器本身出现延迟,在这种情况下,您需要创建一张到 PayPal Merchant Technical Services 的工单,作为 paypal.com/mts 进行进一步审查。
Curl 与 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 处理程序的发布操作以及您要测试的变量/值的隐藏输入。
例如:
<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 的一个很好的例子。
【讨论】:
以上是关于当买家支付订阅费用时,notify_url 从不调用的主要内容,如果未能解决你的问题,请参考以下文章