是否保证 webhook *在*客户端智能支付按钮 .then() 之后被触发?

Is it guarranteed that a webhook will be triggered *after* client-side Smart Payment Buttons .then()?

我正在使用 PayPal (checkout/REST API) 集成的网站工作,该网站需要将表单中的数据保存到数据库 table。据我所知,不可能让 PayPal 将以表单形式收集的数据发送到 webhook 以将其保存到数据库。我通过首先使用 orderID 保存为挂起,然后在 webhook 中将具有相同 orderID 的记录更新为未挂起来解决这个问题。

但是,这种方法依赖于这样一个事实,即在将 webhook 保存到数据库后调用(通过 AJAX 在客户端调用)。这确实似乎总是如此。我可以依赖被调用的 webhook 吗?

这里是 JavaScript 代码,与我正在使用的代码相同:

paypal.Buttons({
    createOrder: function(data, actions) {
      return actions.order.create({
        purchase_units: [{
          amount: {
            value: '0.01'
          }
        }]
      });
    },
    onApprove: function(data, actions) {
      return actions.order.capture().then(function(details) {
        alert('Transaction completed by ' + details.payer.name.given_name);
        // Call your server to save the transaction
        return fetch('/paypal-transaction-complete', {
          method: 'post',
          headers: {
            'content-type': 'application/json'
          },
          body: JSON.stringify({
            orderID: data.orderID
          })
        });
      });
    }
  }).render('#paypal-button-container');
</script>

onApprove 中的 AJAX 调用是否会在调用 webhook 之前可靠地发生?

通常是的,但我会犹豫说 "reliably",因为在某种程度上你依赖于客户端行为。

另一种解决方案是在付款设置期间传递 "CUSTOM" 参数,该参数将在批准后(在详细信息中)返回给您,并作为通知 webhook 的一部分返回给您。

另一种替代解决方案是集成服务器端解决方案,例如此骨架演示中的一个:https://developer.paypal.com/demo/checkout/#/pattern/server。使用此解决方案,直到 fetch( XHR 到您的服务器之后才会创建 PayPal 交易,然后必须直接 API 调用 paypal 以捕获 v2/order ,并将立即收到API 对 success/failure 的响应,然后可以在一个原子操作中将所有必要的数据存储在数据库中。此服务器端解决方案的一个好处是它不以任何方式依赖于异步 webhook。这是最稳健的解决方案。