我正在尝试用react paypal-快递-结帐实现一个安全的支付选项.但是我看到用户可以很容易地用chrome工具改变数量..。我不应该从我的服务器向paypal发出API请求并用我的DB验证金额吗?我看不出有什么办法可以用贝宝.
这是我的代码:
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);发布于 2018-12-01 20:35:32
Paypal允许来自客户端和服务器的两种类型的使用。我想客户可以修改他们的请求,以减少费用。但是,最终,不管你的生意是什么,你都会收到订单和付款。只需检查付款是否与它应该是不同的,不履行订单,作出退款。
如果您想节省麻烦,那么使用通过您的服务器进行付款的服务器选项。
在任何情况下,与任何其他支付方法一样,我建议您自己花时间实现它,遵循Paypal提供的优秀且有良好文档的API。他们有很多例子和用例,有浏览器和服务器的代码。
发布于 2018-12-07 11:16:29
永远不要相信来自客户端的价值。您应该绝对验证服务器端的金额。
正如@jorbuedo所说,您可以创建一个服务器集成,这样就不会公开客户端的值。向服务器发送会话ID或订单号或其他内容,从DB检索订单,并执行重定向到PayPal以处理事务服务器端。
或者,您可以保留所拥有的客户端内容,但在事务完成后进行验证。您可以使用即时付款通知或较新的韦布胡克斯来完成此操作。
您可以将一个custom变量传递到<PaypalExpressButton ...>的paymentOptions属性中,然后使用此值验证已在IPN中支付的正确金额。
例如:
<PaypalExpressButton
client={client}
currency="USD"
total={this.state.amount}
paymentOptions={{
custom: this.props.sessionId
}}
/>然后,作为IPN的一部分,您可以从DB中提取会话ID,检查预期的支付金额(您需要存储它,或者根据根据会话ID保存的项目/价格计算)是否与Paypal提供的支付金额相同(例如,mc_gross)。作为IPN一部分获得的变量的完整列表是可用的这里。
使用IPN不收费。如果您不想构建这个流,那么您必须手动验证每个订单,以确保数量是正确的。如果您正在运行一些小的东西,这可能是一个可以接受的折衷方案。
编辑:不要仅仅将预期的金额作为自定义变量发送,并将其与mc_gross值进行比较,因为这也可以使用F12或浏览器扩展进行更改。该值需要是不透明的,您可以将服务器端转换为有意义的东西。
发布于 2018-12-07 14:37:40
@jorbuedo和戴夫所罗门给出了很好的关于安全的答案,你应该把它们考虑进去。
但是,如果你真的不想让用户改变你的组件状态和道具,你可以用这个黑客来禁用Devtools。
if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__) {
window.__REACT_DEVTOOLS_GLOBAL_HOOK__.emit = function() {};
}基本上,它模拟了一些react-devtools方法,而Devtool无论如何也找不到您的组件树。
此答案仅用于禁用用户编辑组件。这不是最好的安全解决方案)
https://stackoverflow.com/questions/53545118
复制相似问题