小程序授权流程,小程序登录过期,小程序二次请求

article/2025/9/11 10:38:45

写这篇文章,主要是因为前阵子(其实就是一两周前)被大佬要求画出授权时序图,然后我不出意外被教训了一顿,哈哈,经过一顿梳理,整出了下图:

 上图为相应的时序图(字丑,能看懂就好别介意哈!)

为什么这图会有sessionId呢?因为小程序的请求wx.login返回的code是会过期的。根据是否过期去判断是否需要重新登录小程序。sessionId怎么来的呢?是根据小程序getAccessToken返回的7200秒去定义的,sessionId肯定是要少于微信定义的秒数,这样才能确保有效性。生成了sessionId传给前端之后,前端需要将sessionId保存在缓存中。在登录超时时,后台需要返回一个状态给前端判断当前的sessionId是否过期,如过期则进行二次请求。

上面一段话是说为什么有二次登录的,下面是授权的,由于小程序的改版,小程序的授权只能是跳到相应的页面点击授权(至少我现在只有这个方法,之前弹框后叫进行授权的,写是openSetting这个版本已经不行了)。如果请求接口需要授权的话,需要跳入授权函数。

如果请求时间过长怎么办呢?是不是需要再次请求?如果在fail中一直请求进入了死循环。这个不可行,怎么办呢?设置请求时间,在fail的时候进行询问是否进行再次请求,如点击确定则进行请求,否则什么都不做。

我该说的都说了,下面上代码(这一大段代码放在util.js中的):

