PayPal IPN 在付款完成数小时后发送多个通知
Posted
技术标签:
【中文标题】PayPal IPN 在付款完成数小时后发送多个通知【英文标题】:PayPal IPN sends multiple notifications hours after payment completed 【发布时间】:2013-11-10 00:17:54 【问题描述】:在 IPN 文档中有这一行:
为了处理传输和接收延迟或失败的可能性,IPN 消息服务实现了重试机制,以不同的时间间隔重新发送消息 直到您确认消息已成功接收。
IPN 发送相同的通知 9 次...我需要发回什么?我的脚本中没有错误。如果我使用 IPN 模拟器,我会收到以下消息:
IPN发送成功
那么模拟器似乎可以告诉消息正在正确发送但真正的通知者不能?
如果这有什么不同,我正在使用沙盒?
收到通知后是否需要打印任何内容?
【问题讨论】:
我们可以在将帖子数据处理为 header("HTTP/1.1 200 OK"); 后以空响应确认 PayPal。所以以后不会再有回复了。 【参考方案1】:无需担心多重通知。首先发回 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 的响应,该响应为已验证或无效。
如果响应已验证,请执行以下检查:
确认付款状态已完成。 PayPal 也会发送 IPN 消息以处理待付款和拒绝付款;在付款完成之前不要发货。
使用事务 ID 来验证事务尚未处理,从而防止重复事务被处理。
通常,您将事务 ID 存储在数据库中,以便知道您只处理唯一事务。
确认收件人的电子邮件地址已注册给您。此检查可提供额外的防欺诈保护。
验证价格、商品描述等是否与您网站上的交易相符。此检查可提供额外的防欺诈保护。
如果验证响应通过检查,则根据 txn_type 的值采取措施 变量(如果存在);否则,根据 reason_code 的值采取措施 变量。
如果响应无效,请保存消息以供进一步调查
【讨论】:
感谢您的回复。我正在做所有被要求的事情。我使用 _notify-validate 按顺序返回 IPN 变量,这是我的脚本所做的第一件事。我得到了 VERIFIED 响应。你说我不需要担心多个通知。这正在推广到数千个客户。 1 条通知和 9 条通知之间的差异是每周大约有 20 万条通知被丢弃。这在计划中并不是什么大问题,但如果可能的话,我想避免这种情况。 @Damodaran 我们可以在将帖子数据处理为header("HTTP/1.1 200 OK");
后以空响应确认PayPal。所以以后不会再有回复了。【参考方案2】:
您的 IPN 脚本出了问题,导致它经常失败。这可能发生在脚本的最底部,因此您希望看到的一切都会发生,但随后会向 PayPal 发送 500 错误。
您是否检查过您的 PayPal IPN 历史记录以查看其中显示的内容?你可能会看到很多错误。此外,您还需要检查您的 Web 服务器日志,以查看该脚本被命中时发生的错误。
这可能只发生在某些订单上。例如,我经常看到有人在进行数据库更新或类似的事情,而像 O'Reilly 这样的名字会破坏他们的脚本,因为他们没有正确处理撇号。
查看您的网络服务器日志应该会显示错误发生的位置,然后您可以运行一些测试来帮助找出问题。我喜欢创建一个基本的 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-handler。
【讨论】:
【参考方案4】:您必须回复 empty 200 response
以向 PayPal 表明在处理响应数据后正确收到了 IPN
public function yourIpnHandler()
//response verification and processing goes here
header("HTTP/1.1 200 OK");
收到空的 200 响应后,paypal 将不会发送更多响应,因为它知道响应已成功发送到
【讨论】:
以上是关于PayPal IPN 在付款完成数小时后发送多个通知的主要内容,如果未能解决你的问题,请参考以下文章
设置 PayPal 即时付款通知后,我可以追溯重新发送历史交易的 IPN 吗?