在NestJS 中添加对Shopify 的WebHook 验证

Posted 阿兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在NestJS 中添加对Shopify 的WebHook 验证相关的知识,希望对你有一定的参考价值。

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

以上是关于在NestJS 中添加对Shopify 的WebHook 验证的主要内容,如果未能解决你的问题,请参考以下文章

在 NestJS 中以多对一关系添加字段

如何对 Shopify 应用进行负载测试?

除了 Shopify 商店的主页之外,如何在任何页面中添加主页部分?

尝试在 Shopify 中添加变体时出错

在 Shopify JSON 模板中添加自定义表单字段

在 Shopify 中,如何通过 url 将不同数量的多个产品添加到购物车