微信小程序登录授权

2023-11-02

一般的微信小程序登录都会先前端调用wx.login生成code传给后端,后端通过code获取到openid和session_key并返回给前端,前端调用wx.getUserInfo获取对象参数等信息。

由于需求问题,我所写的小程序登录直接由前端调用wx.login生成code,wx.getUserProfile获取到iv和encrytedData作为参数进行接口调用。

在这里要注意wx.getUserInfo和wx.getUserProfile做出了调整,具体调整可查看小程序登录、用户信息相关接口调整说明 | 微信开放社区

@ApiOperation(value = "微信授权登录")
    @PostMapping("weChatLogin")
    public JsonData weChatLogin(@RequestBody UserAppDTO userAppDTO) {
        return userService.weChatLogin(userAppDTO.getCode(),userAppDTO.getEncryptedData(),userAppDTO.getIv());
    }

 关键代码如下,即可获取openid和session_key以及对象信息,后续根据业务逻辑写就好

//通过code获取微信授权信息
            String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + AuthUtil.APPID +
                    "&secret=" + AuthUtil.APPSECRET + "&js_code=" + code + "&grant_type=authorization_code";
            JSONObject jsonObject = AuthUtil.doGetJson(url);
            String openId = jsonObject.getString("openid");
            String sessionKey = jsonObject.getString("session_key");
            JSONObject obj = new AuthUtil().getUserInfo(encryptedData, sessionKey, iv);

APPID和APPAECRET通过登录小程序开发平台获取,前后端务必保持一致。

/**
 * 微信授权登录调用Util
 */
public class AuthUtil {
    public static final String APPID = "*****";//自己的微信APPID
    public static final String APPSECRET = "*****";//自己的微信APPSECRET

    public static JSONObject doGetJson(String URL) throws IOException {
        JSONObject jsonObject = null;
        HttpURLConnection conn = null;
        InputStream is = null;
        BufferedReader br = null;
        StringBuilder result = new StringBuilder();
        try {
            //创建远程url连接对象
            java.net.URL url = new URL(URL);
            //通过远程url连接对象打开一个连接,强转成HTTPURLConnection类
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            //设置连接超时时间和读取超时时间
            conn.setConnectTimeout(15000);
            conn.setReadTimeout(60000);
            conn.setRequestProperty("Accept", "application/json");
            //发送请求
            conn.connect();
            //通过conn取得输入流,并使用Reader读取
            if (200 == conn.getResponseCode()) {
                is = conn.getInputStream();
                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                String line;
                while ((line = br.readLine()) != null) {
                    result.append(line);
                }
            } else {
                System.out.println("ResponseCode is an error code:" + conn.getResponseCode());
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
                if (is != null) {
                    is.close();
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
            conn.disconnect();
        }
        jsonObject = JSONObject.parseObject(result.toString());
        return jsonObject;
    }

    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) {
            e.printStackTrace();
        }
        return null;
    }

}

就完成了!

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

