美文网首页
微信小程序+node实现登录和注册

微信小程序+node实现登录和注册

作者: 小小了墨 | 来源:发表于2019-08-16 10:36 被阅读0次

    登录

    检查session(客户端) --> 登录(客户端) --> code值 --> 获取openidsession_key

    客户端

    客户端

    // app.js
    onLaunch() {
      this.checkSession()
    }
    // 判断微信是否存有session
    checkSession() {
      wx.checkSession({
        success(res) {
          console.log('checkSession', res);
        },
        fail(error) {
          console.log('checkSession error', error);
          // 没有需要去登录获取
          // 临时登录凭证code只能使用一次
          // 调用login时 会更新session_key,使原来的失效
          wx.login({
            success(response) {
              console.log('login success', response);
              wx.request({
                url: 'https://www.wechatehttps.com/onLogin',
                data: {
                  code: response.code;
                },
                success(result) {
                  console.log('登录成功后返回的信息', result)
                },
                fail(err) {
                  console.log('失败返回的信息', err);
                }
              })
            },
            fail(err) {
              console.log('login error', err);
            }
          })
        }
      })
    }
    

    服务端

    服务端 基于express搭建的 使用request发送请求

    const appid = 'wx**********';
    const secret = '**************';
    const authorizationCode = 'test';
    let sessionKey = null;
    let openid = null;
    
    app.get('/onLogin', (req, res) => {
      // 获取到登录后的code
      const { code } = req.query;
      // 向微信服务器发送信息获取到 openid 和 session_key
      request(`https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${secret}&js_code=${code}&grant_type=${authorizationCode}`, (err, response, body) => {
        if(err) console.log(err);
        const data = JSON.parse(body);
        /*
        签名校验以及数据加解密涉及用户的会话密钥session_key。 需要保存在服务器
        openid 判断是否是同一个用户
        session_key 判断用户是否失效
    
        data: {
          openid: '**********',
          session_key: '********'
        }
        */
       res.end(JSON.strinfy(data))
      })
    })
    

    转发和群分享

    转发

    1. 开启页面转发功能

    因为微信开放问题,推荐是需要转发的页面开启转发,所以默认是没有开启

    // page.js
    onLoad() {
      wx.showShareMenu({
        // 是否携带转发来源信息,默认false
        // 目前只有转发到群聊才有,单聊没有
        withShareTicket: true
      })
    }
    
    1. 触发转发(页面/按钮)
    //page.js
    page({
      onShareAppMessage(type) {
        // from  button:页面内转发按钮;menu:右上角转发菜单
        if (res.from === 'button') {
          // 来自页面内转发按钮
          console.log(res.target)
          return {
            title: '通过按钮转发',
            // 可以通过query带参数
            path: '/page/user?id=123',
          }
        }
        return {
          title: '自定义转发标题',
          path: '/page/user?id=123'
        }
      }
    })
    
    1. 通过转发个人进入获取转发人标识

    query 里面带的参数可以在转发的 app.js onLaunch获得

    // �app.js
    onLaunch(info) {
      const query = info.query
    
    }
    

    通过转发群聊进入获取群信息

    1. 客户端请求和处理
    // app.js
    
    /*
    因为回调太恶心了,所以这里用了wepy框架,
    采用es6 await/async 进行异步请求
    */
    
    onLaunch(info) {
      const self = this
      // 判断是否有转发来源
      if (info.shareTicket) {
        self.getShareInfoFun(info)
      }
    }
    
    async getShareInfoFun(info) {
      // 通过转发 shareTicket 获取 加密的用户信息
      const data = await this.getShareInfo(info)
      // 检查微信服务器的session是否失效
      const response = await this.checkSession()
      const { encryptedData, iv } = data
      /*
      通过 login 拿到code
      通过 getShareInfo 拿到 encryptedData 和 iv 的加密信息
      向服务端请求,拿到解密数据
      */
      if(response){
        wepy.request({
          url: 'https://www.wechathttps.com/onLogin',
          data: {
            code: response.code,
            encryptedData,
            iv
          },
          success(result) {
            // 返回解密后的数据
            // 拿到 openGId (群id)
            console.log('数据返回', result)
          },
          fail(err) {
            console.log('request error', err)
          }
        })
      } else {
        wepy.request({
          url: 'https://www.wechathttps.com/getOpenGid',
          data: {
            encryptedData,
            iv
          },
          success(result) {
            // 返回解密后的数据
            // 拿到 openGId (群id)
            console.log('数据返回', result)
          },
          fail(err) {
            console.log('request error', err)
          }
        })
      }
    
    }
    
    // 通过转发 shareTicket 获取 加密的用户信息
    getShareInfo(info) {
      return new Promise((resolve, reject) => {
        wepy.getShareInfo({
          shareTicket: info.shareTicket,
          success(res) {
            console.log('getShareInfo', res)
            // 返回的是加密数据
            resolve(res)
          }
        })
      })
    }
    // 检查
    checkSession() {
      return new Promise((resolve, reject) => {
        // 判断微信服务器上的session是否失效
        wepy.checkSession({
          // 未失效, 如果调用login会使当前session失效,再重新生成一个新的
          success(res) {
            console.log('checkSession', res)
            resolve(null)
          },
          // 失效需要重新调用login
          fail(error) {
            console.log('checkSession error', error)
            wepy.login({
              success(response) {
                // 登录成功后拿到code值用于服务器解码
                console.log('success login', response)
                resolve(response)
              },
              fail(err) {
                console.log('error login', err)
                reject(err)
              }
            })
          }
        })
      })
    }
    
    1. 服务端获取数据和解密
    //node + express + request
    
    const express = require('express')
    const request = require('request')
    // 通过微信小程序开发文档里面的加密解密下载获取
    const WXBizDataCrypt = require('./server/WXBizDataCrypt')
    
    const app = express()
    // 小程序开发者获取
    const APPID = 'wx2980632cc9eeafd5'
    const SECRET = '7890a1d703413e7c39015801ce09f611'
    // session标识
    const authorization_code = 'demo'
    
    let sessionKey = null
    let openid = null
    
    app.get('/onLogin', (req, res) => {
      console.log('reviced')
      const query = req.query
      const { encryptedData, iv, code } = query
      /*
      向微信服务器请求
      获取openid和session_key, 存起来,除非用户失效或者重新登录,不然不会变
      openid一对一,不会变,变的是session_key
      */
      request(`https://api.weixin.qq.com/sns/jscode2session?appid=${APPID}&secret=${SECRET}&js_code=${code}&grant_type=${authorization_code}`, (err, response, body) => {
        if (err) console.log(err)
        body = JSON.parse(body)
        // 获取 openid,session_key
        sessionKey = body.session_key
        openid = body.openid
        const pc = new WXBizDataCrypt(APPID, sessionKey)
        // 将加密信息 encryptedData和iv 解密出来
        const data = pc.decryptData(encryptedData, iv)
        res.json(data)
        console.log('send', data)
      })
    })
    // 如果已经登录了
    app.get('/getOpenGid', (req, res) => {
      const query = req.query
      const { encryptedData, iv } = query
      const pc = new WXBizDataCrypt(APPID, sessionKey)
      const data = pc.decryptData(encryptedData, iv)
      res.json(data)
    })
    

    小程序码转发

    图片生成

    客户端向服务端请求 --> 服务端向微信服务器请求 --> 获取二进制图片流 --> 转成png图片存储
    --> 返回客户端小程序码的url --> 客户端canvas重新绘制 --> 调用微信api将canvas绘制的存成临时图片
    --> wx.getSetting 查询用户是否授权过 --> wx.authorize 询问用户是否授权 --> 使用button组件打开wx.openSetting
    --> 调用微信api将临时文件保存到系统相册

    相关文章

      网友评论

          本文标题:微信小程序+node实现登录和注册

          本文链接:https://www.haomeiwen.com/subject/kkhfsctx.html