美文网首页
微信小程序+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