在哪里输入paypal IPNurl以及如何传递自定义数据?

Where to enter paypal IPN url and how to pass custom data?

这组题貌似很幼稚,但我实在找不到。

问题 1) 我正在尝试为 PayPal 实施 IPN。我想进入 The listener URL,但找不到位置。我在网上搜索过,所有的回复都是旧的。我可以把它放在哪里?

问题 2)我正在使用以下代码,我想传递自定义数据,以便当 IPN 向我发送回交易消息时,它会包含该自定义数据.我需要传递 2 个自定义数据。对于以下代码,这怎么可能?我真的在文档中也找不到这个。

<template>
  <div id="paypal-button-container"></div>
</template>

<script>
export default {
  props: ["amount"],
  mounted() {
    let self = this;
    paypal
      .Buttons({
        createOrder: function(data, actions) {
          // Set up the transaction
          return actions.order.create({
            purchase_units: [
              {
                amount: {
                  value: self.amount,
                }
              }
            ],
          });
        },
        onApprove: function(data, actions) {
          // Capture the funds from the transaction
          return actions.order.capture().then(function(details) {
            // Show a success message to your buyer
            console.log(details);
            self.$emit("paypalPaySuccess", {
              order_id: details.id,
            })
            alert("Transaction completed by " + details.payer.name.given_name);
          }).catch((err)=>{
          })
        }
      })
      .render("#paypal-button-container");
  }
};
</script>

补充一些问题

我正在使用仪表板中的所有事件。

我需要补充一些问题,因为我找不到我需要的信息。

问题 3) 在客户端,我做 action.orders.capture().then 。这意味着我立即获得资金。当 webhooks 来到我的后端时,有 2 个 webhooks 用于单次支付。 (PAYMENT.CAPTURE.PENDING and CHECKOUT.ORDER.APPROVED) 。 a) 为什么 PAYMENT.CAPTURE.COMPLETED 没有作为 webhook 事件到达? b) 如果我想获得 DENIED 事件怎么办?如果 PAYMENT.CAPTURE.COMPLETED 没有到达,PAYMENT.CAPTURE.DENIED 也不会到达。

问题 4) 正如我所说,我的后端出现了 2 个单笔付款的 webhook 事件。第一个里面有id。假设我将其作为 id 和 status(PENDING) 存储在我的数据库中。然后另一个事件发生了CHECKOUT.ORDER.APPROVED。现在,这个与前一个有不同的 id。所以我不能真正回到数据库并更新状态,因为它有不同的 ID。我应该怎么办?我注意到的一件事是,第二个事件在捕获的对象中的某处还有另一个 id(前一个事件)。这是我应该使用的吗?哪一个是最后的transaction_id?

问题 5) 结果 invoice_id 每次都应该是唯一的。所以我想传递 user_id,但我想我也应该生成随机字符串并将其附加到 user_id,如下所示:invoice_id: '7,randomstring'。对吗?

问题6)同一个事件有时会出现两次。这是为什么?我是否应该 return status 200 以使相同的事件不再发生? return那个状态什么时候好?我想我更新数据库后,对吧?

Q1: IPN 已弃用。您应该使用网络钩子,例如 CHECKOUT.ORDER.APPROVED

Q2:似乎没有任何特定的方式来传递自定义数据。

选项 1:

我最终做的是使用 purchase_units 中的 invoice_id 字段。我测试并发现我可以传递一个相当长的字符串并且它们不必是唯一的。看起来有点乱,但确实有效。

当您实现 CHECKOUT.ORDER.APPROVED webhook 时,您就可以解析 purchase_unit invoice_id.

中的数据

选项 2:

我考虑的另一个不需要破解 invoice_id 的想法是使用 详细信息 从 javascript,将该自定义信息连同订单 ID 一起存储在数据库中,然后当出现 webhook 时,将订单 ID 与保存的订单 ID 交叉匹配以检索信息。

我更喜欢选项 1,但您的需求可能会有所不同。

尽管整个 PayPal API 的设计多么糟糕,但它还是很能说明问题的。实施中存在巨大差距,文档很少,支持为零。

我也必须实施 Stripe。整个实施过程花了我 3 天时间。同样的 PayPal 实施花了我 3 个多星期的时间!缺乏文档、必须不断地尝试,以及沙箱实施的不一致是真正的时间杀手。