我该如何通过PayPal确保我的支付系统的安全性?

5

如何通过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 功能,该功能会在付款完成时向您发送通知。通过这种方式,您可以确保付款经过了 PayPal。我自己没有尝试过,但我想它就是这样工作的。 - Dev
2个回答

2
需要在您的前端结帐流程之外进行Paypal服务器和您的服务器之间的服务器对服务器通信。
您可以使用即时付款通知(IPN)来实现此目的。 vue-paypal-check 演示了您可以使用(带有notify-url)的IPN网址。
<PayPal
  amount="10.00"
  currency="USD"
  :client="credentials"
  notify-url="<your-ipn-url>">
</PayPal>

根据Paypal的规定,您不应该等待IPN通知完成结账流程,但也不应在收到通知之前履行订单。
如果有人直接调用payment_complete_cb,最糟糕的情况是他们只能进入一个无意义的结账完成页面。但是,他们不能在没有付款的情况下从您那里获得商品。

1
这在前端无法安全处理。正如您所指出的,有人可以手动调用 payment_completed_cb 函数。
您拥有的代码纯粹是为了用户体验。有人点击购买,他们进入PayPal,购买,被重定向回来,您的网站会显示“谢谢”。这就是该函数应该做的所有事情,处理一些感谢提示的显示。
付款可能看起来已经完成,但可能需要时间才能解决。因此,PayPal将以“看起来不错”的消息响应并将客户重定向回您的站点。稍后真正完成转账。一个例子可能是,在处理交易时,如果PayPal认为它看起来很欺诈,他们可以取消付款。
为了避免所有这些问题,实际的付款确认处理将在服务器上进行。您可以配置PayPal在实际确认付款时向您选择的服务器发送ping(客户也将被隐藏)。这称为即时付款通知(IPN)

此图片说明了交易流程。

这张图片来自ipn介绍帖 输入图像描述

你可以使用NodeJS完成此操作,并将其部署为AWS无服务器函数(前一百万个请求免费)。或者部署到免费的Heroku实例。这些都是便宜的选项,但如果服务器处于空闲状态,则启动时间很短。根据我的经验,只需要200-300毫秒,就可以开始处理后台API的事件响应。

Paypal ipn提供了一个Node实现示例

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的文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接