PayPal IPN在付款完成后数小时发送多个通知

10
在IPN文档中有这样一句话:
为了处理传输和接收延迟或失败的可能性,IPN消息服务实现了一种重试机制,以在不同的时间间隔内重新发送消息,直到您确认已成功接收该消息。
IPN会发送相同的通知9次...我需要回复什么?我的脚本没有错误。如果我使用IPN模拟器,我会收到以下消息:
IPN发送成功
那么看起来仿真器可以确定消息被正确地发送了,但真正的通知者却不能?
我正在使用sandbox,是否有任何区别?
我需要在接收通知时打印任何内容吗?

我们可以在处理POST数据后使用header("HTTP/1.1 200 OK");来确认PayPal的空响应。因此,将来不会再有其他响应。 - RAUSHAN KUMAR
3个回答

12
需要担心多次通知,首先发送IPN消息,然后处理它。在处理过程中,检查txn_id是否已被处理过。如果已经处理过,则这是来自Paypal的重复IPN消息,您可以忽略处理。
有关更多信息,请参见pdf文件: IPNGuide.pdf 编辑: 在收到通知后需要打印什么吗? 不需要打印任何内容,但是如果您想记录详细信息,则可以记录它们。从我上面提到的pdf文件(第10页)中获取更多信息。
引用: 您的监听器必须对每条消息作出响应,无论您是否打算对其进行任何操作。如果您没有回应,PayPal会认为该消息未被接收,并重新发送该消息。 PayPal将定期重新发送该消息,直到您的监听器发送回正确的消息,尽管重发消息之间的时间间隔每次增加。该消息最多可重新发送4天。此重新发送算法可能导致PayPal在您发送原始消息时重新发送IPN消息。在这种情况下,您应该再次发送响应,以覆盖PayPal实际上第一次没有收到您的响应的可能性。您还应确保不要处理与消息相关联的交易两次。重要提示:PayPal希望在30秒内接收到IPN消息的响应。在响应IPN消息之前,您的监听器不应执行耗时操作,例如创建进程。
请参见第19-20页: 您的监听器软件必须: - 等待PayPal的HTTP post。 - 创建一个请求,其中包含与IPN变量和值完全相同的内容,以相同的顺序排列,以cmd=_notify-validate开头。 - 将该请求发布到paypal.com或sandbox.paypal.com,具体取决于您使用的是哪个环境。
  • 在沙盒中进行直播或测试监听器。

  • 等待PayPal的响应,该响应是“已验证”还是“无效”。

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

  • 确认付款状态为已完成。PayPal也会发送有关待处理和拒绝付款的IPN消息;在付款清算之前,请勿发货。

  • 使用交易ID验证交易是否已经被处理,从而防止重复交易被处理。

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

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

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

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

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


  • 2
    感谢您的回复。我正在按要求完成所有操作。我按顺序返回IPN变量,并使用_notify-validate进行验证,这是我的脚本执行的第一件事。我得到了VERIFIED响应。您说我不需要担心多个通知。这将推广给数千个客户。1个通知和9个通知之间的差异将导致每周约200k个通知被丢弃...在整个计划中并不是一个重大问题,但如果可能的话,最好避免它。 - user1326244
    @Damodaran,我们可以在处理POST数据后使用header(“HTTP/1.1 200 OK”);的空响应来确认PayPal。这样以后就不会再有响应了。 - RAUSHAN KUMAR

    3
    您的IPN脚本出了些问题,导致它经常失败。这可能发生在脚本的最底部,因此您期望看到的一切都会发生,但随后会向PayPal返回500错误。
    您是否检查过PayPal IPN历史记录以查看其显示了什么?您可能会看到很多错误。此外,您还需要检查Web服务器日志以查看在命中该脚本时发生的错误。
    可能是某些订单才会出现的问题。例如,我经常看到人们进行数据库更新或类似操作,像“O'Reilly”这样的名称会破坏他们的脚本,因为他们没有正确处理撇号。
    查看Web服务器日志应该会显示错误发生的位置,然后您可以运行一些测试来帮助解决问题。我喜欢创建一个基本的HTML表单,将操作设置为我的IPN监听器,然后添加匹配我期望从IPN中获得的隐藏字段。这样,您就可以在浏览器中加载它并直接发布各种值,从而可以在屏幕上查看结果。只需记住,如果您以这种方式进行测试,则IPN将无法验证,因为它不是来自PayPal的,因此您需要确保您的代码已设置为相应地处理它。

    3
    您需要以空的200响应进行回复,以指示PayPal在处理响应数据后正确接收IPN。
    public function yourIpnHandler(){
        //response verification and processing goes here
    
    
        header("HTTP/1.1 200 OK");
    }
    

    在收到空的200响应后,PayPal将不会发送更多的响应,因为它认为响应已成功传递到ipn处理程序。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接