深入理解使用nodejs+redis封装获取微信场景二维码URL配置开发

简介:深入理解使用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地址 ,需要先取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}})
        }
        
        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
      在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u011313034/article/details/131153162