我正在使用 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>
这安全吗?
用户只需在自己的代码中更改支付金额即可减少支付。即使我设置客户端代码在交易成功后发送交易 ID(即在 onApprove 发出 POST 请求),以便我可以让服务器端代码检查发送的金额是否正确,客户端仍然可以更改他这边的代码来发送假交易 ID。
我基本上需要一种机制来在交付产品之前检查我是否确实收到了正确的金额。我显然需要在服务器端进行此检查,但我无法找到一种安全的方法来执行此操作,因为我需要从客户端获取一些可能是假的信息。如何防止用户假装已付款(例如通过发送过去的交易 ID)?
任何用于跟踪哪些付款是真实的以及正确金额的逻辑都必须位于您的服务器上。
对于 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 详细信息,因为前端必须处理此类情况。
我对这个理论做了一些测试,在五分钟或更短的时间内,我能够重做客户端 JavaScript 中的代码,并为我购买的产品支付我想要的任何费用(这是在测试环境中)。
我在这里缺少什么,但不会使客户端代码完全不安全。