微信小程序与微信公众号同一用户登录问题

2023-05-16


微信小程序与微信公众号同一用户登录问题


最近在做微信小程序与微信公众号登录合并的接口。整理相关资料以及个人认识的心得写了这篇文章与大家一起分享。


首先,简单说下我遇到的问题是我们的程序调用微信小程序得到openid,然后通过openID得到用户的唯一标识,用户得以登录,然而,当我们调用微信公众号也同样的到openid,同一以用户两个不同的openid,不能区分是否为同一用户,然后发现无论调用微信小程序还是微信公众号同一个用户的到unionid是相同的,所以我们就用unionid来区分是否为同一用户。


UnionID机制说明:

如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。


1、对于小程序获取unionid:


我们来看下用户登录小程序时的时序图:



1、 (JAVA 后台)向微信服务器发起请求附带js_code、appId、secretkey和grant_type参数,以换取用户的openid和session_key(会话密钥)


用code (前端调用微信接口得到)换取 session_key,openid


​这是一个 HTTPS 接口,开发者服务器使用登录凭证 code 获取 session_key 和 openid。
其中 session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不应该在网络上传输。后台解密用到。


接口地址:


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

请求参数说明:


1 参数          是否必须    说明
2 appid          是    应用唯一标识,在微信开放平台提交应用审核通过后获得
3 secret         是    应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
4 js_code      是    填写第一步获取的code参数
5 grant_type    是    填authorization_code

Map<String, String> params = new HashMap<String, String>();
params.put("appid", APPID);
params.put("secret", SECRET);
params.put("js_code", "js_Code");
params.put("grant_type", "authorization_code");
String openidtoken = HttpClientUtil.invokeGet(https://api.weixin.qq.com/sns/jscode2session, proxy, params,
utf-8, 60000);


返回参数:

参数 说明
openid 用户唯一标识
session_key 会话密钥


