【问题标题】:PayPal Checkout: Is it safe to receive a payment with only client-side code?PayPal Checkout:仅使用客户端代码接收付款是否安全?
【发布时间】:2020-11-11 02:06:40
【问题描述】:

我正在使用 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。

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

【问题讨论】:

    标签: javascript paypal payment paypal-rest-sdk


    【解决方案1】:

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

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

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

    您的服务器上需要两条对应的路由,一条用于“创建订单”,一条用于“捕获订单”,documented here

    【讨论】:

    • 感谢您的回答。在前端示例中,您提供的 order-id 仍然由客户端提供,但我想用户无法通过提供不同的 order-id 找到黑客,对吧?
    • 没有一个可以完成任何事情,但您可以验证它是您在过去 48 小时内创建的并且尚未捕获的打开的
    • @PrestonPHX 我已经以这种方式设置了我的 PayPal 集成。 createOrderonApprove 由服务器端处理,一切正常。但是,我也有类似的担忧,比如@ThunderSea。我并不担心onApprove 回调中客户端更改了orderID 蜜蜂,但我必须传递我的productIDuserID 来创建数据库条目。有没有办法在createOrder 期间在订单对象中传递userID 之类的自定义数据,并在onApprove 期间使用服务器上的orderID 获取此数据?
    • 是的,在create的fetch body中发送
    • 很容易伪造从客户端到我们服务器的批准请求以完成挂单。我们可以做的是通过触发 onApprove 请求来检查支付状态表单服务器端。
    猜你喜欢
    • 2020-06-26
    • 2020-04-17
    • 1970-01-01
    • 2014-08-06
    • 2023-03-25
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多