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

时间:2013-10-30 12:16:43

标签: paypal paypal-ipn

在IPN文档中有这一行:

  

为了处理传输和接收延迟或失败的可能性,IPN   消息服务实现重试机制,以不同的间隔重新发送消息   直到您确认已成功收到该消息。

IPN发送相同的通知9次...我需要发回什么?我的脚本没有错误。如果我使用IPN模拟器,我会收到以下消息:

  

IPN已成功发送

那么模拟器似乎可以告诉消息是否正确发送但真正的通知器不能?

如果有任何不同,我正在使用沙盒吗?

收到通知后是否需要打印任何内容?

4 个答案:

答案 0 :(得分:11)

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

修改 收到通知后是否需要打印任何内容? 无需打印任何内容,但如果要记录详细信息,则可以记录它们。 从我上面提到的pdf文件(第10页)

  

无论您是否打算,您的听众都必须回复每封邮件   用它来做任何事情。如果你没有回应,PayPal就会这样做   消息未收到并重新发送消息。贝宝   继续定期重新发送消息,直到听众发送   回复正确的消息,虽然重新发送间隔   消息每次都会增加。该消息可以重新发送   四天。这种重发算法可以导致其中的情况   PayPal会在您发送回来时重新发送IPN消息   原始信息。在这种情况下,您应该再次发送您的回复,   以涵盖PayPal实际上没有收到你的可能性   第一次回应。你也应该确保不这样做   处理与消息关联的事务两次。 重要:   PayPal希望在30内收到对IPN消息的响应   秒。你的听众不应该执行耗时的操作,   例如在响应IPN消息之前创建进程

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

  • 等待来自PayPal的HTTP帖子。

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

  • 将请求发布到paypal.com或sandbox.paypal.com,具体取决于您是否 正在沙盒中上线或测试你的听众。

  • 等待PayPal的回复,该回复是VERIFIED或INVALID。

  • 如果回复是VERIFIED,请执行以下检查:

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

  • 使用交易ID验证交易尚未处理,从而防止处理重复交易。

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

  • 确认接收方的电子邮件地址已注册。此检查提供额外的防欺诈保护。

  • 确认价格,商品描述等与您网站上的交易相符。此检查提供额外的防欺诈保护。

  • 如果验证的响应通过了检查,请根据txn_type的值执行操作 变量如果存在;否则,根据reason_code的值采取行动 变量

  • 如果回复为INVALID,请保存该邮件以供进一步调查

答案 1 :(得分:3)

你的IPN脚本正在发生一些事情,导致它失败很多。这可能发生在脚本的最底层,所以你期望看到的所有事情都会发生,但是500错误会被发送回PayPal。

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

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

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

答案 2 :(得分:2)

您必须回复空200响应,以便在处理响应数据后向PayPal指示IPN已正确接收

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


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

获得空200响应后,PayPal将不会发送更多响应,因为它知道响应已成功传递给ipn-handler。

答案 3 :(得分:0)

您必须回复empty 200 response,以便在处理响应数据后向PayPal表明已正确接收IPN

public function yourIpnHandler(){

    //response verification and processing goes here

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

获得空200响应后,paypal将不会发送更多回复,因为它知道响应已成功传递到