微信小程序登录及登录态管理

news2024/11/23 1:16:10

一,小程序登录

小程序登录 | 微信开放文档

接口应在服务器端调用,详细说明参见服务端API。

接口说明

接口英文名

code2Session

功能描述

登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。更多使用方法详见小程序登录。

调用方式

HTTPS 调用


GET https://api.weixin.qq.com/sns/jscode2session 

请求参数

属性类型必填说明
appidstring小程序 appId
secretstring小程序 appSecret
js_codestring登录时获取的 code,可通过wx.login获取
grant_typestring授权类型,此处只需填写 authorization_code

返回参数

属性类型说明
session_keystring会话密钥
unionidstring用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台账号下会返回,详见 UnionID 机制说明。
errmsgstring错误信息
openidstring用户唯一标识
errcodeint32错误码

调用示例

示例说明: HTTPS请求

请求数据示例


GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code 

返回数据示例


{
"openid":"xxxxxx",
"session_key":"xxxxx",
"unionid":"xxxxx",
"errcode":0,
"errmsg":"xxxxx"
}
 

错误码

错误码错误码取值解决方案
40029code 无效js_code无效
45011api minute-quota reach limit  mustslower  retry next minuteAPI 调用太频繁,请稍候再试
40226code blocked高风险等级用户,小程序登录拦截 。风险等级详见用户安全解方案
-1system error系统繁忙,此时请开发者稍候再试

二,小程序登录流程图

小程序登录 | 微信开放文档

小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。

登录流程时序

说明:

  1. 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
  2. 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台账号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台账号) 和 会话密钥 session_key

之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

注意:

  1. 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥
  2. 临时登录凭证 code 只能使用一次

三,接口调用频率规范

接口调用频率规范 | 微信开放文档

概念介绍

小程序wx接口可分为“普通接口”和“限频接口”。

“限频接口”指的是一个用户在一段时间内不允许频繁调用的wx接口,此类接口一般会调用到微信后台系统资源,为了保护系统,同时防止用户资源被滥用,开发者需要对此类接口做适度的频率限制,不能无节制地调用。

平台会对小程序内“限频接口”的调用情况做监控,如果小程序对此类接口的调用频率超出平台的规范,将会收到站内信提醒。系统会在资源紧张的情况下优先保障合理使用的小程序的服务。

开发者可登录小程序管理后台-开发管理-接口设置中查看“限频接口”调用情况。

目前,“限频接口”包括以下接口:

  1. wx.login
  2. wx.checkSession
  3. wx.getSetting
  4. wx.getUserInfo
  5. wx.getUserProfile

优化方法

开发者可以参考以下方法对“限频接口”的调用频率做优化:

  • 把上一次调用接口的返回结果缓存下来以供后续逻辑复用,而不是重新调用接口
  • 避免在定时循环的逻辑内重复调用“限频接口”
  • 避免在页面初始化事件onLoadonShowonReady中调用限频接口,应该在小程序初始化事件onLaunch中调用

四,登录流程及服务端缓存方案

登录流程

  1. 打开小程序,前端调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
  2. 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台账号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台账号) 和 会话密钥 session_key

实际项目中登录及服务端缓存方案

1. 打开小程序,前端调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。

2.调用登录服务端接口,参数如下(登录请求入参),后台做如下判断

1>判断code是否为空,

不为空

调用微信接口code2Session,获取openID及会话密钥session_key,并缓存,key=前缀+session_key,value = openID,过期时间10min

为空

根据请求中,sessionKey直接从缓存中获取openID

空,抛出异常非法登录

非空,继续后续流程

想一下什么时候code为空,什么时候不为空

打开小程序,如下二图,调用登录服务端登录接口,入参只有一个code

再次点击‘允许’时,再次调用登录服务端登录接口,入参没有code,有其他参数如下

{
    "mobileEncryptedData":"pRQAS9OpYTlfJIWnznDpHV6QWUmBQNDnrx9pym1cBkoknXz+B3sCrdAyF8crXR2QeqO3A0x3OUUyKYqtfVPC7dtluvIKxdoWDMkEnlMgaaO7E16YDR9KPA85oWtCmTVDsvmxdBvq7uuc+TVx5CfU+JIqDlDFO6M4YRf++uvET0pkHvgA3fXuHA//sMgGNzzbm/rEFAq0u1A1c9zlOdhS2A==",
    "iv":"czh4XUrTs0egv0CVsbSFBg==",
    "openId":"oDCsO5MY_eiI0hgDABslcGQ03JeE",
    "sessionKey":"XmOmQ77cR01vByTcchk9tQ==",
    "tlLoginLog":{
        "deviceBrand":"devtools",
        "deviceModel":"iPhone 5",
        "systemVersion":"iOS 10.0.1",
        "systemPlatform":"devtools",
        "basicLibraryVersion":"3.0.0",
        "systemLanguage":"zh_CN",
        "appVersion":"8.0.5",
        "wifi":1,
        "bluetooth":1,
        "geographical":1,
        "logonChannel":"miniprogram-wechat",
        "applicationType":"",
        "appCode":"jghc",
        "appEditions":"1.7.11"
    }
}

