php - 当买家为订阅付款时,notify_url永远不会调用

标签 php paypal sandbox subscription paypal-ipn

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

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

感谢您的帮助。

最佳答案

如果您的帐户中启用了IPN,请登录该帐户并查看IPN历史记录。您应该可以从此处判断您的IPN是否已发送出去,或者它们是否处于重试或失败状态。如果您在此处看到IPN,则可以单击消息ID,如果服务器正在重发IPN,它将显示服务器正在返回的状态。这可能有助于找出问题的原因。另外,这是一些基本的故障排除步骤,可能有助于解决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。例如,这可能会偶尔发生,并倾向于发生,例如,当收到付款并且买方的名称中可能带有重音字符或订单是针对某项商品名称中具有非标准字符的商品时。这些实例很难进行故障排除,但在此处列出了这些实例,因为当您希望验证通过时,它可能导致INVALID无效。当您看到某些IPN无效而其余所有IPV已验证时,请查找此问题。

疑难解答提示-IPN不发布!


接收帐户上的电子邮件地址。


确保已确认付款发送到的帐户上的电子邮件地址。


访问日志


如果您认为IPN没有发布到脚本中,则可以通过检查服务器的访问日志来验证。服务器访问日志将告诉您PayPal是否完全“点击了脚本”。访问日志跟踪访问服务器的计算机的IP地址和/或主机名。您能否访问服务器的访问日志取决于服务器管理员。如果您不知道日志在哪里,请与他们联系。


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


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


防火墙


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


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


如果您的脚本中包含语法或逻辑错误,很可能您将看不到正确的结果。一种简单的测试脚本的方法是通过向脚本发送“虚拟”帖子,并在PayPal的响应无效的情况下编写一些代码来“执行某些操作”。本质上,如果将来自PayPal的响应为VERIFIED时要触发的代码复制到脚本响应的部分(如果响应为INVALID时运行),则可以向脚本发送虚拟帖子以查看代码是否有效。由于到脚本的虚拟帖子将返回INVALID(因为该帖子不是源自PayPal),因此这就是为什么要将代码添加到脚本的“ if INVALID”部分的原因。


发布到您的返回网址(返回方法)


设置了一些商家,以便他们希望将IPN数据发布到其按钮代码(返回)中其返回变量的值。这是在完成PayPal付款后,买家会转到的URL。要将IPN数据发布到返回URL,必须在按钮代码中将rm变量设置为等于“ 2”,否则您可能看不到任何IPN数据发布到返回URL。有关更多信息,请参见这篇文章。 **请注意,此信息是有关IPN数据的信息,可以通过返回以及它与返回URL(按钮代码变量“ return”)一起使用的方式进行传递。如果您启用了PDT自动返回功能,则此信息不适用于您,因为PDT是其自身的独立功能。有关PDT的更多信息,请参见此处。

疑难解答提示-IPN延迟

在大多数情况下,当您的服务器未对许多事务IPN进行200ok响应时,会导致IPN持续出现延迟。例如,当您的服务器未回复200ok贝宝时,将尝试重新发布数据。在多次重新发送未收到200ok的数据之后,您的IPN被转移到速度较慢的循环服务器上,因此延迟了。

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

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

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

已发送-表示贝宝已将邮件发送到您的IPN侦听器
失败-表示PayPal未收到针对原始POST尝试或重新P​​OST的消息的确认(200ok)
已排队-表示贝宝已准备好发送消息
重试-表示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的一个很好例子的链接。

关于php - 当买家为订阅付款时,notify_url永远不会调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15778567/

相关文章:

linux - 在 Linux 上运行可执行文件最安全的方法是什么?

ios - ppapi_error_code_10870 - 请到 App Store 安装最新版本的 PayPal 应用程序

php - Telegram Bot 内联键盘不显示 PHP

php - 使用 PHP 和 SQL 将数据库中的信息插入下拉列表菜单

javascript - 如何使用 PayPal Express Checkout 集成(客户端 REST)获取交易 ID

Paypal IPN https 更改 2016

sandbox - 有没有办法重置我的 GameCenter 沙盒帐户的成就进度?

php - 以编程方式安装和激活 Wordpress 插件

PHP 类数据库连接范围问题

html - Paypal 定期付款表格