はじめに:nodejs+redis+mysql を使用して WeChat QR コードを取得し、コードをスキャンして WeChat 公式アカウントに戻ります
- 前回の記事では、QR コードの取得に成功し、WeChat サーバーから返された XML データを処理して、オブジェクト オブジェクトの形式でノード サーバーに返しました。
- ユーザーがコードをスキャンした後、openid に従って登録/ログインします。
// 根据openid判断是否注册 let openidRes = await DB.Account.findAll({ where: { openid }, raw: true }) // 随机获取头像、用户名 let head_img = RandomTool.randomAvatar() let username = RandomTool.randomName() // 无注册则增加个用户数据 let user = null if (openidRes.length === 0) { let resData = await DB.Account.create({ username, head_img, openid }) user = { head_img, username, id: resData.toJSON().id } } else { user = { head_img: openidRes.head_img, username: openidRes.username, id: openidRes.id } }
- トークンを生成する
let token = SecretTool.jwtSign(user, '168h')
- Redis キャッシュ内のスキャン ステータスとトークンを更新します
let key = `wechat:ticket:${ ticket}` const existsKey = await redisConfig.exists(key) if (existsKey) { redisConfig.set(key, JSON.stringify({ isScan: 'yes', token }), 120) }
- ユーザーがコードをスキャンした後、データを WeChat XML 形式で返します
let content = '' if (msgObj.MsgType == 'event') { // 扫码 if (msgObj.Event == 'SCAN') { content = '欢迎回来,欢迎登录我的网站' } else if (msgObj.Event == 'subscribe') { // 订阅 content = '感谢关注' } // 根据来时的信息格式,重组返回。(注意中间不能有空格) let msgStr = `<xml> <ToUserName><![CDATA[${ lastData.FromUserName}]]></ToUserName> <FromUserName><![CDATA[${ lastData.ToUserName}]]></FromUserName> <CreateTime>${ Date.now()}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[${ content}]]></Content> </xml>` return msgStr }
- ユーザーがコードをスキャンした後、openid に従って登録/ログインします。