node-webot / co-wechat

Wechat for Koa
427 stars 91 forks source link

请问如何实现多公众号配置一个监听地址的情况? #26

Closed ikcro closed 7 years ago

ilaipi commented 7 years ago

我实现了这个。首先在每个公众号的开发者配置那,你配置的地址后面加个参数。比如你要监听的地址是:http://baidu.com,那就设置成:http://baidu.com?originId=gh_xxxxx,这个originId是公众号的原始id。然后,在服务端,初始化所有公众号api,

// accounts 是所有的公众号配置
forEach(accounts, ({ originId, appid, aes, token }) => {
    allApi[originId] = originWechat({
      appid: appid,
      encodingAESKey: aes,
      token: token
    });
  });

export const getApi = ({ originId }) => allApi[originId];

实现中间件: middleware.js

import logger from 'bunyan';
import { getApi } from 'path/to/initial/all/accounts';

const wechat = () => {
  return async (ctx, next) => {
    const { originId } = ctx.request.query;
    const wechat = getApi({ originId });
    const fn = wechat.middleware;
    const api = fn.apply(wechat, [(message) => {
      logger.info({ message }, 'wechat push message');
      switch (message.MsgType) {
        case 'event':
          /* 延迟100ms执行,立即响应微信服务器,避免出现服务不可用的情况,以及重复推送事件的情况 */
          setTimeout(() => logger.info('=====hahah===='), 100);
          break;
        case 'text':
        case 'audio':
          break;
      }
      return 'hehe';
    }]);
    await api(ctx, next);
  };
};

export default wechat;

最后,在app.js中:

import wechat from 'path/to/middleware';

app.use(wechat());
JacksonTian commented 7 years ago

https://github.com/node-webot/co-wechat/pull/28 看看这个。

http://url/wechat?appid=1 http://url/wechat?appid=2

app.use(async function (ctx, next) {
  ctx.wx_token = getToken(ctx.query.appid);
  // or
  ctx.wx_cryptor = getCryptor(ctx.query.appid);
});
app.use(wechat(config).middleware(async function (message) {
  // TODO
}));
JacksonTian commented 7 years ago

已经发布了。