共计 1459 个字符,预计需要花费 4 分钟才能阅读完成。
怎么增加对 Shopify 的 WebHook 验证
背景介绍
Shopify 是一家一站式 SaaS 模式的电商服务平台,总部位于加拿大首都渥太华,专一于为跨境电商用户提供海内品牌建设及销售渠道治理。为电商卖家提供搭建网店的技术和模版,治理全渠道的营销、售卖、领取、物流等服务。
代码实现
Koa
如果你是想在 Koa 中对接 Shopify, 则能够参照上面的做法:
// 这是你从 Shopify 上失去的接口校验密钥
const secret = 'xxxx';
const app = new Koa();
async function run() {
// 其余的中间件的应用 / app.use...
app.use(async (ctx, next) => {const isShopify = ctx.request.path.startsWith('设置在 Shopify 上的 WebHook url');
if (!isShopify) {
return koaBody({
multipart: true,
formidable: {maxFileSize: 2000 * 1024 * 1024, // 设置上传文件大小最大限度,默认 2M},
})(ctx, next);
} else {
let str = '';
await new Promise((resolve, reject) => {
try {ctx.req.on('data', function(data: string) {str += data;});
ctx.req.on('end', function(chunk: string) {resolve(str);
});
} catch (e) {str = '{}';
reject(e);
}
});
const buf = Buffer.from(str);
const hash = crypto.createHmac('sha256', secret).update(buf).digest('base64');
const isOK = hash === ctx.request.headers['x-shopify-hmac-sha256'];
ctx.request.body = JSON.parse(str);
if (!isOK) {
ctx.status = 403;
ctx.body = 'Forbidden';
return;
}
return await next();}
})
Nest
如果你是想在 Nest 中对接 Shopify, 则能够参照上面这篇文章进行后期设置:
我后面写过一篇在 NestJS 中增加对 Stripe 的 WebHook 验证。因为后期的根本流程和步骤是齐全一样的,我在这篇中就不再赘述了。后期如何截获 Response raw body 相干的内容及怎么写一个 Interceptor 在这就不再反复了。参照另外一篇的内容照做就能够了。上面重点讲怎么解决加密内容。
// 这是你从 Shopify 上失去的接口校验密钥
const secret = 'xxxx';
// 这是 Shopify 响应返回的 Buffer 体
const buf = '....'
// 这是从响应头里取出来的单次校验哈希
const hash = request.headers['x-shopify-hmac-sha256'];
const isOK = hash === crypto.createHmac('sha256', secret).update(buf).digest('base64')
// 如果 isOK === false 则不对,如果是失常的 Shopify 告诉则为 true.
// crypto 是原生 Node 自带的库 import * as crypto from 'crypto'
正文完