txn_id 和 payment_status 使 PayPal IPN 独一无二?

Posted

技术标签:

【中文标题】txn_id 和 payment_status 使 PayPal IPN 独一无二?【英文标题】:txn_id and payment_status makes PayPal IPN unique? 【发布时间】:2015-06-09 12:00:33 【问题描述】:

我正在使用 PayPal IPN,但我有以下问题:是否有可能有两个具有相同 txn_id 和 payment_status 参数的 IPN 消息?

例如:

    IPN:txn_id=4BB79227HY951745W&payment_status=pending IPN:txn_id=4BB79227HY951745W&payment_status=idontknowwhat IPN:tnx_id=4BB79227HY951745W&payment_status=pending IPN:txn_id=4BB79227HY951745W&payment_status=完成

所以我的问题基本上是 txn_id 和 payment_status 一起使消息唯一吗?

另一个例子:

如果我有这样的 SQL 查询:

SELECT * FROM transactions WHERE txn_id=4BB79227HY951745W AND payment_status=something

它可以返回多行吗? (如果由于缺少 200 OK 响应消息或响应时间慢或类似情况,我没有存储 PayPal 重新发送的任何消息。)

我之前读过这个帖子:PayPal IPN unique identifier。这里听起来这两个参数使消息独一无二,但我不确定。

【问题讨论】:

恕我直言,这与“唯一性”本身无关,因为 IPN 是一种消息传递服务(在交易的更改状态上)。它甚至有“重试”,如IPN Protocol 中所述,您引用/链接到的帖子的答案中对此进行了讨论。 感谢您的回答。我理解这一点,但我想存储与交易相关的所有内容,但我不想存储任何内容超过一次。因此,在我以某种方式将交易数据保存到我的数据库后,我必须知道是否发送了新的 IPN 消息,因为该交易“改变”了某些东西,或者它只是由于某种原因由 PayPal IPN 服务重新发送。 【参考方案1】:

我认为仅txn_idpayment_status 不足以使 IPN 独一无二。由于您希望保存与给定交易相关的每个 IPN,因此您还应该检查 pending_reason 值:

假设您使用Authorization - Capture 模型创建了一个事务,并且您的事务通过Instant Payment Review (IPR)。您将拥有类似 IPN 的内容:

IPN 1:TXN 进入 UNDER REVIEW (IPR)

[payment_status] => Pending
[txn_id] => 0CD48848U16230847
[pending_reason] => paymentreview
[txn_type] => express_checkout
[auth_status] => Pending
[ipn_track_id] => 8c7559d39005

IPN 2:TXN 已通过 IPR(注意未决原因已更改!)

[payment_status] => Pending
[txn_id] => 0CD48848U16230847
[pending_reason] => authorization
[txn_type] => express_checkout
[auth_status] => Pending
[ipn_track_id] => 8c7559d39005

【讨论】:

我已经用 db 时间戳和其他“双重检查”解决了这个问题,但你说的有道理并回答了我的问题。接受!

以上是关于txn_id 和 payment_status 使 PayPal IPN 独一无二?的主要内容,如果未能解决你的问题,请参考以下文章

用于电子支票的 PayPal IPN

PayPal 的交易 ID (txn_id) 的长度和类型是多少?

快速结帐:待处理后 ipn 中的 payment_status 字段的可能值

Paypal IPN payment_status 说已完成但付款被拒绝

关于 payment_status 的帮助 PayPal Refunded Reverted Partial Refunded IPNs

未设置 PayPal IPN $_POST['txn_id']