简介:使用nodejs+redis+mysql获取微信二维码并扫码返回微信公众号
- 上一篇文章已经成功获取到二维码了,并且也对微信服务器返回的xml数据进行处理,以object对象形式返回到node服务器
- 用户扫码之后根据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 } }
- 生成token
let token = SecretTool.jwtSign(user, '168h')
- 更新redis缓存中的扫码状态+token
let key = `wechat:ticket:${ ticket}` const existsKey = await redisConfig.exists(key) if (existsKey) { redisConfig.set(key, JSON.stringify({ isScan: 'yes', token }), 120) }
- 用户扫码之后返回微信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进行注册/登录