PayPal Checkout:仅使用客户端代码接收付款是否安全?

PayPal Checkout: Is it safe to receive a payment with only client-side code?

我正在使用 PayPal API 将付款选项添加到我的网站。 In the tutorial they have,他们使用 JavaScript 渲染按钮并完全在客户端设置交易。这是示例代码:

<script>
  paypal.Buttons({
    createOrder: function(data, actions) {
      // This function sets up the details of the transaction, including the amount and line item details.
      return actions.order.create({
        purchase_units: [{
          amount: {
            value: '0.01'
          }
        }]
      });
    },
    onApprove: function(data, actions) {
      // This function captures the funds from the transaction.
      return actions.order.capture().then(function(details) {
        // This function shows a transaction success message to your buyer.
        alert('Transaction completed by ' + details.payer.name.given_name);
      });
    }
  }).render('#paypal-button-container');
  //This function displays Smart Payment Buttons on your web page.
</script>

这安全吗?

用户只需在自己这边的代码中更改支付金额即可,少支付。即使我将客户端代码设置为在交易成功后发送交易 ID(即在 onApprove 发出 POST 请求),这样我就可以让服务器端代码检查发送的金额是否为正确,客户仍然可以更改他这边的代码以发送假的交易 ID。

在交付产品之前,我基本上需要一种机制来检查我是否确实收到了正确的数量。我显然需要在服务器端进行此检查,但我无法找到一种安全的方法来执行此操作,因为我需要从客户端获取 some 信息,这可能是伪造的。如何防止用户通过发送过去的交易 ID 假装已付款?

您说得对,用户始终可以更改客户端代码中的金额,并发送较低金额的付款。这就是客户端付款的工作方式。

任何用于跟踪哪些付款是真实的且金额正确的逻辑都必须在您的服务器上。

对于 PayPal Checkout,这是您应该使用的前端 UI:https://developer.paypal.com/demo/checkout/#/pattern/server

您的服务器上需要两条相应的路由,一条用于 'Create Order',一条用于 'Capture Order'。您可以使用对 PayPal 的 Checkout-lanuagename-SDK's for the routes' API 调用之一,或者您自己的 HTTPS 实现,首先获取访问令牌然后进行调用。这两条路线都应该 return 只有 JSON 数据(没有 HTML 或文本)。在第二条路线中,当捕获 API 成功时,您应该验证金额是否正确并将其生成的付款详细信息存储在您的数据库中(特别是 purchase_units[0].payments.captures[0].id,这是 PayPal 交易 ID)并执行任何必要的操作在将您的 return JSON 转发给前端调用者之前 立即执行业务逻辑(例如发送确认电子邮件或预订产品)。如果出现错误,也会转发 JSON 详细信息,因为前端必须处理此类情况。