10

In the IPN docs there is this line:

To handle the possibility of transmission and receipt delays or failures, the IPN message service implements a retry mechanism that resends messages at various intervals until you acknowledge that the message has successfully been received.

IPN is sending the same notification 9 times... What do I need to send back? There are no errors in my script. If I use the IPN simulator I get the following message:

IPN sent successfully

It would seem then that the simulator can tell the message is being sent correctly but the real notifier can't?

I am using sandbox if that makes any difference?

Do I need to print anything upon receipt of the notification?

4

4 回答 4

12

无需担心多重通知。首先发回 IPN 消息然后处理它。在处理过程中,检查 txn_id 之前没有被处理过。如果它已经被处理,它是来自 Paypal 的重复 IPN 消息,您可以忽略处理。有关更多信息,请参阅 pdf 文件: IPGuide.pdf

编辑: 收到通知后我需要打印任何东西吗?无需打印任何内容,但如果您想记录详细信息,您可以记录它们。从我上面提到的pdf文件(第10页)

您的听众必须对每条消息做出响应,无论您是否打算对它做任何事情。 如果您不回复,PayPal 将假定未收到该消息并重新发送该消息。PayPal 会继续定期重新发送消息,直到您的听众发回正确的消息,尽管重新发送消息之间的间隔每次都会增加。该消息最多可以重新发送四天。这种重新发送算法可能会导致 PayPal 在您发回原始消息时重新发送 IPN 消息。在这种情况下,您应该再次发送您的回复,以弥补 PayPal 第一次实际上没有收到您的回复的可能性。您还应该确保您不会两次处理与消息关联的事务。重要提示:PayPal 希望在 30 秒内收到对 IPN 消息的响应。在响应 IPN 消息之前,您的侦听器不应执行耗时的操作,例如创建进程

请参见第 19-20 页 您的监听软件必须

  • 等待来自 PayPal 的 HTTP 帖子。

  • 以相同的顺序创建一个包含完全相同的 IPN 变量和值的请求,并以 cmd=_notify-validate 开头。

  • 将请求发布到 paypal.com 或 sandbox.paypal.com,具体取决于您是要上线还是在沙盒中测试您的侦听器。

  • 等待来自 PayPal 的响应,该响应是已验证或无效。

  • 如果响应已验证,请执行以下检查:

  • 确认付款状态已完成。PayPal 也会发送 IPN 消息以处理待付款和拒绝付款;在付款清除之前不要发货。

  • 使用事务 ID 来验证事务尚未处理,从而防止重复事务被处理。

  • 通常,您将事务 ID 存储在数据库中,以便知道您只处理唯一事务。

  • 验证收件人的电子邮件地址是否已注册给您。此检查提供额外的防欺诈保护。

  • 验证价格、商品描述等是否与您网站上的交易相匹配。此检查提供额外的防欺诈保护。

  • 如果验证的响应通过检查,则根据 txn_type 变量的值(如果存在)采取行动;否则,根据 reason_code 变量的值采取措施。

  • 如果响应无效,请保存消息以供进一步调查

于 2013-10-30T12:28:52.737 回答
3

您的 IPN 脚本出了问题,导致它经常失败。这可能发生在脚本的最底部,因此您希望看到的一切都会发生,但随后会向 PayPal 发送 500 错误。

您是否检查过您的 PayPal IPN 历史记录以查看其中显示的内容?你可能会看到很多错误。此外,您还需要检查您的 Web 服务器日志,以查看该脚本被命中时发生的错误。

这可能只是某些订单才会发生的事情。例如,我经常看到有人在进行数据库更新或类似的事情,而像 O'Reilly 这样的名字会破坏他们的脚本,因为他们没有正确处理撇号。

查看您的 Web 服务器日志应该会显示错误发生的位置,然后您可以运行一些测试来帮助找出问题。我喜欢创建一个基本的 HTML 表单,将操作设置为我的 IPN 侦听器,然后添加与我期望在 IPN 中获得的内容相匹配的隐藏字段。这样,您可以在浏览器中加载它并直接向其发布各种值,这样您就可以在屏幕上看到结果。请记住,如果您以这种方式进行测试,则不会验证 IPN,因为它不是来自 PayPal,因此您需要确保您的代码已设置为相应地处理它。

于 2013-10-31T09:02:19.450 回答
2

您必须回复一个空的 200 响应,以向 PayPal 表明在处理响应数据后正确收到了 IPN

public function yourIpnHandler(){
    //response verification and processing goes here


    header("HTTP/1.1 200 OK");
}

收到空的 200 响应后,PayPal 将不会发送更多响应,因为它知道响应已成功交付给 ipn-handler。

于 2017-10-17T12:06:09.577 回答
0

empty 200 response将响应数据处理为

public function yourIpnHandler(){

    //response verification and processing goes here

    header("HTTP/1.1 200 OK");
}

收到空的 200 响应后,paypal 将不会发送更多响应,因为它知道响应已成功发送到

于 2017-10-17T12:06:02.700 回答