在 PayPal 和 Stripe 中使用 Javascript 设置付款金额

Posted

技术标签:

【中文标题】在 PayPal 和 Stripe 中使用 Javascript 设置付款金额【英文标题】:Payment amount set with Javascript in PayPal and Stripe 【发布时间】:2020-03-20 13:55:12 【问题描述】:

我一直在使用 Stripe 和 PayPal php API 来实现支付。使用 JS API 对我来说仍然是个谜。所以以 Braintree Sofort/Klarna 的这个 sn-p 为例:

function createLocalPaymentClickListener(type) 
    return function (event) 
        event.preventDefault();

        localPaymentInstance.startPayment(
              paymentType: type,
              amount: '10.67'
            ...
        
    ;

10.67 的金额是通过 javascript 设置的,在用户单击 Sofort 付款按钮后,我无法确认该金额,因为覆盖已打开,大部分付款由 PayPal / Klarna 处理。只返回一个支付令牌。对此有所了解的用户可以轻松地操纵该金额并支付他/她自己设定的不同金额。

我怎样才能确保这个金额不能更改?

【问题讨论】:

【参考方案1】:

您是对的,通过更简单的客户端集成,恶意客户端通常可以更改他们将批准的金额。除了切换到更服务器端的集成方案外,没有任何防范措施,其中金额在对支付网关的 API 调用中设置。

但是,客户设置他们要批准的金额并不一定是个问题。以 Braintree 为例,实际捕获(在客户端批准后)发生在您的服务器上。因此,如果金额或任何其他详细信息有误,您可以立即丢弃付款,而不继续进行任何会实际创建交易的捕获。

【讨论】:

【参考方案2】:

选项 1: 就算用户修改金额,也要遵循这个机制

验证交易参考:https://developer.paypal.com/docs/checkout/integrate/

服务器端

Set up your server to make calls to PayPal
Set up your server to receive a call from the client with the order ID
Call PayPal to get the transaction details
Handle any errors from the call
Validate the transaction details are as expected
// 5. Validate the transaction details are as expected
  if (details.purchase_units[0].amount.value !== '5.77') 
    return response.send(400);
  
Save the transaction in your database
Return a successful response to the client

选项 2: 查看是否可以加密数据 https://www.paypal.com/cgi-bin/webscr?cmd=p/xcl/rec/ewp-techview-outside

有一个页面重定向机制并阻止用户查看金额。在跨不同页面发送数据时,使用上面建议的加密机制

一般注意,永远不要相信来自客户端的数据。这就是为什么我们也有服务器端验证......即使我们有客户端验证,用户也可以绕过它。

【讨论】:

以上是关于在 PayPal 和 Stripe 中使用 Javascript 设置付款金额的主要内容,如果未能解决你的问题,请参考以下文章

在 Paypal API 与 Stripe API 中进行测试?

是否可以使用 paypal 或 Stripe 进行自动付款

如何使用 Paypal 或 Stripe 向一位收款人延迟付款?

Omnipay:将钱从 PayPal 账户转移到 Stripe 账户

PayPal Adaptive Payments 和 Stripe 的更便宜的替代品

什么是与 Stripe Connect 等效的 PayPal REST API?