Meteor 应用中 PayPal 的 IPN 侦听器
Posted
技术标签:
【中文标题】Meteor 应用中 PayPal 的 IPN 侦听器【英文标题】:IPN listener for PayPal in Meteor app 【发布时间】:2016-04-13 18:08:02 【问题描述】:我遇到了一个问题。 我正在尝试将 PayPal 按钮与流星应用程序集成。但是对于完整的功能,我需要使用 IPN 来处理。 因为我必须至少知道交易状态。 我已经有企业帐户,并且在路径上打开了 IPN:
http://domein.com/ipn
我尝试使用PayPal documentation,但也无济于事。 我花了两天时间,仍然找不到任何有用的东西。 也许有人知道如何在流星应用程序中实现 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 侦听器,但是当我测试它时,会打开新选项卡,告诉我定义客户端路由,请检查我的问题 ***.com/questions/36059753/…以上是关于Meteor 应用中 PayPal 的 IPN 侦听器的主要内容,如果未能解决你的问题,请参考以下文章