【问题标题】:Secure payment with paypal使用贝宝安全付款
【发布时间】:2019-05-01 21:01:50
【问题描述】:

我正在尝试使用react-paypal-express-checkout 实施安全支付选项... 但我看到用户可以使用 chrome 开发工具轻松更改金额......我不应该从我的服务器向 paypal 发出 API 请求并使用我的数据库验证金额吗?我没有看到任何使用 paypal 的选项...

这是我的代码:

import React, { Component } from 'react';
import { connect } from 'react-redux';
import 'react-credit-cards/es/styles-compiled.css'
import './checkout.css';
import PaypalExpressBtn from 'react-paypal-express-checkout';

class CheckOut extends Component {
    constructor(props) {
        super(props);

        this.state = {
            amount: 40
        }
    }

    render() {
        const client = {
            sandbox: 'XXXX',
            production: 'Your-Production-Client-ID',
        }
        return (
                <PaypalExpressBtn client={client} currency={'USD'} total={this.state.amount} />
        );
    }
}


export default connect(CheckOut);

【问题讨论】:

  • 是否有任何答案可以帮助您解决您遇到的问题?如果是这样,请不要忘记将最有助于解决问题的答案标记为已接受。

标签: node.js reactjs paypal payment-gateway


【解决方案1】:

Paypal 允许来自客户端和服务器的两种类型的使用。我想客户可能会修改他们的请求以减少支付。但是,最终,无论您的业务是什么,您都会收到订单和付款。只需检查付款是否与应有的不同,如果不履行订单,请退款。

如果您想省去麻烦,请使用通过您的服务器进行支付的server option

在任何情况下,就像使用任何其他支付方式一样,我建议您花时间按照 Paypal 提供的出色且有据可查的 API 自行实施。他们有很多示例和用例,以及用于浏览器和服务器的代码。

【讨论】:

  • 我没有看到任何关于文档的好消息。
【解决方案2】:

永远不要相信来自客户端的值。您绝对应该在服务器端验证金额。

正如@jorbuedo 所说,您可以创建一个server integration,因此这些值永远不会暴露在客户端。将会话 ID 或订单号或其他内容发送到您的服务器,从您的数据库中检索订单,并执行重定向到 PayPal 以在服务器端处理交易。

或者,您可以保留您拥有的客户端资料,但在交易完成后验证交易。您可以使用Instant Payment Notifications 或更新的Webhooks 来执行此操作。

您可以将custom 变量传递给&lt;PaypalExpressButton ...&gt;paymentOptions 属性,然后使用该值来验证IPN 中支付的金额是否正确。

例如:

<PaypalExpressButton
  client={client}
  currency="USD"
  total={this.state.amount}
  paymentOptions={{
    custom: this.props.sessionId
  }}
/>

然后,作为 IPN 的一部分,您可以从数据库中提取会话 ID,检查预期付款金额(您需要存储或根据保存的项目/价格计算针对会话 ID)与 Paypal 提供的付款金额相同(例如mc_gross)。您可以通过here 获得作为 IPN 一部分的完整变量列表。

使用 IPN 不收取任何费用。如果您不想构建此流程,则必须手动验证每个订单以确保金额​​正确。如果您正在运行一些小程序,这可能是一个可以接受的折衷方案。

编辑:不要只是将预期金额作为自定义变量发送,并将其与 mc_gross 值进行比较,因为这也可以使用 F12 或 browser extension 进行更改。该值必须是不透明的,您可以将服务器端转换为有意义的值。

【讨论】:

    【解决方案3】:

    @jorbuedo 和 @Dave Salomon 给出了关于安全性的很好的答案,您应该考虑他们。

    但是,如果您真的不想让用户更改您的组件状态和道具,您可以使用此 hack 禁用 React Devtools。

    if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__) {
      window.__REACT_DEVTOOLS_GLOBAL_HOOK__.emit = function() {};
    }
    

    基本上它会模拟react-devtools 的一些方法,而Devtool 无论如何都找不到你的组件树。

    此答案仅用于禁止用户编辑您的组件。这不是安全的最佳解决方案)

    【讨论】:

      猜你喜欢
      • 2011-07-18
      • 2011-07-25
      • 2016-06-17
      • 2014-04-22
      • 2012-07-20
      • 2016-05-27
      • 2011-09-30
      • 2013-02-10
      • 2014-07-16
      相关资源
      最近更新 更多