美文网首页
在NestJS 中添加对Shopify 的WebHook 验证

在NestJS 中添加对Shopify 的WebHook 验证

作者: 阿兵 | 来源:发表于2021-07-10 16:01 被阅读0次

    怎么添加对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 验证

          本文链接:https://www.haomeiwen.com/subject/zfptpltx.html