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

Thu*_*Sea 6 javascript payment paypal paypal-rest-sdk

我正在使用 PayPal API 将付款选项添加到我的网站。在他们的教程中,他们使用 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>
Run Code Online (Sandbox Code Playgroud)

这安全吗?

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

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

Pre*_*der 7

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

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

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

您的服务器上需要两条相应的路由,一条用于“创建订单”,一条用于“捕获订单”。您可以使用其中一个Checkout-lanuagename-SDK(编辑:尽管现在已弃用)来进行对 PayPal 的路由 API 调用,或者您自己的 HTTPS 实现,首先获取访问令牌,然后进行调用(有一个全栈主要 PayPal Checkout 指南中的 node.js 中的示例,但可以使用任何后端服务器语言来完成)。

两条路由都应仅返回 JSON 数据(无 HTML 或文本)。在第二条路线中,当捕获 API 成功时,您应该验证金额是否正确,并将其生成的付款详细信息存储在您的数据库中(特别purchase_units[0].payments.captures[0].id是 PayPal 交易 ID),并执行任何必要的业务逻辑(例如发送确认电子邮件或保留产品),然后返回的 JSON 转发给前端调用者。如果出现错误,也会转发其 JSON 详细信息,因为前端必须处理此类情况。