简介:深入理解使用nodejs+redis封装获取微信场景二维码URL配置开发
- 需要有一个外网可访问的域名,如暂时无域名,可使用花生壳进行内网穿透,此方面仅可暂时使用,无法长期使用,本文以花生壳内网穿透为例讲解如何获取到微信提供的二维码url地址,请往下看
- 首先创建一个本地回调的接口
http://127.0.0.1:8081/api/wxLogin/v1/callback
- 第一步:在nodejs项目根目录的文件夹router创建一个wxLogin.js,里面专门存放微信登录相关的接口,具体代码如下:
const express = require('express') const router = express.Router() const wxLoginController = require('../controller/WxLoginController') // 微信登录回调接口 router.get('/callback',wxLoginController.wechatInsert) module.exports = router
- 第二步:在nodejs项目根目录的app.js文件里排除下接口的权限校验,代码如下:
// 用户认证中间件 app.use(jwt({ secret: jwtSecretKey, algorithms: ['HS256'] }).unless({ path: [ /^\/api\/wxLogin\/v1/, //微信登录通知接口排除 ] })) // 用户相关的接口 const wxLoginRouter = require('./router/wxLogin') app.use('/api/wxLogin/v1',wxLoginRouter)
- 第三步:在nodejs项目的控制层controller文件夹新建一个 WxLoginController.js文件,验证微信接入状态
/** * @param wechatInsert 验证微信接入 */ const WxLoginService = require("../service/wxLoginservice") const WxLoginController = { wechatInsert:(req,res) =>{ // 从微信服务器拿对称加密的参数 let { signature,timestamp,nonce,echostr} = req.query let handleRes = WxLoginService.wechatInsert(signature,timestamp,nonce,echostr) res.send(handleRes) // 把结果返回给微信服务器 } } module.exports = WxLoginController
- 第四步:在数据层将入参token、timestamp、nonce三个参数进行字典序排序,拼接成一个字符串,进行sha1加密,具体代码如下:
const SecretTool = require("../utils/SecretTool") const WxLoginService = { wechatInsert:(signature,timestamp,nonce,echostr) => { let token = 'expert' let str = SecretTool.sha1([token,timestamp,nonce].sort().join('')) if(str == signature) { return echostr } } // sha1加密算法,需要先使用npm或yarn安装一下,代码如下: const sha1 = require('sha1') class SecretTool { // sha1加密 static sha1(query) { return sha1(query) } } module.exports = SecretTool
- 此处是验证是否已成功接入到微信服务器,在微信公众号后台添加该url进行验证,验证是否通过点击保存都会有提示的
- 具体可以参考文档-接入指南:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
- 第一步:在nodejs项目根目录的文件夹router创建一个wxLogin.js,里面专门存放微信登录相关的接口,具体代码如下:
- 回调接口已经跑通了,就可以往下走了
-
接下来获取微信二维码url地址 ,需要先取Access token
-
具体获取方法参考官方文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
-
接口入参有以下几个:1、grant_type,获取access_token填写client_credential;2、appid,即开发者ID-在公众号后台可以获取到;3、secret,即开发者密码-在公众号后台可以获取到,参数都准备就绪了,就可以来开发接口了
- 第一步,创建微信登录接口,在nodejs项目的router文件夹的wxLogin.js里面新增登录接口,代码如下:
// 获取微信二维码接口 router.get('/login',wxLoginController.login)
- 第二步,在控制层接收前端调用接口并把结果返回给到前端,具体代码如下:
login:async (req,res) => { let handleRes = await WxLoginService.login() res.send(handleRes) }
- 第三步:在数据层获取二维码url,并将获取到的结果存入redis缓存中
login: async () => { // 获取二维码url let { qrcodeUrl,ticket} = await getQR() // 将ticket存入redis缓存 let key = `wechat:ticket:${ ticket}` redisConfig.set(key, JSON.stringify({ isScan:'no'}),300) return BackCode.buildSuccessAndData({ data:{ qrcodeUrl,ticket}}) }
- 第四步,在配置层获取微信的access_token,ticket提供给到数据层进行调用,需要把之前准备好的appid,appsecret,拿来用了,具体代码如下:
- 代码实现逻辑参考官方文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html 和这个 https://developers.weixin.qq.com/doc/offiaccount/Account_Management/Generating_a_Parametric_QR_Code.html
const axios = require('axios') const appId = 'XXX' const appSecret = 'XXX' const accessTokenPC = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${ appId}&secret=${ appSecret}` const qrUrl = 'https://mp.weixin.qq.com/cgi-bin/showqrcode' // 获取微信access_token const getAccessToken = () => { return axios({ method: 'get', url: accessTokenPC }) } // 获取拼接微信二维码url的ticket const getTicket = (token) => { return axios({ method: 'post', url: `https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=${ token}`, data: { expire_seconds: 60 * 2, action_name: "QR_SCENE", action_info: { "scene": { "scene_id": 123 } } } }) } // 获取微信二维码url const wechatLogin = { getOR: async () => { let token = (await getAccessToken()).data.access_token let ticket = (await getTicket(token)).data.ticket return { qrcodeUrl: `${ qrUrl}?ticket=${ ticket}`, ticket: ticket } } } module.exports = wechatLogin
-
- 大功告成,可以在APIFOX上进行调用 微信登录接口;http://127.0.0.1:8081/api/wxLogin/v1/login,会返回ticket和微信二维码url
- 首先创建一个本地回调的接口