【问题标题】:PayPal IPN unique identifierPayPal IPN 唯一标识符
【发布时间】:2012-03-03 15:46:46
【问题描述】:

我一直认为与 IPN 消息一起发送的txn_id 是唯一的。 PayPal 指南似乎支持这个想法 - https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNIntro

避免重复的 IPN 消息。检查您是否尚未处理由 IPN 消息中返回的交易 ID 标识的交易。您可能需要将 IPN 消息返回的事务 ID 存储在文件或数据库中,以便检查重复项。如果 PayPal 发送的交易 ID 重复,请不要再次处理。

但是我发现 PayPal 的 eCheck 支付 IPN 使用相同的交易 ID 发送了两次。首次付款期间,payment_status 为“待处理”,几天后电子支票实际处理中,payment_status 为“已完成”。

我想存储两个交易,但仍想避免存储重复。 IPN 中还有另一个字段称为ipn_track_id,这两种交易都不同,但我找不到它的文档,除了这个模糊的描述:

内部;仅供 MTS 和 DTS 使用

还有其他人在使用ipn_track_id 来唯一标识 IPN 消息吗?

【问题讨论】:

  • 在逻辑上它是一个事务,因此相同的 txn_id。将 payment_status 添加到(主)键可以解决这个问题,不是吗?文档可能应该是:不应再次处理相同状态的 txn_id。
  • 有道理,谢谢你的建议。
  • 值得注意的是,您应该只根据 PayPals IPN 指南处理 payment_status="Completed" 的交易。
  • @steve 我依赖 payment_status="Completed" 其中我的 BIN btn 被删除并且交易进入我的数据库。希望这是一个好方法。
  • 我觉得只有在 payment_status='Completed' 时才应该检查 txn_id 的唯一性。因为没有文档提到 payment_status 和 txn_id 组合的唯一性,如果两个具有相同 txn_id 的“待处理”访问您的数据库,您的程序可能会中断。正如我所说,这是我的直觉,Paypal 应该在文档中更清楚地说明。

标签: paypal paypal-ipn


【解决方案1】:

ipn_track_id 不应使用;主要是因为这仅供内部使用,并且因为它对于每条 IPN 消息都是唯一的。
txn_id 对于每个事务是唯一的,而不是每个 IPN 消息。

这意味着什么;一个事务可以有多个 IPN 消息。例如,电子支票,默认情况下它将进入“待处理”状态,一旦电子支票被清除,它将进入“完成”状态。
但您也可能会看到针对同一 txn_id 的撤销、取消撤销、已开立案件和退款。

伪代码:

If not empty txn_id and txn_type = web_accept and payment_status = Completed  
    // New payment received; completed. May have been a transaction which was pending earlier.
    Update database set payment_status = Completed and txn_id = $_POST['txn_id']  

If not empty txn_id and txn_type = web_accept and payment_status = Pending  
    // New payment received; completed  
    Update database set payment_status = Pending and payment_reason = $_POST['pending_reason'] and txn_id = $_POST['txn_id']

您可以在https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_IPNandPDTVariables#id08CTB0S055Z 上找到更多 IPN 变量

基本上; PayPal 将生成一个唯一的卖家交易 ID。此交易 ID 在“完成”之前可能会经历多个阶段,因此您需要能够处理这些异常。

关于 PayPal 在文档中的说明:如果在交付过程中遇到错误,PayPal 可能会重新发送单个 IPN 消息。例如,当 PayPal POST 向其发送 IPN 数据时,您的脚本需要返回正确的 HTTP/1.1 200 OK HTTP 状态响应。
如果您没有返回 HTTP/1.1 200 OK 响应,PayPal 将重新尝试发送相同的数据,每条 IPN 消息最多发送 16 次。

注意:卖家的交易 ID 与买家的交易 ID 不同,因为它们是两种不同的操作(一个借记,一个贷记)。

【讨论】:

    【解决方案2】:

    ipn_track_id 对于定期付款不是唯一的。至少对于分期付款计划来说不是。 当客户创建分期付款计划时,如果您的计划在结帐时首次付款,您将收到 2 条具有相同 ipn_track_id 的 IPN 消息(示例如下)。

    第一次通知“recurring_payment_profile_created”第一次付款“recurring_payment”

    计划创建的 IPN

     [txn_type] => recurring_payment_profile_created
     [recurring_payment_id] => I-57UAPHFJ3SBY
     [product_name] => Risk-Free Trial
     [time_created] => 06:24:39 Aug 15, 2013 PDT
     [ipn_track_id] => bdd94fdee935a
    

    首次付款 IPN

     [txn_type] => recurring_payment
     [mc_gross] => 10.95
     [shipping] => 0.00
     [product_type] => 1
     [time_created] => 06:24:39 Aug 15, 2013 PDT
     [ipn_track_id] => bdd94fdee935a
    

    【讨论】:

    • 这个!这非常重要,应该在他们的文档中明确列出。对于经常性付款,不能依赖它是唯一的。
    【解决方案3】:

    并非所有 IPN 消息都包含 $_POST['txn_id'],因此如果您只检查 txn_id,您可能会间歇性地不记录不包含此密钥的 IPN 消息。

    【讨论】:

      【解决方案4】:

      在我的 PHP API 调用中,我使用这些字段并将它们存储在我的数据库中:

      custom=xxxx  
      

      (或invoice=ZZZZZZ

      然后,当您的页面收到 IPN 时,它应该(从数据库)检查 custom=xxxx 或等...

      【讨论】:

        【解决方案5】:

        IPN 交易是唯一的,更改付款的交易也会生成一个新的 txn_id。例如退款,因此最好存储与单次购买相关的所有 txn_id。到目前为止,我不知道除了退款之外的哪些交易会生成新的 txn_id,可能撤销也会产生。

        【讨论】:

        • 没有“IPN 交易”之类的东西。 - 正如 OP 所展示的那样,PayPal 的交易 ID 不是唯一标识 IPN 消息的方法。
        猜你喜欢
        • 2011-12-04
        • 2014-03-05
        • 2012-06-02
        • 2012-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多