如何通过 PayPal 确保我的支付系统的安全性?
Posted
技术标签:
【中文标题】如何通过 PayPal 确保我的支付系统的安全性?【英文标题】:How can I ensure the security of my payment system via PayPal? 【发布时间】:2018-11-01 21:43:03 【问题描述】:如何确保通过 PayPal 支付系统的安全性?
我使用vue-paypal-check 为付款创建前端 PayPal 按钮。
代码如下:
<Pay-Pal
v-if="paypal_live_id && paypal_sandbox_id"
:amount="amount"
currency="USD"
:client="credentials"
:env="paypal_env"
@payment-authorized="payment_authorized_cb"
@payment-completed="payment_completed_cb"
@payment-cancelled="payment_cancelled_cb"
:items="pay_items"
>
</Pay-Pal>
下面是一些dota:
data()
return
paypal_env: this.$GLOBAL_CONST.PAYMENT.PAYPAL_ENV,
paypal_sandbox_id: undefined,
paypal_live_id: undefined,
,
computed:
credentials()
return
sandbox: this.paypal_sandbox_id,
production: this.paypal_live_id,
,
,
支付成功的回调方法:
payment_completed_cb(res)
some method to access API for payment success // there will request the API for change the order status or reduce the balance.
,
但是我有一个问题,如果客户的某个人对技术有恶意,他会直接拨打payment_completed_cb
,而不是通过paypal付款。
如何防止这种情况发生?
【问题讨论】:
您可以使用 paypal 的IPN 功能,付款完成后会通知您。有了这个,您可以放心,付款是通过贝宝进行的。我自己没有尝试过,但我想这就是它的工作原理。 【参考方案1】:在您的 Paypal 的服务器和您的服务器之间的前端结账流程之外,需要有一个服务器到服务器的通信。
您可以为此使用Instant Payment Notification (IPN)。
vue-paypal-check 表明您可以在其中输入 IPN 网址(使用notify-url
)
<PayPal
amount="10.00"
currency="USD"
:client="credentials"
notify-url="<your-ipn-url>">
</PayPal>
根据 Paypal,您不应等待 IPN 通知完成结帐流程,但也不应在收到订单之前履行订单。
直接调用payment_complete_cb
可以做的最糟糕的事情是进入一些毫无意义的结帐完成页面。但是,如果不付款,他们将无法从您那里获得商品。
【讨论】:
【参考方案2】:这无法在前端安全地处理。正如您所指出的,有人可以手动调用 payment_completed_cb
函数。
您拥有的代码纯粹是为了用户体验。有人点击购买,他们去贝宝,购买,被重定向回来,你的网站说“谢谢”。这就是那个函数应该做的,处理一些谢谢提示的显示。
付款可能看起来已经完成,但可能需要一些时间才能解决。因此,paypal 将回复 “看起来不错” 消息并将客户重定向回您的网站。并且后来真正完成了传输。例如,如果在处理交易时,Paypal 认为它看起来具有欺诈性,他们可以取消付款。
为了解决所有这些问题,付款确认的实际处理将在服务器上进行。您可以将 Paypal 配置为在实际确认付款时 ping 您选择的服务器(它也会对客户隐藏)。这称为即时付款通知 (IPN)
这张图说明了交易流程。
图片来自ipn introductory post
您可以使用 NodeJS 执行此操作,并将其作为 Serverless 函数部署到 AWS(前一百万个请求免费)。或部署到免费的Heroku 实例。这些都是便宜的选择,但如果服务器空闲,启动时间会很短。以我的经验,它只需 200-300 毫秒即可开始。这对于响应 html 请求来说太长了,但对于处理来自某些后台 API 的最终 ping 来说是完美的。
来自paypal ipn的示例节点实现
var ipn = require('paypal-ipn');
ipn.verify(params, function callback(err, msg)
if (err)
console.error(err);
else
// Do stuff with original params here
if (params.payment_status == 'Completed')
// Payment has been confirmed as completed
);
//You can also pass a settings object to the verify function:
ipn.verify(params, 'allow_sandbox': true, function callback(err, mes)
//The library will attempt to verify test payments instead of blocking them
);
有关集成步骤的深入指南,Paypal 有文档Paypal IPN
【讨论】:
以上是关于如何通过 PayPal 确保我的支付系统的安全性?的主要内容,如果未能解决你的问题,请参考以下文章