2、AES解密核心代码:(包含用户敏感信息的encryptedData信息由前端提供,后台负责解密数据,得到unionId)

		public byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException {
			initialize();
			try {
				Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
				Key sKeySpec = new SecretKeySpec(keyByte, "AES");

				cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化 
				byte[] result = cipher.doFinal(content);
				return result;
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();  
			} catch (NoSuchPaddingException e) {
				e.printStackTrace();  
			} catch (InvalidKeyException e) {
				e.printStackTrace();
			} catch (IllegalBlockSizeException e) {
				e.printStackTrace();
			} catch (BadPaddingException e) {
				e.printStackTrace();
			} catch (NoSuchProviderException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

3、解密用户信息:

		byte[] resultByte = Aes.decrypt(
								Base64.decodeBase64(encryptedData),
								Base64.decodeBase64(session_key),
								Base64.decodeBase64(ivByte));

		if (null != resultByte && resultByte.length > 0) {
			String userInfo = new String(resultByte, "UTF-8");
			// 结果转json
			JsonObject jsonobject = null;
			try {
				JsonParser par = new JsonParser();
				JsonElement jsonelement = par.parse(userInfo);
				jsonobject = jsonelement.getAsJsonObject();
			} catch (Exception e) {
				。。。。。。
			}
			// 获取unionid
			unionID = jsonobject.get("unionId").getAsString() + "";
		}


注:String和字节数组之间的转换:


通过 Base64.decodeBase64(String)就可以得到字节数组。


通过 String userInfo = new String(resultByte, "UTF-8"); 就得到了想要的String


4、解密得到的结果:
加密过程微信服务器完成,解密过程在我们的服务器完成,即由 encryptData 得到如下数据:
{
"openId": "OPENID",
"nickName": "NICKNAME",
"gender": GENDER,
"city": "CITY",
"province": "PROVINCE",
"country": "COUNTRY",
"avatarUrl": "AVATARURL",
"unionId": "UNIONID",
"watermark":
{
"appid":"APPID",
"timestamp":TIMESTAMP
}
}
5、把得到的unionId与用户的唯一标识绑定在一起,通过标识就可以进行下一步操作,系统不同,操作不同,这里不再详谈。




2、对于公众号获取unionId:


1、先拿code获取网页授权access_token以及openid


接口地址:


https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=JSCODE&grant_type=authorization_code

请求参数说明:


1 参数          是否必须    说明
2 appid          是    应用唯一标识,在微信开放平台提交应用审核通过后获得
3 secret         是    应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
4 code           是    填写第一步获取的code参数
5 grant_type     是    填authorization_code

Map<String, String> params = new HashMap<String, String>();
params.put("appid", APPID);
params.put("secret", SECRET);
params.put("code", "Code");
params.put("grant_type", "authorization_code");
String openidtoken = HttpClientUtil.invokeGet(https://api.weixin.qq.com/sns/oauth2/access_token, proxy, params,
utf-8, 60000);


返回参数:

"access_token":"ACCESS_TOKEN", 
"expires_in":7200, 
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID", 
"scope":"SCOPE" 
}
参数             说明
access_token    接口调用凭证
expires_in      access_token接口调用凭证超时时间,单位(秒)
refresh_token   用户刷新access_token
openid          授权用户唯一标识
scope           用户授权的作用域,使用逗号(,)分隔.


2、可以看到除access_token外,还可以获得openid,用拿到的access_token和openid获取unionID


接口地址:


https://api.weixin.qq.com/sns/userinfo?appid=APPID&secret=SECRET&code=JSCODE&grant_type=authorization_code

请求参数说明:


1 参数          是否必须    说明
2 access_token 接口调用凭证
3 openid         是    授权用户唯一标识
4 lang           否    一般为固定值zh_CN

Map<String, String> params = new HashMap<String, String>();
params.put("access_token", access_token);
params.put("openid", openId);
params.put("lang", "zh_CN");
String openidtoken = HttpClientUtil.invokeGet(https://api.weixin.qq.com/sns/userinfo, proxy, params,
utf-8, 60000);


在返回值里就包含有用户的unionID。这里不再详述。



每天努力一点,每天都在进步。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序与微信公众号同一用户登录问题 的相关文章

  • linux下如何测试端口通不通(四种方法)

    一般情况下使用 34 telnet ip port 34 判断端口通不通 接下来通过本文给大家分享四种方法测试端口通不通 xff0c 感兴趣的朋友一起学习吧 一般情况下使用 34 telnet ip port 34 判断端口通不通 xff0
  • 教你Vim编辑器,如何删除一行或者多行内容

    如何从Vim中删除行 xff1f 如何删除多行 xff1f 本文介绍在Vim编辑器中删除行的不同方法文内含长段代码可复制可往左滑 xff0c 希望对大家有帮助 xff01 安装Vim 在Ubuntu Debian中的安装方式 sudo ap
  • VBoxManage常用命令用法

    VBoxManage命令常用用法 系统环境 xff1a CentOS 7 3 x86 64 VirtualBox版本 xff1a 6 1 22 VirtualBox扩展版本 xff1a 6 1 22 增加一个新的扩展包 VBoxManage
  • Centos7安装Redis

    一 安装gcc依赖 由于 redis 是用 C 语言开发 xff0c 安装之前必先确认是否安装 gcc 环境 xff08 gcc v xff09 xff0c 如果没有安装 xff0c 执行以下命令进行安装 root 64 localhost
  • webRTC中的coturn服务安装

    目录 1 先准备一台云主机 2 安装coturn的依赖 2 1 依赖软件准备 2 1 安装依赖组件 2 2 安装coturn的持久化保存用户信息库 3 安装coturn 4 coturn配置 4 1 创建用户 4 2 配置说明 4 3 收集
  • Git配置.gitignore忽略文件

    git设置忽略文件和目录有两种方式 xff0c 一种是项目所有人员共用的的 xff0c 一种是开发自己使用的 第一种 xff0c 所有开发者共用的需要把设置设定在 gitignore该文件中 第二种 xff0c 开发者个人使用的忽略配置 x
  • 线程池实现原理

    创建线程有哪几种方式 一 继承Thread类创建线程类 xff08 1 xff09 定义Thread类的子类 xff0c 并重写该类的run方法 xff0c 该run方法的方法体就代表了线程要完成的任务 因此把run 方法称为执行体 xff
  • linux查看cpu与内存

    查看cpu 第一种方法 xff1a top命令法 1 首先执行top命令 xff1b 2 在top命令的显示界面 xff0c 按数据键1 xff0c 即可查看到当前系统中的总cpu数 xff1b 第二种方法 xff1a 通过proc文件系统
  • Element 布局组件el-row和el-col 详解

    1 背景 element的布局方式与bootstrap原理是一样的 xff0c 将网页划分成若干行 xff0c 然后每行等分为若干列 xff0c 基于这样的方式进行布局 xff0c 形象的成为栅栏布局 区别是element可将每行划分为24
  • netbeans中配置maven

    deploy 发布到远程maven库 本节默认maven库为nexus netbeans中按ctrl 43 1 xff0c 打开Project窗口 xff1b 在Project窗口中找到相关的project或module 在项目名上点击鼠标
  • 订阅关系一致

    订阅关系一致指的是同一个消费者Group ID下所有Consumer实例所订阅的Topic Tag必须完全一致 如果订阅关系不一致 消息消费的逻辑就会混乱 甚至导致消息丢失 本文提供订阅关系一致的正确示例代码以及订阅关系不一致的可能原因 帮
  • java之PO,VO,TO,QO,BO等

    PO persistant object 持久对象 在 o r 映射的时候出现的概念 xff0c 如果没有 o r 映射 xff0c 没有这个概念存在了 通常对应数据模型 数据库 xff0c 本身还有部分业务逻辑的处理 可以看成是与数据库中
  • 多生产者多消费者问题的无锁队列实现

    背景 代码根据论文 Implementing Lock Free Queues 复现 背景知识博客 xff1a 左耳朵耗子博客 https coolshell cn articles 8239 html 代码地址 xff1a https g
  • Ubuntu18下Github+Hexo搭建博客教程

    我的博客 xff0c 欢迎来访 xff1a www zxwsbg cn 搭建 安装git nodejs sudo apt get install git sudo apt get install nodejs sudo apt get in
  • linux中提供了PF_PACKET接口可以操作链路层的数据

    http blog sina com cn s blog 82f2fc28010132og html sock raw xff08 注意一定要在root下使用 xff09 原始套接字编程可以接收到本机网卡上的数据帧或者数据包 对于监听网络的
  • 分享52个Java源码,总有一款适合您

    Java源码 分享52个Java源码 xff0c 总有一款适合您 下面是文件的名字 xff0c 我放了一些图片 xff0c 文章里不是所有的图主要是放不下 xff0c 大家下载后可以看到 源码下载链接 xff1a https pan bai
  • 抽象类中的方法该如何实现呢?

    本节通过一个案例来学习如何实现抽象类中的方法 xff0c 具体步骤如下 xff1a 1 创建Animal类 创建一个Animal抽象类 xff0c 并在类中定义一个抽象call 方法 xff0c 如文件3 25所示 文件3 25Animal
  • zset类型的底层数据结构的实现

    参考资料 xff1a redis中zset底层实现原理 渣渣 CSDN博客 zset底层数据结构 redis的zset数据结构 xff1a 跳表 知乎 zset类型的底层数据结构的实现 xff1f zset是Redis提供的一个非常特别的数
  • XD软件都有哪些基础操作?

    下面我们来学习一下XD软件的基础操作 xff0c 包括资产面板的功能 交互动作 一键切图等等 1 重复网格 xff08 1 xff09 重复网格可智能复制其选择对象 xff0c 并批量更换图片 修改文字 之间距离等 xff08 2 xff0
  • 3分钟掌握7个XD基础操作

    下面我们来学习一下XD软件的基础操作 xff0c 包括资产面板的功能 交互动作 一键切图等等 1 重复网格 xff08 1 xff09 重复网格可智能复制其选择对象 xff0c 并批量更换图片 修改文字 之间距离等 xff08 2 xff0

随机推荐

  • 目标跟踪常用算法——EKF篇

    目录 1 扩展卡尔曼滤波算法 1 1 扩展卡尔曼滤波算法简单介绍 1 2 扩展卡尔曼滤波算法流程 1 3 扩展卡尔曼滤波算法仿真分析 2 参考文献 1 扩展卡尔曼滤波算法 1 1 扩展卡尔曼滤波算法简单介绍 对于非线性滤波问题 xff0c
  • 人工智能概述

    目录 什么是人工智能实现人工智能的方法逻辑编程机器学习深度学习机器学习和深度学习的区别 人工智能的分类如何实现人工智能 什么是人工智能 人工智能 又被称为机器智能 xff0c 是一种综合计算机科学 统计学 语言学等多种学科 xff0c 使机
  • java注解(annotation)的执行顺序

    可以在切面上使用 64 Order注解 如 64 Component 64 Aspect 64 Order 1 public class Aspect1 64 Component 64 Aspect 64 Order 2 public cl
  • Eclipse 常用快捷键 (动画讲解)

    Eclipse 常用快捷键 动画讲解 Eclipse有强大的编辑功能 xff0c 工欲善其事 xff0c 必先利其器 xff0c 掌握Eclipse快捷键 xff0c 可以大大提高工作效率 小坦克我花了一整天时间 xff0c 精选了一些常用
  • javaweb三大框架SSH

    1 MVC三层架构 xff1a 模型层 xff0c 控制层和视图层 模型层 xff0c 用Hibernate框架让来JavaBean在数据库生成表及关联 xff0c 通过对JavaBean的操作来 对数据库进行操作 xff1b 控制层 xf
  • HTTP请求方式及区别

    GET 向特定的路径资源发出请求 xff0c 数据暴露在url中 POST 向指定路径资源提交数据进行处理请求 xff08 一般用于上传表单或者文件 xff09 xff0c 数据包含在请求体中 OPTIONS 返回服务器针对特定资源所支持的
  • C++实现邮件群发的方法

    这篇文章主要介绍了C 43 43 实现邮件群发的方法 较为详细的分析了邮件发送的原理与C 43 43 相关实现技巧 非常具有实用价值 需要的朋友可以参考下 本文实例讲述了C 43 43 实现邮件群发的方法 分享给大家供大家参考 具体如下 x
  • Asp.Net Core IIS发布后PUT、DELETE请求错误405.0 - Method Not Allowed 因为使用了无效方法(HTTP 谓词)

    Asp Net Core IIS发布后PUT DELETE请求错误405 0 Method Not Allowed 因为使用了无效方法 HTTP 谓词 一 在使用Asp net WebAPI 或Asp Net Core WebAPI 时 x
  • Java lambda表达式使用笔记

    package com allsaints music admin import com allsaints music admin service entrymgr bak Student import lombok Data impor
  • .NET Framework 与 .NET Core 的区别与联系

    当今 net 生态系统如下 xff1a 从上面图中我们可以看到 net 主要分为三个部分 net FrameWork net Core Xamarin XAMARIN 主要用来构建APP的 xff08 包括IOS xff0c Android
  • .net 代码命名规范

    CAST 源代码命名规范手册 v1 1 Pascal 命名 xff1a 每一个单词首字母必须大写 Camel 命名 xff1a 第一个单词首字母小写 xff0c 其余单词首字母必须大写 任何命名必须优先使用英文单词表达意思 xff0c 若不
  • SpringBoot项目配置文件编写方式参考

    背景 为防止出现各环境配置文件不同步的情况 xff0c 现根据实际开发情况 xff0c 制定该配置文件编写参考 介绍 SpringBoot使用一个全局的配置文件 xff0c 配置文件名是固定的 xff1b application prope
  • xshell 连接 Linux kvm图形界面报错问题

    如下的报错 zyq 64 zyq sudo virt manager zyq 64 zyq virt manager 18561 Gtk WARNING cannot open display localhost 10 0 以上前提是需先安
  • 一文让你看懂Golang如何打造实时聊天系统

    项目截图 简介 在本次课程中 xff0c 我们来学习使用WebSocket来打造一个实时聊天系统 我们会从一下几个方面来进行学习 xff1a 什么是websocket xff1b Websocket与传统的HTTP协议有什么区别 xff1b
  • 【IBM MQ】使用IBM MQ远程连接时报错AMQ 4043解决思路

    我使用IBM MQ客户端远程连接队列管理器时 xff0c 报错 AMQ 4043 xff0c 百度基本找不到解决办法 xff0c 唯一一个解决方法是这个 xff08 https stackoom com question 1sroR xff
  • Arch Linux安装桌面及常用软件

    Arch Linux安装桌面及常用软件 安装桌面环境 显卡驱动 span class token comment 查看显卡情况 span lspci k span class token operator span span class t
  • Python 报错处理 paramiko.ssh_exception.SSHException: Error reading SSH protocol banner

    使用多进程启动多个ssh报错 xff1a Exception client Error reading SSH protocol banner Errno 104 Connection reset by peer During handli
  • 信息加密(简单的字母转换)

    题目 在传递信息的过程中 xff0c 为了加密 xff0c 有时需要按一定规则将文本转换成密文发送出去 有一种加密规则是这样的 xff1a 1 对于字母字符 xff0c 将其转换成其后的第3个字母 例如 xff1a A D xff0c a
  • js按钮绑定点击事件

    1 第一种 34 btn 34 click function 操作 2 第二种 document getElementById 39 foo 39 addEventListener 39 click 39 function 3 第三种 xf
  • 微信小程序与微信公众号同一用户登录问题

    微信小程序与微信公众号同一用户登录问题 最近在做微信小程序与微信公众号登录合并的接口 整理相关资料以及个人认识的心得写了这篇文章与大家一起分享 首先 xff0c 简单说下我遇到的问题是我们的程序调用微信小程序得到openid 然后通过ope