不知不觉一个月没写东西了,过这种堕落的生活真是罪过。好了,回到正文,说说我们的小程序。向登录致敬大部分逻辑代码均来自教你登录认证登录流程的小程序。上图是官方登录流程。让我们概述一下逻辑。1、用户使用wx.login获取临时码,有效期为5分钟。2.将临时代码传给我们自己的后台服务,调用微信API获取用户的session_key和openid3,自定义一个新的key关联到后台返回的session_key和openid会将新的key返回给前端4.前端发送请求时携带key,后端解析返回数据session_key和openid1,session_key会话密钥,用于判断session操作的Validity,用于加解密用户数据,server可以自己存储,key不要返回给前端用于对话2.openid用户的唯一标识也只给server使用,可以用来标识用户的唯一性user接下来说说他们的获取,在服务端调用微信API获取API:https://api.weixin.qq.com/sns/jscode2session参数如下://小程序页面wx.login({success:(ret)=>{wx.request({url:'http://test.com',//后端服务器数据:{code:ret.code}})}})后端服务我们使用request发送请求的模块//后端服务letoptions={url:'https://api.weixin.qq.com/sns/jscode2session',qs:{appid:appid,secret:secret,js_code:code,grant_type:'authorization_code'}}//默认的请求方式是getrequest(options,(err,response,body)=>{if(err)returnerrreturnbody//{openid:'openid',session_key:'session_key'}不是真正的返回看下面的代码})生成新的keyskey上面我们得到了session_key和openid,下面这两个词叫做keyID,接下来我们生成一个新的key返回给前端并将新的key和keyID关联起来我们使用crypto模块的sha1算法生成keyconstcrypto=require('crypto')functiongetShaKey(data){returncrypto.createHash('sha1').update(data,'utf8').digest('hex')}上面的代码返回,我们将其更改为这个新的skey。前端把这个key存在storage中,请求的时候带上这个skey。自定义登录状态完成。wx.checkSession用于检查当前用户的session_key是否有效。微信不会通知开发者session_key的有效期。用户使用小程序越频繁,session_key有效期越长。wx.checkSession({success:function(){//当前session_key有效...//可以写我们的业务代码},fail:function(){//当前session_key已经过期wx.login()//重新登录,获取新的session_key}})当session_key过期后,我们调用登录API,更新session_key生成新的skey,关联两者的关系。在工具函数封装之前,我们把流程大致串起来,然后我们把上面的流程写成一个public函数//验证session_key状态函数checkSession(){returnnewPromise((resolve,reject)=>{wx.checkSession({success:function(){resolve(true)},fail:function(){reject(false)}})})}//登录函数login(){returnnewPromise((resolve,reject)=>{wx.login({success:(ret)=>{wx.request({url:'本地服务地址',method:'POST',data:{code:ret.code},success:(response)=>{wx.setStorageSync('skey',response.data.key)//将skey存储在存储中resolve(response.data.key)}})}})})}//请求函数ajax(url,data,method=“获取”,配置={}){letskey=wx.getStorageSync('skey')//获取skeyif(!skey){//没有skey,第一次登录返回newPromise((resolve,reject)=>{login()reject('Pleaselogin')})}else{returnnewPromise((resolve,reject)=>{checkSession().then(_=>{if(_){//session_key有效wx.request({url,method:method.toLocaleUpperCase(),data,header:Object.assign({},{skey},config),success:(ret)=>{resolve(ret.data)}})}else{//session_key无效login()reject('session_keyInvalid')}})})}}后端代码后端使用koa框架,代码见文末github地址解密官方提供多种编程语言的示例代码点击下载这里我们以微信运动API为例varapp=getApp()//我们把实用函数放在app示例Page({onLoad:function(){app.Util.login().then(_=>{//先登录再获取数据this.getrunData()})},getrunData(){wx.getWeRunData({success:(ret)=>{app.Util.ajax('本地服务地址',{iv:ret.iv,data:ret.encryptedData},'post').then(_=>{console.log(_)},(err)=>{console.log(err)})}})},})返回结果如下。以上,我们完成了小程序的简单登录认证和数据解密效果图。在townbuilding的最后,我们只是把用户状态放在了内存中,实际项目中肯定是放在数据库中的。可以看看大神的文章,里面讲了数据库的操作。再次致敬本文完整代码,请戳github