【问题标题】:How can I ensure the security of my payment system via PayPal?如何通过 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 功能,付款完成后会通知您。有了这个,您可以放心,付款是通过贝宝进行的。我自己没有尝试过,但我想这就是它的工作原理。

标签: javascript paypal payment


【解决方案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

    【讨论】:

      猜你喜欢
      • 2012-08-31
      • 2019-04-28
      • 2014-06-24
      • 2014-05-16
      • 2011-04-14
      • 1970-01-01
      • 2014-10-26
      • 2018-07-28
      • 2023-01-18
      相关资源
      最近更新 更多