怎么增加对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'