服务器如何知道付款是真正通过 PayPal 客户端 REST API 完成的?

How can a server know a payment was truly made via PayPal client side REST API?

我在看 PayPal 交互集成演示 link

在用户完成支付流程后的某个时刻,客户端到达代码:

 // onAuthorize() is called when the buyer approves the payment
            onAuthorize: function(data, actions) {

                // Make a call to the REST api to execute the payment
                return actions.payment.execute().then(function() {
                    window.alert('Payment Complete!');
                });
            }

在真实场景中,我可能想向服务器发送一条指令以发送产品或更新用户计划,而不是警报。它可能会通过 HTTP POST 请求完成。

服务器如何知道确实进行了付款,而不是黑客手动发送 http post 请求的结果?

你的想法是正确的,服务器无法知道是否真的付款了。此客户端 API 用于捐赠之类的事情,不需要向任何服务器发出请求。然后可以使用客户端回调向用户显示 "thank you" 注释或类似内容。

对于大多数情况(如在线商店等),您会希望使用 server API。这样,PayPal 服务器 将向您的服务器发送一个请求,这样您就可以验证它是否真的是一个真正的付款确认。

actions.payment.execute() 之后,您可以调用您的服务器并让它进行 GET 调用以验证付款已完成:https://developer.paypal.com/docs/integration/direct/express-checkout/integration-jsv4/advanced-payments-api/show-payment-details/

1) 在您的数据库中生成一个包含付款详细信息的唯一参考服务器端。例如:

我的贝宝参考资料table

| Amount: .00 | Reference: ECHI5786786 |

2) 在执行支付之前在您的交易对象中传递支付参考。

"transactions": [
 {
  "amount": {
    "total": "1.99",
    "currency": "USD"
  },
  "soft_descriptor": "ECHI5786786" //this is your unique reference
]

3) 在您的 PayPal 应用配置中,在开发者网站上,为 "payment sale completed" 设置一个到您的服务器的 webhook。 PayPal 将致电您的 url 并提供交易详情,包括唯一参考。将详细信息记录在您的数据库中。例如

我的 paypal 已确认完成付款 table

| Amount paid: .00 | Reference: ECHI5786786 |

4) 当 PayPal 客户端确认付款完成后,向您的服务器发送请求以确认付款详情

// Make a call to the REST api to execute the payment
return actions.payment.execute().then(function() {
  //ajax to your server here with "soft_descriptor"
  //if ajax success, then all good
});

服务器端确认

确认引用在两个 table 中并且金额匹配