微信小程序登录授权 的相关文章

  • 1-创建小程序项目

    注册 打开https mp weixin qq com 点击 立即注册 选择小程序 获取APPID 登录小程序在 开发管理 gt 开发设置 获取 APPID 开发工具 登录小程序在 开发工具 gt 开发者工具 获取 微信开发者工具 创建小程
  • vue的组件

    在Vue中 组件是可复用的代码块 用于构建用户界面 Vue的组件系统允许您将界面拆分为独立的 可重复使用的部件 提供了更好的代码组织和复用性 以下是在Vue中创建组件的基本步骤 创建一个组件实例 可以使用Vue extend 方法创建一个V
  • Fiddler工具 — 9.命令行和状态栏

    1 命令行 命令行在Fiddler的左下方的黑色窗口 也叫 QuickExec 可以调用 Fiddler的内置命令 这一系列内置的函数用于筛选和操作会话列表中的session 会话 虽然它不是很显眼 但用好它 会让你的工作效率提高 N 倍
  • Vue + Element-ui组件上传图片报错问题解决方案

    在使用Vue和Element ui组件上传图片时 可能会遇到一些报错问题 以下是一些常见的问题及解决方案 报错 TypeError Cannot read property name of undefined 解决方案 这个错误通常是因为在
  • AI壁纸画展头像表情包流量主微信抖音小程序开源版开发

    AI壁纸画展头像表情包流量主微信抖音小程序开源版开发 以下是AI壁纸画展头像表情包流量主微信抖音小程序开源版的开发功能列表 用户注册和登录 实现用户注册和登录功能 包括手机号登录 第三方登录等方式 图片上传和展示 用户可以上传自己的图片或选
  • 拼多多详情API开启运营比价新纪元

    随着互联网的快速发展 电商行业正在迅速崛起 拼多多作为一家新兴的电商平台 凭借其独特的营销策略和创新的商业模式 成为了电商行业的一匹黑马 在拼多多的成功背后 其详情API接口营销起到了至关重要的作用 本文将详细介绍拼多多详情API接口营销的
  • 【连续和自适应资源需求估计】通过不断应用在线优化、选择和估计,SARDE能够有效地适应在线跟踪,并使用得到的集成技术减少模型误差(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据 文章
  • 接口测试之Fiddler弱网测试

    前言 目前市面上的APP功能越来越丰富 移动端测试也越显为重要 因为用户在网速慢的情况下 你的网站 软件 总能出现各种各样的问题 请不要忽略这一点 针对在不同的网络情况下 接下来 本篇要讲述的就是在通过fiddler对APP进行模拟弱网测试
  • 如何创建微信小程序?高效实现你的创意

    在数字化浪潮下 微信小程序以其便捷高效的特点逐渐成为人们日常生活与商业活动的重要载体 有很多人却被难住 若没有没有编程经验 如何创建微信小程序 答案是通过合理利用工具 让创意迅速落地为功能完备的小程序 一 前期准备阶段 1 注册微信公众号平
  • Web 安全漏洞之 OS 命令注入

    什么是 OS 命令注入 上周我们分享了一篇 Web 安全漏洞之 SQL 注入 其原理简单来说就是因为 SQL 是一种结构化字符串语言 攻击者利用可以随意构造语句的漏洞构造了开发者意料之外的语句 而今天要讲的 OS 命令注入其实原理和 SQL
  • 思政课程如何提升学习效率?这个方法分享给你

    在当今社会 思政学习具有重要的意义 思政通学习小程序为我们提供了一个优质的学习平台 通过不断深入思考和学习 我们能够更好地认识社会 提升自我素质 客户案例 陈同学 思政通学习小程序提供了涵盖政治 经济 文化 科技等多个领域的学习内容 使我能
  • 基于java的web仓库管理系统设计与实现

    基于java的web仓库管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的Web仓库管理系统是近年来快速发展的领域之一 它提供了丰富的功能 如数据存储 数据检索 数据分析和数据可视化等 本文将重点介绍基于Java的Web仓库管
  • 【计算机毕业设计】趵突泉景区的智慧导游小程序_5ztvv

    当今社会已经步入了科学技术进步和经济社会快速发展的新时期 国际信息和学术交流也不断加强 计算机技术对经济社会发展和人民生活改善的影响也日益突出 人类的生存和思考方式也产生了变化 传统趵突泉景区的智慧导游采取了人工的管理方法 但这种管理方法存
  • 【计算机毕业设计】北京医疗企业固定资产管理系统的设计与实现 _4c4c1

    近年来 人们的生活方式以网络为主题不断进化 北京医疗企业固定资产管理就是其中的一部分 现在 无论是大型的还是小型的网站 都随处可见 不知不觉中已经成为我们生活中不可或缺的存在 随着社会的发展 除了对系统的需求外 我们还要促进经济发展 提高工
  • 低代码配置-列表页组件设计

    保存 表单属性存放 bill 筛选项配置存放 filterLayout 列表按钮存放 buttonLayout 列表布局存放 listLayout api存放 api 数据结构 layout 存放表单基础配置 bill 存放按钮基础配置 b
  • 课设:NFA确定化和最小化程序的设计与实现(html+css+js实现)

    文章目录 问题描述 待解决问题 1 如何存储NFA或者是DFA 2 NFA多初态问题 3 子集化过程思路 4 分割法过程思路 使用方法 下载链接 问题描述
  • 微信小程序|SSM微信小程序的学生选课系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • APP开发毕业设计|ssm爱心小屋公益机构智慧管理APP

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • Web自动化测试 —— cookie复用

    一 cookie简介 cookie是一些数据 存储于用户电脑的文本文件中 当web服务器想浏览器发送web页面时 在链接关闭后 服务端不会记录用户信息 二 为什么要使用Cookie自动化登录 复用浏览器仍然在每次用例开始都需要人为介入 若用
  • 每日变更的最佳实践

    在优维公司内部 我们采用发布单的方式进行每天的应用变更管理 这里给各位介绍优维的最佳实践 变更是需要多角色合作的 而且他是整体研发流程的一部分 在优维内部 我们坚持每日变更 打通开发环节到最终发布上线的全过程 在保证质量的前提下 尽可能提升

随机推荐

  • Linux 网桥支持LLDP 透传的解决方法

    inux 虚拟网桥默认会悄悄地删除LLDP消息 发送到LLDP Multicast地址01 80 C2 00 00 0E 和01 80 C2 00 00 xx范围内的其他控制帧 原因可以在802 1AB标准中找到 该标准规定 the des
  • Window 通过cmd查看端口占用、相应进程、杀死进程

    一 查看所有进程占用的端口 在开始 运行 cmd 输入 netstat ano 可以查看所有进程 二 查看占用指定端口的程序 当你在用IIS发布程序时 经常会遇到端口80被占用的情况 我们想知道是哪个程序或进程占用了端口 可以用该命令 ne
  • java——为什么重写hashCode还需要重写equals

    hashCode与equals方法的作用其实一样 在java里面我们都是用它们来比较两个对象是否一致 那为和我们还需要使用hashCode 这里其实使用hashCode是为了提高效率 采取重写hashcode方法 先进行hashcode比较
  • 中学计算机课小课题,中学信息技术课题题目

    中学信息技术课题题目 分类 课题研究 发表时间 2019 04 19 10 27 信息技术是主要用于管理和处理信息所采用的各种技术的总称 在中学信息技术教学过程中 会遇到一些难以解决的问题 成为我们研究课题的选择对象范围 当然确定研究选题
  • 【mysql】日常遇到的问题解决

    目录 MySQL 删除数据库报错 1010 Error dropping database can t rmdir ERR 1452 Cannot add or update a child row a foreign key constr
  • Java常用API(十)——多线程基础

    多线程 允许 同时 执行多段代码 实际上多线程是并发运行的 每段代码都是走走停停的 CPU会在这些线程间快速切换 保证每段代码都有进度 从而感官上是同时运行 线程的创建 第一种创建方式 定义一个线程类并继承线程Thread 然后重写run方
  • SSH概述

    ssh是web开发中常见的一种框架 s struts s spring h hibernate 其中struts在框架中充当控制器 实现MVC 主要用来处理用户的请求 和跳转页面 使项目结构清晰 开发者只需要关注业务逻辑的实现即可 spri
  • windows DiskPart 磁盘分区命令工具参考

    DiskPart Windows 7 Disk Administration Partition a disk This page documents the Windows 7 2008 version of Diskpart an ea
  • 基于mbedtls的AES加密(C/C++)

    环境 操作系统 WSL2 Ubuntu22 04 加密库 mbedtls Base64 在线AES计算网站 SSLeye 代码中需要用到mbedtls和Base64 可以根据上述链接获取 简介 高级加密标准 Advanced Encrypt
  • !windows11

    啊啊啊 win11来了 似乎是泄漏版 晚上在图书馆看到的 后来回宿舍一看正好有个群里正在讨论此事 就试着安装了一下 还挺顺利 下面是几张美图
  • 终于,在Excel里也能直接写python了

    之前在处理数据的时候 最开始都是在excel里处理 后来当数据量上了一个级别后就用python导入excel文件接着处理了 很多人会说 excel有自带VBA语言 可以用那个来处理呀 不好意思 VBA不仅处理数据速度慢而且还非常麻烦 但是
  • 【51单片机实验笔记】前篇(三) 模块功能封装汇总(持续更新)

    文章目录 通用函数 public h public c 延时函数 delay h delay c LED模块 数码管模块 smg h smg c LED点阵模块 独立按键模块 矩阵按键模块 外部中断模块 定时器模块 串口通讯模块 ADC模块
  • 独家

    作者 宋莹 本文长度为10427字 建议阅读20 分钟 本文为你介绍数据挖掘的知识及应用 引言 最近笔者学到了一个新词 叫做 认知折叠 就是将复杂的事物包装成最简单的样子 让大家不用关心里面的细节就能方便使用 作为数据科学领域从业者 我们所
  • Jupyter notebook从电脑本地读取csv文件

    在菜单中打开Anaconda Prompt 然后输入 jupyter notebook generate config 打开输出的路径的配置文件 找到 c NotebookApp notebook dir 然后将 去掉 并且在 中写入想要存
  • Java poi导出word文件

    Java在导出word文件时主要对表格中内容垂直居中处理做以记录方便后续碰到类似问题解决 maven pom xml中添加poi依赖
  • 使用IDEA导入SpringBoot项目

    有时候会拿到别人现成的 springboot 项目 而不是从头自己做一个 这个时候 就需要用导入的方式来 import 这么一个项目了 1 IDEA 导入 SpringBoot 项目办法 1 菜单 gt File gt New gt Pro
  • 2021-05-05 星期三 常用的算法的时间复杂度和空间复杂度

    常用的算法的时间复杂度和空间复杂度
  • 变分推断和指数族分布

    一 变分推断基础 首先 对数先验概率有 ln p X ln p X Z p Z X ln p X Z q Z q Z p Z X ln p X Z q Z ln q Z p Z X 1 2 3 1 l n p
  • JDK 安装 与环境变量配置 详细教程

    1 JDK jre 8u161 windows x64 exe 下载 所有平台 http www oracle com technetwork java javase downloads jdk8 downloads 2133151 htm
  • 微信小程序登录授权

    一般的微信小程序登录都会先前端调用wx login生成code传给后端 后端通过code获取到openid和session key并返回给前端 前端调用wx getUserInfo获取对象参数等信息 由于需求问题 我所写的小程序登录直接由前