赞
踩
此篇内容记录本人编程过程中所遇到的一些问题和解决的办法。仅供参考,有些内容引用别处。[非商用,如侵删]
先看图 基于小程序官方给出的图片 经过网上查找 到一张更加详细的时序表
根据疑惑我把这张图中的内容拆分成一个个小的问题来解决
微信小程序端 App.js wx.login引用官方文档的示例
iv和encryptedData后面用来解密用户信息
// 小程序全局只触发一次 触发时机为初始化后执行的生命周期函数, onLaunch(){ wx.getUserProfile({ lang: 'zh_CN', desc: 'desc', success(res) { const {encryptedData,iv} = res wx.login({ success(res) { wx.request({ url: 'http://localhost:3000/api/user/sendcode', data: { code: res.code, iv, encryptedData, } }) } }) } }) }
调用wx.login()方法 将获取到的 res.code 通过 wx.request() 发送到后端 接收到数据后把数据保存起来
iv和encryptedData
后端携带 Appid、AppSecret、code向微信服务器发起GET请求
const { iv, code, encryptedData } = req.query// 解构赋值
// 向微信服务器发起get请求 通过 code 换取 Session_key 和 openid
let wxURl = `https://api.weixin.qq.com/sns/jscode2session?
appid=${wxAppkey.appid}
&secret=${wxAppkey.secret}
&js_code=${code}
&grant_type=authorization_code`
// 保存请求结果
const { data } = await $.get(wxURl)
至此 我们已经拿到了 session_key 和 openid 的值
官方有给出demo > 开放数据校验与解密
node 实例
WXBizDataCrypt.js
var crypto = require('crypto') function WXBizDataCrypt(appId, sessionKey) { this.appId = appId this.sessionKey = sessionKey } WXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) { //转换为base64格式数据 iv = Buffer.from(iv, 'base64') encryptedData = Buffer.from(encryptedData, 'base64') sessionKey = Buffer.from(this.sessionKey, 'base64') try { //根据给定的算法,密钥和初始化向量,创建并返回一个Decipher解密对象。 var decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv) // 设置自动 padding 为 true,删除填充补位 decipher.setAutoPadding(true) //往decipher实例中添加数据,第一个参数是数据,第二个参数是传入数据的格式,默认是 ‘binary’。第三个参数是返回的数据格式。 var decoded = decipher.update(encryptedData, 'binary', 'utf8') //返回任何剩余的解密内容。不能调用多次 decoded += decipher.final('utf8') decoded = JSON.parse(decoded) } catch (err) { throw new Error('Illegal Buffer') } //检验是否获取正确,是当前appid的数据 if (decoded.watermark.appid !== this.appId) { throw new Error('Illegal Buffer') } return decoded } module.exports = WXBizDataCrypt
puzzle.js
const WXBizDataCrypt = require('./WXBizDataCrypt')
const { wxAppkey } = require('../../config/wxappConfig')
function getPuzzleUserinfo(sessionKey, encryptedData, iv) {
// 创建实例将appid 和session_key传入原型中
const pc = new WXBizDataCrypt(wxAppkey.appid, sessionKey)
// 将传入的iv,encryptedData,和实例原型中的session_key 一起进行解密 结果返回给data
const data = pc.decryptData(encryptedData, iv)
return data
}
module.exports = {
getPuzzleUserinfo
}
抱着这个疑惑我去网络上找各种答案,零零散散的看了很多:
所谓登录态,就是程序在运行时,能够识别当前用户,能够证明自己的唯一性且合法。
WEB服务器通过浏览器携带的token获取session来判断是否是同一用户(或浏览器);Restful服务通过客户端传过来唯一ID,来识别调用用户
以上内容引自微信小程序登录态
希望帮助理解,我的理解:
登录态是用来校验用户在小程序端和第三方服务器端的登录状态,类似与传统Web项目中的token和sseion。
我的理解就是是自己生成的一个字符串 用于验证用户登录态的伪token然后我们需要为其设定失效时间并保管在缓存(我这里用的redis)中,用户每次发起请求都要携带这个伪token,然后我们判断Token是否过期决定能否请求成功,如果未过期,返回相关的数据,如果过期了则需要用户重新发起登录请求重新返回给其token值。
先继续上码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。