图文详解微信小程序如何实现微信授权登录(Java后台)上

2023-11-09

详解微信小程序如何实现微信授权登录(Java后台+springboot框架),附关键源码

jar包依赖

	 <!-- http请求工具包依赖 -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.2</version>
        </dependency>
        <!--jsonObject需要的jar包-->
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--工具类wxutils所需-->
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.59</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <!--工具类wxutils的JSONObject.parseObject需要-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.56</version>
        </dependency>

wx.login

在这里插入图片描述
虽然微信的文档写的很清楚,但是遗憾的是,我看懂了也不会写。如果是前后端分离的还好一些,你只需要让前端在小程序的aap.js中发送一个wx.login()的请求。我们的个人信息都存在微信服务器上,所有需要先去服务器获取一个对应你账户信息的随机code,这个code就是后端可以从服务器换取sessionkey和openid的关键。

// 网上的请求案例
    //请求code
    wx.login({
      success(res) {
        if (res.code) {
             //把获取到的code通过一个request的请求发给java服务器
            wx.request({
            url:你的url地址,
            data: {
              code: res.code
            },  
            method: 'POST',
            dataType: 'json',
            success: function (res) {
                //请求成功的处理
            }
        }
      },
      fail: function () {
        console.log("发送code失败:", res.data);  
      }
    })

使用code换取信息

//不多说,直接上代码
 @RequestMapping("getSessionKey")
    public ReturnData getSessionKey(@RequestParam("code")String code) {
        ReturnData returnData = new ReturnData();
        Map<String, Object> key = appletService.getSessionKey(code);
        YxMember member = appletService.selectExist(key.get("openid").toString());
        if(member!=null) {
            returnData.setCode("1");
            returnData.setData(member);
        }
        else{
            //将用户的openid存入数据库
            LogUtils.debug("存到缓存当中,key为: "+key.get("openid")+",value: "+key.get("session_key"));
            redisTemplate.opsForValue().set(key.get("openid"),key.get("session_key"),3000,TimeUnit.MILLISECONDS);
            returnData.setCode("0");
            returnData.setData(key.get("openid").toString());
        }
        return returnData;

returndata是封装的结果类,不用在意。请注意,微信提到为了信息的安全,建议使用3rdsessionkey返回给前端,但是我这里偷懒,实际我也没用过,使用openid返回给前端。同时把openid和sessionkey放到redis,设置合理的过期时间,其它缓存也可以。需要注意的是,如果用户已经授权过,也就是登陆。我们可以在数据库的用户表中根据你设的关键字查询是否存在,我这里是openid,因为每个用户的openid是唯一的。存在,直接返回用户信息,不存在,缓存放好sessionkey,然后返回。我这里约定的是code,前端会判断,setCode为1会发送getUserInfo请求,为0不再请求。

//service代码
public Map<String,Object> getSessionKey(String code) {
        StringBuilder url = new StringBuilder("https://api.weixin.qq.com/sns/jscode2session?");
        url.append("appid=");//appid设置
        url.append("你的appid");
        url.append("&secret=");//secret设置
        url.append("你的secret");
        url.append("&js_code=");//code设置
        url.append(code);
        url.append("&grant_type=authorization_code");
        Map<String, Object> map = null;
        try {
            HttpClient client =HttpClientBuilder.create().build();//构建一个Client
            HttpGet get = new HttpGet(url.toString());    //构建一个GET请求
            HttpResponse response = client.execute(get);//提交GET请求
            HttpEntity result = response.getEntity();//拿到返回的HttpResponse的"实体"
            String content = EntityUtils.toString(result);
            LogUtils.debug(content);//打印返回的信息
            JSONObject res = JSONObject.fromObject(content);
            map=JsonUtil.parseJSON2Map(res);
        } catch (Exception e) {
            e.printStackTrace();
            LogUtils.debug("获取openid失败");
        }
        return map;

按照微信的提示,一步步拼接字符串,然后发送,返回值为json字符串,需要转为map取出。

{"session_key":"5R3z85tnz+iLS+GbdkjtEQ==","openid":"o2y8C5TK63lUNxgbEWn6o_aqM9E8"}

下面贴出第一个工具类

public class JsonUtil {
    public static Map<String, Object> parseJSON2Map(JSONObject json) {
        Map<String, Object> map = new HashMap<String, Object>();
        // 最外层解析
        for (Object k : json.keySet()) {
            Object v = json.get(k);
            // 如果内层还是数组的话,继续解析
            if (v instanceof JSONArray) {
                List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
                @SuppressWarnings("unchecked")
                Iterator<JSONObject> it = ((JSONArray) v).iterator();
                while (it.hasNext()) {
                    JSONObject json2 = it.next();
                    list.add(parseJSON2Map(json2));
                }
                map.put(k.toString(), list);
            } else {
                map.put(k.toString(), v);
            }
        }
        return map;
    }

}

wx.getuserInfo

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。1

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t &ThinSpace; . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. 注脚的解释 ↩︎

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

图文详解微信小程序如何实现微信授权登录(Java后台)上 的相关文章

随机推荐

  • Java Eclipse如何调试代码

    下面通过一个简单的例子来了解一下 Eclipse 调试程序的方法 public class Test1 public static void main String args for循环 如果for后面 内的条件一直成立 内的代码一直执行
  • Pandas基础操作

    Pandas基础 文章目录 Pandas基础 一 Series 二 DataFrame 三 索引值 四 索引和选取 loc和iloc函数讲解 五 行和列的操作 map apply applymap函数讲解 Pandas的函数应用 层级索引
  • 数据结构与算法之快速排序

    package com yg sort author GeQiLin date 2020 2 26 21 00 import java util Arrays public class QuickSort private static in
  • [SWPUCTF 2021 新生赛]easyupload2.0

    打开以后是一个文件上传的界面 然后用burp抓包看一下 传入一个php文件 发现php是不行滴 然后想到用phtml改一下后缀 看是否可以略过 然后发现掠过了 爆出来了路径 上传成功 直接用蚁建 lianjie 链接成功 然后目录寻找fla
  • pthread_mutex_t 和 pthread_cond_t 配合使用的简要分析

    pthread mutex t 和 pthread cond t 配合使用的简要分析 1 原理 假设有两个线程同时访问一个全局变量 n 这个全局变量的初始值等于0 Int n 0 消费者线程 A 进入临界区 访问 n A 必须等到 n 大于
  • idea~不定时更新

    idea 不定时更新 类结构图 全局搜索和替换 修改鼠标停留 并显示api描述 开启idea下方边框 https www jetbrains com help idea 2019 2 using code editor html utm s
  • python运算符讲解

    作者 小刘在这里 每天分享云计算网络运维课堂笔记 疫情之下 你我素未谋面 但你一定要平平安安 一 起努力 共赴美好人生 夕阳下 是最美的 绽放 愿所有的美好 再疫情结束后如约而至 目录 运算符 python运算符 一 运算符类型 二 实际应
  • 【超详细】gitee+picgo个人图床搭建+插件安装bug处理

    超详细 gitee picgo个人图床搭建 各种插件安装bug处理 你好我是久远 最近在搭个人静态网页 到了最后一步了 传了几篇文章上去 结果文章传上去 了 图片全都失效了 没有办法 用现成的图床吧 担心哪天网站不稳定 图片全炸掉 所以最后
  • Android10.0 Binder通信原理(九)-AIDL Binder示例

    Android取经之路 的源码都基于Android Q 10 0 进行分析 Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系
  • 【文献调研】慢病患者就医行为预测:就医选择行为有哪些?预测什么?如何预测?慢病患者?

    文章目录 0 吾日三问 1 基于医保数据的就医行为预测及推荐模型的研究 1 1 摘要 1 2 基于张量CP分解的就医行为分组预测模型 1 3 总结 2 居民就医行为主要影响因素的调查研究 2 1 摘要 2 2 相关内容 3 分级诊疗背景下多
  • 2020-11-22

    实验三 XSS和SQL注入 实验目的 了解什么是XSS 了解XSS攻击实施 理解防御XSS攻击的方法 了解SQL注入的基本原理 掌握PHP脚本访问MySQL数据库的基本方法 掌握程序设计中避免出现SQL注入漏洞的基本方法 掌握网站配置 系统
  • Windows批处理(cmd/bat)常用命令小结

    一 前言 批处理文件 batch file 包含一系列 DOS命令 通常用于自动执行重复性任务 用户只需双击批处理文件便可执行任务 而无需重复输入相同指令 编写批处理文件非常简单 但难点在于确保一切按顺序执行 编写严谨的批处理文件可以极大程
  • Josephus问题,数组和链表(C++实现)

    文章目录 问题 需求分析 ADT定义 关键思路 问题 设有n个人围坐在圆桌周围 现从第s个人开始报数 数到第m的人出列 然后从出列的下一个人重新开始报数 数到第m的人又出列 如此反复直到所有的人全部出列为止 需求分析 n个人坐满一张圆桌 为
  • verilog赋多位值_Verilog重点解析(2)(赋值)

    源自 微信公众号 数字芯片实验室 1 连续赋值和过程赋值之间有什么区别 2 initial和always中的赋值有什么区别 initial和always中的赋值都是过程赋值 3 阻塞和非阻塞赋值之间有什么区别 阻塞和非阻塞赋值都是过程赋值
  • Zabbix监控Windows客户端设置

    Zabbix监控Windows客户端设置 一 Windows被控端安装 1 Windows代理下载 2 安装代理 二 检查被控端状态 1 查看端口 2 检查代理服务 3 服务端查看获取被控信息 三 Web端添加被控主机 1 添加主机信息 2
  • [1078]Win10配置Java环境变量

    文章目录 1 下载安装JDK 2 配置环境变量 2 1 找到jdk的安装目录 2 2 添加环境变量 2 3 测试 1 下载安装JDK 下载地址 安装就不赘述了 2 配置环境变量 2 1 找到jdk的安装目录 win e打开资源管理器 找到j
  • 手势控制arduino-wifi小车(含代码)

    手势控制器 小车完成图 贴代码 手势控制器代码 include
  • 使用VHDL语言控制相机

    将CMOS相机与ZYNQ 7000系列FPGA SoC连接 并将实时视频输入输出到VGA屏幕 硬件 软件 概述 在这个项目中 我们将从头开始构建一个FPGA映像平台 目的是将VGA分辨率CMOS相机与MiniZed Development板
  • 计算机超频的好处与坏处,CPU超频有什么坏处,到底会不会有副作用?

    超频是指提高计算机某一部件工作频率而使之工作在非标准频率下的行为及相关行动都应该称之为超频 其中包括CPU超频 主板超频 内存超频 显示卡超频和硬盘超频等等很多部分 一方面 超频可以使系统性能提升 并且提升产品的实用价值 但是对于大多数人仍
  • 图文详解微信小程序如何实现微信授权登录(Java后台)上

    详解微信小程序如何实现微信授权登录 Java后台 springboot框架 附关键源码 jar包依赖