关注this
我收到错误 - 未处理的承诺拒绝(拒绝ID:2):TypeError:第一个参数必须是字符串,Buffer,ArrayBuffer,Array或类似数组的对象
所以我改为
var msg = JSON.stringify(req.rawBody);
var digest = crypto.createHmac('sha256', APP_SHARED_SECRET)
.update(Buffer.from(msg,'utf8'))
.digest('base64');
生成的签名(hmac-sha256)与我在请求标头中收到的签名不同!
任何线索或指针都会有所帮助。
答案 0 :(得分:0)
您可能希望在执行任何其他操作之前使用JSON.parse而不是JSON.stringify来解析消息。
答案 1 :(得分:0)
我正在处理类似的问题,但您想使用
new Buffer(....)
答案 2 :(得分:0)
对于仍在寻找解决方案的任何人,这对我来说都是有效的
const rawBody = req.rawBody; // expressjs
// omitted
...
const digest = crypto
.createHmac("sha256", process.env.SHOPIFY_WEBHOOK_SECRET)
.update(data)
.digest("base64");
return crypto.timingSafeEqual(
Buffer.from(digest, "utf8"),
Buffer.from(req.headers["http_x_shopify_hmac_sha256"], "utf8")
);
我在Vercel中使用无服务器功能,因此我使用了外部npm软件包raw-body
来获取正确的原始内容
const rawBody = await getRawBody(req);
注释
req.body
是已解析的对象,并且JSON.stringify
弄乱了原始有效负载。crypto.timingSafeEqual
进行比较,此功能可以最大程度地防止泄漏时间信息。