兵團基地

一起學習、共同進步。
兵團基地

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

怎么添加对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'
 
兵团基地
Power by React, GraphQL | Design by Puls Garney | Version: 3.1.6
Copyright © 2017-2024 Puls Garney - All Rights Reserved.
Power by React, GraphQL
Design by Puls Garney
Version: 3.1.6

Copyright © 2017-2024 Puls Garney
All Rights Reserved.