遵循以下指南:https://stripe.com/docs/webhooks/signatures#verify-official-libraries
我已经在环回自定义方法中尝试了以下代码:
"use strict";
module.exports = function(Webhook) {
Webhook.stripe = function(req, data, cb) {
const stripe = require("stripe")("sk_test_xxxxxxxxxxxxx");
const endpointSecret = "whsec_xxxxxxxxxxxxxxxxxxxxxxxxx";
const sig = req.headers["stripe-signature"];
let event;
try {
event = stripe.webhooks.constructEvent(data, sig, endpointSecret);
Webhook.create({
data: data
});
console.log("Success");
cb(null, "OK");
} catch (err) {
console.log(err);
Webhook.create({
data: err
});
cb(err);
}
};
Webhook.remoteMethod("stripe", {
accepts: [
{ arg: "req", type: "object", http: { source: "req" } },
{ arg: "data", type: "object", http: { source: "body" } }
],
returns: [{ arg: "response", type: "any", root: true }]
});
};
但是在stripe.webhooks.constructEvent
中验证签名时,传入正文的数据对象将不起作用,因为它不想要对象,它想要原始的未编辑正文。(JSON.Stringify(( 也不起作用,因为这会更改正文并且验证失败(如何从环回获取原始未编辑正文以传递到条纹库进行签名验证?
感谢 https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/loopbackjs/I2LK5gOkP_4/rn73-B0ABwAJ 的费利佩·菲格罗亚(Felipe Figueroa(的回答。
body-parser 将根据内容类型根据正文解析器类型(在本例中为 JSON 或 raw(解析传入的请求。不能将原始解析器和 json 解析器设置为按顺序应用
为了解决这个问题,我们可以从中间件中删除bodyParser.json,并在服务器中手动配置它.js
由于我们需要原始主体,但也需要转换后的 JSON,因此我们可以在 JSON 解析器激活之前添加一个额外的属性来请求对象,如下所示:
在中间件.json中:
"parse": {
"body-parser#json": {"params": {"limit": "10mb", "strict": false}}, // remove this line
"body-parser#urlencoded": {
"params": {
"extended": true,
"limit": "5mb"
}
}
在服务器中.js:
function rawBodySaver(req, res, buf, encoding) {
if (buf && buf.length) {
req.rawBody = buf.toString(encoding || 'utf8'); // additional property set on req object
}
}
const bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '10mb', strict: false, verify: rawBodySaver}));
然后在上面的代码中,我们将使用:
event = stripe.webhooks.constructEvent(req["rawBody"], sig, endpointSecret);
然后签名正确验证。