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

How can I ensure the security of my payment system via PayPal?

如何通过 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付款。

我该如何防止这种情况发生?

这不能在前端安全地处理。正如您所指出的,有人可以手动调用该 payment_completed_cb 函数。

您拥有的代码纯粹是为了用户体验。有人点击购买,他们转到贝宝,购买,被重定向回来,您的网站说 “谢谢”。这就是该功能应该做的所有事情,处理一些感谢提示的显示。

付款可能看起来已经完成,但可能需要一些时间才能解决。因此,贝宝将以 “看起来不错” 消息进行响应,并将客户重定向回您的网站。之后才真正完成transfser。举个例子,如果在处理交易时 Paypal 认为它看起来像是欺诈,他们可以取消付款。

为了解决所有这些问题,付款确认的实际处理将在服务器上进行。您可以将 Paypal 配置为在实际确认付款时 ping 您选择的服务器(它也会对客户隐藏)。这称为即时付款通知 (IPN)

这张图片说明了交易流程。

图片来自此ipn introductory post

您可以使用 NodeJS 执行此操作并部署为 Serverless function to AWS (first million requests free). Or deploy to a free 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 服务器和您的前端结帐流程之外,需要有一个服务器到服务器 通信。

您可以为此使用 Instant Payment Notification (IPN)

vue-paypal-check 显示您可以将 IPN url 放入(使用 notify-url

<PayPal
  amount="10.00"
  currency="USD"
  :client="credentials"
  notify-url="<your-ipn-url>">
</PayPal>

对于 Paypal,您不应等待 IPN 通知完成结帐流程,但在收到订单之前也不应履行订单。

直接调用 payment_complete_cb 最糟糕的情况是进入一些无意义的结帐完整页面。但是,如果不付款,他们将无法从您那里获得商品。