如何通过 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 确保我的支付系统的安全性?的主要内容,如果未能解决你的问题,请参考以下文章

贝宝支付处理

如何在 PayPal 支付网关中集成 3D Secure 身份验证?

如何通过 IPN 使用 Paypal 自适应支付?

如何从多个授权交易中仅捕获一笔交易?

paypal怎么线下支付

在IPN上无法获得Paypal“验证”或“无效”