module.exports = {HttpRequst: HttpRequst
}
// const baseUrl = "https://hi.xxx.com/cxyTicket/";//测试环境
const baseUrl = "https://xxx.com/hospital/"; //正式环境//sessionChoose 1是GET方法  2是Post方法
//ask是是否要进行询问授权,true为要,false为不要
//sessionChoose为1,2,所以paramSession下标为0的则为空
function HttpRequst(loading, url, sessionChoose, params, method, ask, callBack) {params = Object.assign({}, { "thirdSession":wx.getStorageSync("sessionId")}, params);//由于这次的方法是sessionId当参数传入,所以不像第一次写的一样放于请求头if (loading == true) {wx.showToast({title: '数据加载中',icon: 'loading'})}let paramSession = [{},{'content-type': 'application/json' },{ 'content-type': 'application/x-www-form-urlencoded'}]wx.request({url: baseUrl + url,data: params,dataType: "json",header: paramSession[sessionChoose],method: method,success: function (res) {if (loading == true) {wx.hideToast(); //隐藏提示框}if (res.data.object.LoginOutTimeState) {//判断过期的话重新获取console.log(res.data.object.LoginOutTimeState);console.log("32243已经超时了进来了");wxLogin(loading, url, sessionChoose, params, method, ask, callBack);}if (wx.getStorageSync("sessionId")){if (res.data.object.InfoState ==0){getUserInfo(loading, url, sessionChoose, params, method, ask, callBack);//判断用户是否授权}}callBack(res.data);},fail:function(res){console.log(res);wx.showModal({title: '提示',content: '请求失败!由于网络请求时间过长或网络无法连接的原因,请确认网络畅通,点击"重新请求"进行再次请求!',confirmText: "重新请求",success: function (res) {if (res.confirm) {HttpRequst(loading, url, sessionChoose, params, method, ask, callBack);//再次进行请求} else if (res.cancel) {console.log('用户点击取消');}}})},complete: function () {if (loading == true) {wx.hideToast(); //隐藏提示框}}})
}function wxLogin(loading, url, sessionChoose, params, method, ask, callBack) {wx.login({success: function (res) {var code = res.code; //得到codeHttpRequst(true, "wx/SP/wxlogin.do", 2, {"code": code}, "GET", true, function (res) {// console.log(res);if (res.code == 0) {wx.setStorageSync('sessionId', res.object.thirdSession);console.log(res.object.thirdSession);params.thirdSession = res.object.thirdSession;if (res.object.InfoState == 0) {console.log("这里没有用户信息");console.log(res.encryptedData);console.log(res.iv);getUserInfo(loading, url, sessionChoose, params, method, ask, callBack);//判断用户是否授权} else {HttpRequst(loading, url, sessionChoose, params, method, ask, callBack);}}})}})
}// 判断用户是否授权
function getUserInfo(loading, url, sessionChoose, params, method, ask, callBack){wx.getUserInfo({success: function (res) {HttpRequst(true, "wx/SP/saveInfo.do", 2, {"encryptedData": res.encryptedData,"iv": res.iv,"thirdSession": wx.getStorageSync("sessionId")}, "POST", false, function (res) {console.log("请求成功");wx.setStorageSync('avatarUrl', res.object.avatarUrl);wx.setStorageSync('nickName', res.object.nickName);HttpRequst(loading, url, sessionChoose, params, method, ask, callBack);})},fail: function (res) {console.log("我还没有授权");wx.navigateTo({url: '../allow_detail/allow_detail'})}})
}

想设置请求10秒后超时,进入fail函数怎么做呢?找到app.json,在最大的对象下加networkTimeout(我还顺带写了给引入插件的捏,嘿嘿嘿,当然插件也要在小程序平台设置第三方先才有效):

{"pages": ["pages/index/index","pages/allow_detail/allow_detail","pages/logs/logs"],"window": {"backgroundTextStyle": "light","navigationBarBackgroundColor": "#05a9c5","navigationBarTitleText": "xxx","navigationBarTextStyle": "#fff"},"plugins": {"Crypto": {"version": "0.0.003","provider": "wxf25d506ff81e19fb"}},"networkTimeout":{"request":20000,"connectSocket":20000}
}

超时也搞定了,授权的话由于改版,所以需要新页面,本来我是想写链接让你们跳到之前的博客的,但是考虑到程序员都懒,我就写下面吧。

allow_detail.html如下:

<!--pages/allow_get_detail/allow_get_detail.wxml-->
<view class="container"><view class="userinfo"><button  open-type="getUserInfo" bindgetuserinfo="getUserInfo">授权</button></view><view class="usermotto"><text class="user-motto">点击授权,在弹框内点击'允许'即可授权。授权完成后重新进入小程序即可正常使用。</text></view> 
</view>

 allow_detail.js如下:

// pages/allow_get_detail/allow_get_detail.js
//index.js
//获取应用实例
const app = getApp()
var util = require('../../utils/util.js')
Page({data: {},onLoad: function () {},getUserInfo: function (e) {// 在没有 open-type=getUserInfo 版本的兼容处理wx.getUserInfo({success: res => {util.HttpRequst(true, "wx/SP/saveInfo.do", 2, {"encryptedData": res.encryptedData,"iv": res.iv,"thirdSession": wx.getStorageSync("sessionId")}, "POST", false, function (res) {wx.setStorageSync('avatarUrl', res.object.avatarUrl);wx.setStorageSync('nickName', res.object.nickName);wx.navigateBack();wx.redirectTo({url: '../index/index'})})console.log("获取头像3")},fail: res => {console.log("调用失败")}})},
})

写完啦,我博客真的不常上,想写东西记录点什么才上来的。

注:小程序session_key怎么获取的,小程序官方文档有教怎么获取,怎么做,我只是建议大家设置的时间不要超7200秒而已


http://chatgpt.dhexx.cn/article/YP7k1Ntj.shtml

相关文章

uniapp-小程序发券插件-领券进入微信卡包

这两天有个需求,在小程序领券,然后该优惠券进入微信卡包. 官方文档:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter5_3_1.shtml 1.在小程序配置app.json 文件中加入如下配置&#xff1a; {"plugins": {"sendCoupon": {"version": …

wxFormBuilder + wxPython 工具开发第二章-日记本工具数据连接与展示

目录 前言 一、代码目录层级 二、数据库 三、数据表设计 四、展示数据 前言 上一章节已经介绍了如何将程序主窗口设计好生成python代码&#xff0c;运行成功的展示了窗体。 上一章内容地址&#xff1a; wxFormBuilder Python 工具开发第一章-拖出日记本图形界面_魂尾ac…

HBuidler运行小程序:rovider:wxf72d316417b6767f, version:1.0.1, AppID 不合法,invalid appid

解决&#xff1a; 这个是官方的demo,把对应的id值删掉就可以运行成功&#xff0c; 在微信开发者工具里&#xff0c;找到app.json, plugins里的2个广告配置删除可以运行成功。

wxFormBuilder + wxPython 工具开发第三章-日记本工具树节点增、改、删功能

目录 前言 一、添加树右击菜单 二、新增 1、实现二级日期节点新增 2、实现三级文章节点新增 三、修改 四、删除 前言 上一章节实现了对目记本表数据设计&#xff0c;数据库连接&#xff0c;数据展示的功能 wxFormBuilder Python 工具开发第二章-日记本工具数据连接与展…

进程和多线程的生命周期

进程和线程 进程 对于操作系统来说&#xff0c;一个任务就是一个进程&#xff08;Process&#xff09;。 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等。 内核观点&#xff1a;担当分配系统资源&#xff08;CPU时间&#xff0c;内存&#xff09;的实…

Python 线程的生命周期

CPU 在轮换执行线程过程中&#xff0c;线程都经历了什么呢&#xff1f;线程从创建到消亡的整个过程&#xff0c;可能会历经 5 种状态&#xff0c;分别是新建、就绪、运行、阻塞和死亡&#xff0c;如图 1 所示。 图 1 线程状态转换图 线程的新建和就绪状态 无论是通过 Thread …

线程的生命周期和线程池的生命周期

目录 线程的生命周期 1、新建状态 2、就绪状态 3、运行状态 4、死亡状态 5、阻塞状态 线程池的生命周期 1、RUNNING 2、SHUTDOWN 3、STOP 4、TIDYING 5、TERMINATED 线程的生命周期 1、新建状态 通过new关键字创建出一个线程对象&#xff0c;没有启动之前&#xff…

Java多线程的生命周期

多线程的生命周期 1. 线程周期 NEW &#xff1a;新建状态。RUNNABLE&#xff1a;在JAVA虚拟机中执行的线程处于这个阶段BLOCKED&#xff1a;线程阻塞状态&#xff0c;被阻塞等待监视器锁定的线程处于这个状态。WAITING&#xff1a;正在等待另一个线程执行特定的动作的线程处于…

Java多线程(1):线程生命周期

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 从事Java开发这些年来&#xff0c;如果要问我Java当中最难的部分是什么&#xff1f;最有意思的部分是什么&#xff1f;最多人讨论的部分是什么&#xff1f;那我会…

多线程的生命周期

1、线程的生命周期及五种基本状态 新建状态&#xff08;New&#xff09;&#xff1a;当线程对象对创建后&#xff0c;即进入了新建状态&#xff0c;如&#xff1a;Thread t new Thread(); 就绪状态&#xff08;Runnable&#xff09;&#xff1a;当调用线程对象的start()方法&…

Java线程的生命周期(有代码演示)

文章目录 概览NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED 概览 Java语言中&#xff0c;多线程是由线程的核心概念驱动的&#xff0c;而线程的生命周期会经历以下的不同状态。 Java java.lang.Thread类包含了一个静态类State&#xff0c;它定义了线程的状态&#xff…

Java 多线程之线程的生命周期 | 图解

转载&#xff1a;https://www.exception.site/java-concurrency/java-concurrency-thread-life-cycle 在 Java 初中级面试中&#xff0c;关于线程的生命周期可以说是常客了。本文就针对这个问题&#xff0c;通过图文并茂的方式详细说说。 结合上图&#xff0c;线程的生命周期大…

java多线程之线程的生命周期

1.生命周期 一个事物从出生的那一刻开始到最终死亡中间的整个过程.在事物的漫长的生命周期过程中,总会经历不同的状态(婴儿状态/青少年状态/中年状态/老年状态...).线程也是有生命周期的,也是存在不同的状态的,状态相互之间的转换. 线程对象的状态存放在Thread类的内部类(Sta…

线程生命周期及五种状态

文章目录 一、线程生命周期及五种状态1、New(初始化状态)2、Runnable(就绪状态)3、Running(运行状态)4、Blocked(阻塞状态)5、Terminated&#xff08;终止状态&#xff09; 二、线程基本方法1、线程等待&#xff08;wait&#xff09;2、线程睡眠&#xff08;sleep&#xff09;3…

线程的生命周期和状态

线程的六种状态 线程的生命周期主要有以下六种状态&#xff1a; New&#xff08;新创建&#xff09;Runnable&#xff08;可运行&#xff09;Blocked&#xff08;被阻塞&#xff09;Waiting&#xff08;等待&#xff09;Timed Waiting&#xff08;计时等待&#xff09;Termin…

线程的生命周期以及其中的方法

文章目录 线程的生命周期线程的5种状态 线程的基本方法线程等待&#xff1a;wait 方法线程睡眠&#xff1a;sleep 方法线程让步&#xff1a;yield 方法线程中断&#xff1a;interrupt 方法线程加入&#xff1a;join 方法线程唤醒&#xff1a;notify 方法后台守护线程&#xff1…

Java多线程 (五)—— 线程的生命周期

文章目录 前言1、线程生命周期1.1、NEW&#xff08;新建&#xff09;1.2、RUNNABLE&#xff08;可运行&#xff09;1.3、BLOCKED&#xff08;阻塞&#xff09;1.4、WAITING&#xff08;等待&#xff09;1.5、TIMED_WAITING&#xff08;计时等待&#xff09;1.5、TERMINATED&…

线程的生命周期及五种基本状态

一.线程的生命周期及五种基本状态 关于Java中线程的生命周期&#xff0c;首先看一下下面这张较为经典的图&#xff1a; 上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知识点&#xff0c;Java中的多线程也就基本上掌握了。主要包括&#xff1a; Java线程具有五…

浅谈线程的生命周期

当线程被创建并启动以后&#xff0c;它既不是一启动就进入了执行状态&#xff0c;也不是一直处于执行状态。在线程的生命周期中&#xff0c;它要经过新建(New)、就绪&#xff08;Runnable&#xff09;、运行&#xff08;Running&#xff09;、阻塞(Blocked)和死亡(Dead)5种状态…

java中,线程的生命周期

java中&#xff0c;线程的生命周期 一、什么是线程&#xff1f; 见之前写的。 当线程启动后&#xff08;线程对象调用start方法&#xff09;&#xff0c;它不能一直"独占"着CPU独自运行&#xff0c;所以CPU需要在多条线程之间切换&#xff0c;于是线程状态也会多次…