3

我一直在尝试让 django-paypal 应用程序在我的 Django 项目中工作。我正在使用dcramer fork和 Django 1.4。我还在使用带有企业和个人帐户的 Paypal 开发人员帐户,通过 Paypal 沙盒网站处理交易。

如果我没有连接到payment_was_successful信号的接收器功能,事情似乎按预期工作。事务发生后,paypal_ipn在数据库表中创建一个新行,该行的值为“VERIFIED” response。Paypal IPN 日志报告此交易没有重试。

当我确实将接收器功能连接到payment_was_successful信号时,该paypal_ipn表包括两个新行,created_at时间戳相隔 10-15 秒。它们在响应列中的值都为“VERIFIED”,但两者中的后者被标记为flag_info如下所示:

'重复 txn_id。(5M907276M1007902B)'

Paypal 商业账户报告 IPN 被重试 1 次。

我找到了可能的解决方案,其中提到了将dispatch_uid接收器功能连接到我尚未尝试的信号时的使用。我的问题是我查看了相关的 django-paypal 源代码,但我不明白为什么 Paypal 会在验证第一个回发后重试 IPN。

有没有其他人遇到过这个问题并找到了他们理解的解决方案?


更新:

我发现我的接收器函数代码中有一个错误,这会引发异常。现在我已经解决了这个问题,Paypal 不再重试 IPN。我很高兴问题已经消失,但我仍然无法弄清楚它为什么会发生。

以下是数据库中最近重复记录的摘录。请注意,第一行是在下一行之前至少 10 秒创建和更新的。

created_at                       updated_at                       response    flag
2013-02-03 07:53:56.628013+00    2013-02-03 07:53:56.628057+00    VERIFIED    FALSE
2013-02-03 07:54:07.393795+00    2013-02-03 07:54:07.403008+00    VERIFIED    TRUE
4

1 回答 1

7

我已经弄清楚了这一点。简短的回答是确保您的接收器功能正常工作。

当 Paypal 向您指定的 URL 发送 IPN 时,他们会期待 HTTP 状态代码为 200 的响应。如果响应代码是其他代码,他们将重试。即使您处理回调并收到已验证消息,来自 Paypal 的 IPN 也需要 200 OK 响应。

我查看了我的 Apache 访问日志,发现当我的payment_was_successful信号接收器函数出现错误时,paypal 的初始 IPN 收到了 HTTP 状态代码 500。

django-paypal 包HttpResponse("OKAY")仅在处理完其他所有内容后才会响应,包括返回“已验证”的 Paypal 回传、PayPalIPN保存到数据库的对象以及发送信号。当我的信号接收器函数出现问题并引发未处理的异常时,Django 以 HTTP 状态代码 500 进行响应。

当 Paypal 重试 IPN 时,django-paypal 包检测到重复的 txn_id 并发送payment_was_flagged信号。我的这个信号的接收函数没有错误,所以 Paypal 收到了它所期望的 HTTP 状态代码 200 并停止重试。

希望这对将来的其他人有所帮助。

于 2013-02-04T11:25:21.757 回答