【问题标题】:IPN listener for PayPal in Meteor appMeteor 应用中 PayPal 的 IPN 侦听器
【发布时间】:2016-04-13 18:08:02
【问题描述】:

我遇到了一个问题。 我正在尝试将 PayPal 按钮与流星应用程序集成。但是对于完整的功能,我需要使用 IPN 来处理。 因为我必须至少知道交易状态。 我已经有企业帐户,并且在路径上打开了 IPN:

    http://domein.com/ipn

我尝试使用PayPal documentation,但也无济于事。 我花了两天时间,仍然找不到任何有用的东西。 也许有人知道如何在流星应用程序中实现 IPN 侦听器?


【问题讨论】:

    标签: javascript node.js meteor paypal paypal-ipn


    【解决方案1】:

    编辑:Meteor 1.3+ 的更新

    我发布了一个大大简化了流程的软件包。包裹是planefy:paypal-ipn-listener

    先安装再打包:

    $ meteor add planefy:paypal-ipn-listener
    

    然后,在服务器代码中:

    import { IpnListener } from 'meteor/planefy:paypal-ipn-listener';
    
    const listener = new IpnListener({ 
       path: '/mypath', 
       allow_sandbox: true // in development
    });
    
    listener.onVerified((err, ipn) => console.log(ipn));
    listener.onError((err) => console.log(err));
    

    请参阅readme 了解更多选项。

    原始答案

    我也绞尽脑汁想弄清楚这一点。

    首先,如果您还没有以下包,请添加它们。

    meteor add meteorhacks:npm
    meteor add meteorhacks:picker
    

    如果你使用的是 iron:router,那么你实际上不需要meteorhacks:picker(见底部的更新)

    在您的应用程序根目录中创建一个 package.json(如果它不存在),并添加以下内容以告诉 meteorhacks:npm 需要安装哪些 npm 包:

    {
      "paypal-ipn" : "3.0.0",
      "body-parser": "1.14.1",
    }
    

    在服务器代码中,配置 Picker 以正确解析 JSON 请求/响应:

    const bodyParser = Meteor.npmRequire('body-parser');
    Picker.middleware(bodyParser.urlencoded({ extended: false }));
    Picker.middleware(bodyParser.json());
    

    同样在服务器代码中,定义一个 Picker 路由来处理传入的 IPN 消息

    Picker.route('/ipn', function(params, req, res, next) {
    
      res.writeHead(200);
    
      const ipn = Meteor.npmRequire("paypal-ipn");
    
      // create a wrapped version of the verify function so that 
      // we can verify synchronously
      const wrappedVerify = Async.wrap(ipn,"verify");
    
      let verified = false;
    
      // only handle POSTs
        if (req.method === "POST") {
    
        // PayPal expects you to immeditately verify the IPN 
        // so do that first before further processing:
            try {
    
                //second argument is optional, and you'll want to remove for production environments
                verified = wrappedVerify(req.body, {"allow_sandbox" : true});
    
            } catch (err) {
    
                // do something with error
    
            }
    
            if (verified === 'VERIFIED') {
    
                let payment = req.body;
    
                // do stuff with payment 
            }
    
        }
      res.end();
    
    });
    

    更新:如果您使用的是 Iron:router,则不需要使用 Picker。您可以直接使用 iron:router 定义一个仅服务器的路由器,如下所示:

    Router.map(function () {
        this.route('ipn', {
            path: '/ipn',
            where: 'server',
            action: function() {
                var ipn = Meteor.npmRequire("paypal-ipn");
                var wrappedVerify = Async.wrap(ipn, "verify");
    
                var request = this.request;
                var verified;
    
                if (request.method !== 'POST') {
    
                  this.next();
    
                } else {
    
                  try {
                    verified = wrappedVerify(request.body, {"allow_sandbox" : true});
                  } catch (error) {
                    //do something with error
                  }
    
                  if (verified === "VERIFIED") {
                    var payment = request.body;
                    //do something with payment
                  }
    
                  this.next();
                }
    
            }
        });
      });
    

    【讨论】:

    • 我使用的是 Iron-router,我可以同时安装和使用这两个包吗?
    • 你应该可以。 Picker 仅用于服务器端路由。您也可以使用 Iron 路由器定义一个仅限服务器的路由,我会更新我的答案
    • 我想我已经接近解决这个问题了)只是几个问题。我尝试过 IPN 模拟器,但它总是让我这么想。如果我们在服务器端定义 ipn 路径,paypal 将如何使用该路径做一些事情?
    • PayPal 正在将 POST 请求直接发送到您的服务器,这就是我们在那里定义路由的原因
    • @bluebird 我将您的代码用于 IPN 侦听器,但是当我测试它时,会打开新选项卡,告诉我定义客户端路由,请检查我的问题 stackoverflow.com/questions/36059753/…
    猜你喜欢
    • 2012-05-20
    • 2019-06-22
    • 2012-10-09
    • 1970-01-01
    • 2019-01-16
    • 2013-11-01
    • 2021-12-31
    • 2013-08-07
    • 2021-09-22
    相关资源
    最近更新 更多