登录请求入参

public class MobileDTO {

    @ApiModelProperty(name = "mobileEncryptedData", value = "加密字符串")
    private String mobileEncryptedData;

    @ApiModelProperty(name = "iv", value = "偏移量")
    private String iv;

    @ApiModelProperty(name = "pic", value = "pic")
    private String pic;

    @ApiModelProperty(name = "code", value = "code")
    private String code;

    @ApiModelProperty(name = "sessionKey", value = "sessionKey")
    private String sessionKey;

    @ApiModelProperty(name = "appCode", value = "每个平台的code")
    private String appCode;

    @ApiModelProperty(name = "tlLoginLog", value = "新增设备信息")
    private TlLoginLog tlLoginLog;

    @ApiModelProperty(name = "toc", value = "1,2")
    private String toc;
}

五,关于手机号加解密

参考

对称加密算法 - 廖雪峰的官方网站

1,前端加密

AES对称加密,密钥sessionKey,偏移量iv

注意加密后的手机号密文,sessionkey,iv都进行了base64编码

2,后端解密

根据入参密钥sessionKey,偏移量iv,解密

代码如下

public static JSONObject getUserInfo(String encryptedData, String sessionKey, String iv) {
        // 被加密的数据
        byte[] dataByte = Base64.decode(encryptedData);
        // 加密秘钥
        byte[] keyByte = Base64.decode(sessionKey);
        // 偏移量
        byte[] ivByte = Base64.decode(iv);

        try {
            // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
            int base = 16;
            if (keyByte.length % base != 0) {
                int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
                byte[] temp = new byte[groups * base];
                Arrays.fill(temp, (byte) 0);
                System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
                keyByte = temp;
            }
            // 初始化
            Security.addProvider(new BouncyCastleProvider());
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
            AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
            parameters.init(new IvParameterSpec(ivByte));
            cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
            byte[] resultByte = cipher.doFinal(dataByte);
            if (null != resultByte && resultByte.length > 0) {
                String result = new String(resultByte, "UTF-8");
                return JSONObject.parseObject(result);
            }
        } catch (Exception e) {
            log.error("微信用户信息解密失败!", e);
        }
        return null;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/891677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Framework 全局替换系统字体

基于Android 11 Android Framework 全局替换系统字体 第一种通过替换系统默认字体 将需要替换的字体资源放置frameworks/base/data/fonts/目录下。 将系统默认的Roboto字体替换为HarmonyOs字体。 frameworks/base/data/fonts/fonts.xml frameworks/base/data/fonts/Android.…

Docker容器与虚拟化技术:Docker镜像创建、Dockerfile实例

目录 一、理论 1.Docker镜像的创建方法 2.Docker镜像结构的分层 3.Dockerfile 案例 4.构建Systemctl镜像(基于SSH镜像) 5.构建Tomcat 镜像 6.构建Mysql镜像 二、实验 1.Docker镜像的创建 2. Dockerfile 案例 3.构建Systemctl镜像(…

AI抢饭碗!新闻集团将使用生成式AI,每周自动写3000篇新闻丨IDCF

作者:AIGC开放社区 8月1日,英国卫报消息,全球最大新闻媒体公司之一的新闻集团,将使用生成式AI每周自动创建3000篇澳大利亚本地新闻。 据悉,新闻集团在内部成立了一个名为“Data Local”的部门只有4名员工,…

爱校对:塑造无瑕公文的强大工具

在公文处理的世界中,每个字、每个标点都需要细心打磨,确保无一瑕疵。如何能达到这种精确无误的程度呢?让我们一起来看看强大的爱校对软件如何帮助我们塑造无瑕的公文。 首先,爱校对软件采用先进的自然语言处理和深度学习技术&…

IDA远程调试真机app

IDA远程调试真机app 第一步:启动 android_server,并修改端口 # 启动android_server ./android_server -p31928第二步:端口转发、挂起程序 # 端口转发adb forward tcp:31928 tcp:31928# 挂起程序 adb shell am start -D -n com.qianyu.antid…

shell和Python 两种方法分别画 iostat的监控图

在服务器存储的测试中,经常需要看performance的性能曲线,这样最能直接观察HDD或者SSD的性能曲线。 如下这是一个针对HDD跑Fio读写的iostat监控log,下面介绍一下分别用shell 和Python3 写画iostat图的方法 1 shell脚本 环境:linux OS gnuplot工具 第一步 :解析iosta…

Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间

场景 SpringBootMybatis定时任务实现大数据量数据分表记录和查询: SpringBootMybatis定时任务实现大数据量数据分表记录和查询_mybatis 定时任务创建日表_霸道流氓气质的博客-CSDN博客 通过以上分表实现的同结构不同表名之间的表,如何将一个表中的数据…

Flink学习笔记(一)

流处理 批处理应用于有界数据流的处理,流处理则应用于无界数据流的处理。 有界数据流:输入数据有明确的开始和结束。 无界数据流:输入数据没有明确的开始和结束,或者说数据是无限的,数据通常会随着时间变化而更新。 在…

python模块中的_all__属性的作用

文章目录 前言 一、python模块中的_all__属性的作用 总结 前言 python模块中的特殊变量_all__的用法总结。 一、python模块中的_all__属性的作用 顾名思义:我们如果导一个包里面的函数或者变量,会把暴露在外部的变量和函数导出。那么有些变量或者函…

如何做好小程序的运营,有哪些运营策略?

小程序用完即走的特性,使得小程序留存用户比较困难。任何一个产品的出现,绕不过推广运营这个话题,小程序也是一样。抓住用户,培养用户的忠诚度是所有产品的根本,我们该怎样从零开始运营好小程序? 一、人群…

免费批量ppt转pdf?一个方法教你完美转换

随着科技的不断发展,电子文档的使用越来越普遍。在商业、教育和个人领域,我们经常需要将PPT文件转换为PDF格式,以便更方便地共享和存档。幸运的是,现在有许多在线工具和软件可以帮助我们轻松地完成免费批量ppt转pdf。下面将介绍一…

LabVIEW开发设计热稳定器

LabVIEW开发设计热稳定器 使用与PC控制单元接口的电子设备进行数据采集和控制已广泛用于不同的工业应用。精确的温度控制是一个巨大的挑战,这就是为什么一些工业应用需要使用适当的材料和设备比更好的温度精度。 ​ 为了追踪[-50至250C]之间的温度变化&#xff0c…

【LeetCode】205. 同构字符串

205. 同构字符串(简单) 方法:哈希映射 思路 判断两个字符串是不是同构字符串,只需要判断对应的字符是不是存在映射关系,我们可以使用 map 来保存字符间的映射关系。由于 “不同字符不能映射到同一个字符上&#xff0…

babylonjs基于自定义网格生成围栏动画

效果: import { Vector3, Mesh, MeshBuilder, StandardMaterial, Texture, Animation, Color3 } from "babylonjs/core"; import imgUrl from "./image/headerwangge2.png" // 创建模型护栏特效 export default class CreateRail {constructor…

Flutter实战·第二版-第三章 基础组件笔记

第三章:基础组件 3.1文本及样式 3.1.1 Text Text("Hello world",textAlign: TextAlign.left, );Text("Hello world! Im Jack. "*4,maxLines: 1,overflow: TextOverflow.ellipsis, );Text("Hello world",textScaleFactor: 1.5, );3.1…

重塑DTC规则:元气森林的全渠道转型

元气森林作为迄今为止用5-6年时间最快达到70亿年销售额的饮料品牌(统一、可口可乐、东鹏特饮都花了15年左右,康师傅花了10年)。元气森林于2016年在北京创立,凭借健康产品理念和新潮营销方式,一款主打“0糖0卡0脂”概念…

javaScript:模板字符串让你忘记字符串拼接

目录 一.前言 二.模板字符串的使用 1.介绍 2.模板字符串 支持换行 模板字符串更适合元素写入 innerHTML模板字符串写法 3.模板字符串中,可以运行表达式 4.模板字符串中可以运行函数 三.总结 语法: 多行字符串: 变量插值: …

【嵌入式学习笔记】嵌入式入门8——SPI总线协议

1.SPI介绍 SPI:串行外设设备接口(Serial Peripheral Interface),是一种高速的,全双工,同步的通信总线。主要应用在存储芯片、AD转换器以及LCD中。 【注:IIC是电平协议,SPI是边沿协议…

WX1860- ngbe-1.2.5 xdp程序在路由模式下,使用iperf工具测试数据包不转发,用jmeter可以

本地验证时重定向iperf包有出现calltrace错误&#xff0c;经推断&#xff0c;系统PAGE_SIZE<8k时可能出现&#xff08;getconf PAGE_SIZE指令可查看&#xff09;&#xff0c;按下图将ngbe_main.c的2350行ngbe_rx_bufsz改为ngbe_rx_pg_size可修复。其次&#xff0c;需要将加载…

AE-卡通人物解说动画视频的制作

目录 1.导入卡通人物图片和音频文件 2.新建合成 3.在卡通人物图片上添加效果和表达式 4.在音频文件上添加效果和表达式 5.将卡通人物中的 CC Split2 中分割1 表达式链接到滑块中 6.卡通人物根据音频文件自动匹配口型。 AE制作卡通人物解说视频&#xff0c;卡通人物口型根据…