JAVA实现微信授权登录(详解)

2023-10-26

第一步:(前期设置)登录微信公众号接口测试平台设置信息

登录微信公众号接口测试平台
登录成功后可以看到测试用的appid和appsecret,稍后再后台我们要用到这两个ID,如下图
在这里插入图片描述
紧接着需要设置网页授权(体验接口权限表 —》 网页服务 —》网页帐号 —》 网页授权获取用户基本信息)
在这里插入图片描述
在这里插入图片描述
没有域名的话可以用内网穿透动态解析一个域名
NATAPP链接
注册登录成功后可以看到下图,选择免费隧道
在这里插入图片描述
购买免费的隧道之后,可以直接按照官方的一分钟教程完成内网穿透,这样我们就拿到了我们的域名
这个地方有一个坑,就是mac电脑通过natapp下载之后,新建一个natapp目录,将压缩包移入解压,需要在新建一个config.ini文件,内容:

#将本文件放置于natapp同级目录 程序将读取 [default] 段
#在命令行参数模式如 natapp -authtoken=xxx 等相同参数将会覆盖掉此配置
#命令行参数 -config= 可以指定任意config.ini文件
[default]
authtoken=                      #对应一条隧道的authtoken
clienttoken=                    #对应客户端的clienttoken,将会忽略authtoken,若无请留空,
log=none                        #log 日志文件,可指定本地文件, none=不做记录,stdout=直接屏幕输出 ,默认为none
loglevel=ERROR                  #日志等级 DEBUG, INFO, WARNING, ERROR 默认为 DEBUG
http_proxy=                     #代理设置 如 http://10.123.10.10:3128 非代理上网用户请务必留空

将得到的authtoken填进去,authtoken在这个里
在这里插入图片描述
然后打开终端,进入该目录下,先执行

chmod a+x natapp

再执行

 ./natapp

运行成功就是下面这个界面了

在这里插入图片描述
⚠️:我们的端口号要与项目的端口号一致,例如:我们项目的端口号是8080,那么natapp中也要设置为8080
设置步骤:
在这里插入图片描述
在这里插入图片描述

第二步:代码实现微信授权。

简单来说,微信授权分为四步:
1.授权登录接口。
2.用户点击授权。
3.微信授权回调接口。
4.在回调接口中获取openid、access_token、获取用户信息。

第一步:先上工具类AuthUtil

public class AuthUtil {
	public static final String APPID = "wxf80f3f5e8c5a06bb";
    public static final String APPSECRET = "49ec132fa089a70916a4d90ff46bce90";

    //回调地址
    public static final String backUrl="http://zchhai.natappfree.cc/api/callBack";//如果你没有在application.yml文件中设置 context-path: /api,那么api就去掉
//    public static final String backUrl="http://localhost:8080/callBack";
    public static JSONObject doGetJson(String url) throws ClientProtocolException, IOException{
        JSONObject jsonObject = null;

        // 创建HttpClient实例
        HttpClient client =  HttpClientBuilder.create().build();
        // 根据URL创建HttpGet实例
        HttpGet get = new HttpGet(url);
        // 执行get请求,得到返回体
        HttpResponse response = client.execute(get);
        System.out.println(response);
        //从response里面拿自己想要的结果
        HttpEntity entity = response.getEntity();
        if(entity != null){
            String result = EntityUtils.toString((HttpEntity) entity,"UTF-8");
            jsonObject = jsonObject.fromObject(result);
        }
        //把链接释放掉
//        HttpGet.releaseConnection();
        return jsonObject;
    }
}

第二步:WxAuthorizeController的微信授权接口

   /**
    * Tea微信登录接口
    * @throws IOException 
    */
   @IgnoreAuth
   @RequestMapping("/health-service/wxlogin")
    public void wx(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //第一步:引导用户进入授权页面同意授权,获取code
        StringBuilder builder = new StringBuilder("https://open.weixin.qq.com/connect/oauth2/authorize?appid=");
        builder.append(AuthUtil.APPID);
        builder.append("&redirect_uri=");
        builder.append(URLEncoder.encode(AuthUtil.backUrl));//开发文档要求转换
        builder.append("&response_type=code");
        builder.append("&scope=snsapi_userinfo");
        builder.append("&state=STATE#wechat_redirect");
        //授权页面地址
        //将StringBuilder转换成String
        String url=builder.toString();
        //重定向到授权页面
        response.sendRedirect(url);
    }
    /**
    * Tea微信登录接口回调
    */
    @RequestMapping(value="/callBack")
    public Response wxcallback(@RequestParam("code") String code, Model model)throws IOException {
        System.out.println("code:" + code);
        //获取code后,请求以下链接获取access_token
        StringBuilder builder = new StringBuilder("https://api.weixin.qq.com/sns/oauth2/access_token?appid=");
        builder.append(AuthUtil.APPID);
        builder.append("&secret=");
        builder.append(AuthUtil.APPSECRET);
        builder.append("&code=");
        builder.append(code);
        builder.append("&grant_type=authorization_code");

        //通过网络请求方法来请求上面这个接口
        //将StringBuilder转换成String
        String url=builder.toString();
        JSONObject jsonObject = AuthUtil.doGetJson(url);

        System.out.println("==========================jsonObject" + jsonObject);
        //从返回的JSON数据中取出access_token和openid,拉取用户信息时用
        String token = jsonObject.getString("access_token");
        String openid = jsonObject.getString("openid");

        // 第三步:刷新access_token(如果需要)

        // 第四步:拉取用户信息(需scope为 snsapi_userinfo)
        StringBuilder builder1 = new StringBuilder("https://api.weixin.qq.com/sns/userinfo?access_token=");
        builder1.append(token);
        builder1.append("&openid=");
        builder1.append(openid);
        builder1.append("&lang=zh_CN");
        //通过网络请求方法来请求上面这个接口
        //将StringBuilder转换成String
        String infoUrl=builder1.toString();
        JSONObject userInfo = AuthUtil.doGetJson(infoUrl);

        System.out.println("userInfo=======" + userInfo);

        //第1种情况:使用微信用户信息直接登录,无需注册和绑定
//        model.addAttribute("info",userInfo);
//        return "wx/wxtest1";
//

        //第2种情况:查看数据库是否存在相对应用户
        try {
            WxUser wxuser = new WxUser();
            wxuser = wxService.findnameByopenId(openid);
            System.out.println("wxuser=======" + wxuser);
            if (wxuser != null) {
                //已绑定
                model.addAttribute("info",userInfo);
                model.addAttribute("name", wxuser.getName());
                Response response = new Response("已授权成功",1,true);
                return response;

            } else {
                //未绑定
                model.addAttribute("openid", openid);
                model.addAttribute("info",userInfo);
                Map<String, Object> dataMap = new HashMap<>();
                dataMap.put("openid", openid);
                dataMap.put("info", userInfo);
                Response response = new Response();
                response.setResponse(true,"授权成功",200,dataMap);
                return response;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        Response response = new Response("授权失败",1,true);
        return response;
    }
	/**
     * 微信登录成功后将用户信息插入数据库
     */
    @RequestMapping(value="/health-service/addwxuser")
    public Response addWXuser(@RequestParam("openid") String openid,@RequestParam("name") String name,@RequestParam("sex") String sex,@RequestParam("city") String city,@RequestParam("urlimg") String urlimg){

        int count = wxService.addWxuser(openid,name,sex,city,urlimg);
        if(count>0){
            Response response = new Response("添加成功",1,true);
            return response;
        }
        Response response = new Response("添加失败",-1,false);
        return response;
//        return "wx/success";//跳转绑定成功页面

    }

参数如下
在这里插入图片描述

最后

我们在微信开发者工具中进行接口验证
1.进入开发者工具选择公众号网页
在这里插入图片描述
在这里插入图片描述
2.在上面的地址了输入我们的微信登录接口
在这里插入图片描述
在这里插入图片描述
如果没有出现这个页面点击右上角的清缓存按钮,清除这两个
在这里插入图片描述
在重头开始就行了
3.授权之后我们就能看到我们的用户信息了
在这里插入图片描述
到此微信授权登录就好了,就可以进行用户信息添加到我们的数据库中了。

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

JAVA实现微信授权登录(详解) 的相关文章

  • Hibernate DDL表动态创建

    我有一个 spring boot 项目 我正在使用 hibernate 将我的实体映射到数据库 但是现在我有一个新的要求 我需要能够在数据库中动态创建表 而无需任何映射 到目前为止 有谁知道一些框架来帮助我处理这个问题 我想执行 SQL 或
  • 运行时异常无法在未调用 Looper.prepare 的线程内创建处理程序错误

    我正在尝试上传带有其他一些 EditText 的照片 我从在线示例中获取了示例代码并对其进行了一些编辑 但是 我收到此错误 08 29 21 36 46 000 E AndroidRuntime 4566 FATAL EXCEPTION A
  • 正则表达式 - 捕获所有重复组

    我有如下字符串 property one some text email protected cdn cgi l email protection another optional text here etc 其中包含 里面的字符串 我想通
  • 学习 Java Native Access 时出现 com.sun.glass.ui 包错误

    我正在尝试在 JavaFX 项目中使用 Undecorated 阶段 stage initStyle StageStyle UNDECORATED 它是一个模块化的 Gradle 项目 它也是一个多项目构建 https guides gra
  • maven依赖插件忽略依赖版本? [复制]

    这个问题在这里已经有答案了 在我看来 maven 依赖插件在计算依赖列表时行为不当 假设这 3 个项目 base1
  • 如何在Java程序中检索环境变量的修改值(外部修改的)?

    是否可以在 Java 程序中检索环境变量的修改值 我尝试使用System getenv 但新的值并没有体现在程序中 场景是这样的 该程序检索环境变量的值 当程序仍在运行时 该变量的值可以从外部更改 甚至可以是手动过程 例如在 Windows
  • ffmpeg 用于屏幕捕获?

    所以我有一个小程序来捕获屏幕和计算机麦克风的声音 然后屏幕截图被编码为 ScreenVideo2 声音被编码为 AAC 如何使用 ffmpeg 逐帧混合 然后将混合输出发送到 wowza 媒体服务器 如果用ffmpeg无法完成 您能提供一些
  • Android ImageView未加载

    我正在使用 android imageView 并将图像放入可绘制文件夹中 并将 imageView 源更改为该图像 但它没有在预览面板中显示图像 当我在 android studio 中打开图片时 它显示这样的错误 但我可以在电脑桌面上打
  • 了解 Android 上的默认键盘

    我想知道 Android 中用户选择的默认键盘 我知道我可以使用以下命令访问启用的输入法列表InputMethodManager 但我想知道用户当前使用的是哪一个 到目前为止 我已经尝试获取当前的输入法子类型 InputMethodMana
  • 如何设置按钮的大小?

    我将按钮放在带有 GridLayout 的 JPane 中 然后我用 BoxLayout Y AXIS 将 JPanel 放入另一个 JPanel 中 我希望 GridLayout 中的按钮是方形的 我使用 tmp setSize 30 3
  • 在JPA、关系型数据库等中,什么是Tuple? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在研究 Hibernate 和 JPA 并且一直在寻找这个术语 有人可以用实用和说教的方式向我解释一下这个术语是什么 以及它与 J
  • ElasticSearch JavaAPI (SearchScroll)- search_context_missing_exception","re​​ason":"找不到 id 的搜索上下文

    我正在获取超过100k使用一个索引中的文档searchScroll并在所有字段中再添加一个字段100K文件 然后再次将这些文档插入到另一个新索引中 我正在使用SearchScrollapi 也在设置大小searchSourceBuilder
  • Keycloak - 自定义表单操作在流程中不可见

    我正在尝试为用户注册实现自定义表单操作 我在表单上添加了一些自定义字段 我希望验证这些字段 在浏览了 keycloak 文档后 我意识到我需要 扩展 FormAction FormActionFactory 将actionfactory打包
  • CoreNLP 如何识别小写的命名实体,例如 kobe bryant?

    我遇到一个问题 CoreNLP 只能识别以大写字符开头的命名实体 例如科比 布莱恩特 Kobe Bryant 但无法识别科比 布莱恩特 kobe bryant 作为一个人 那么CoreNLP如何识别以小写字符开头的命名实体 赞赏它 首先 您
  • 如何使用 Spring 状态机在状态转换期间引发异常

    我试图了解状态转换期间操作如何抛出异常 我配置了这个简单的状态机 transitions withExternal source State A1 target State A2 event Event E1 action executeA
  • 如何正确关闭资源

    当我清理一些代码时 FindBugs 向我指出了一些使用 Connection CallableStatement 和 ResultSet 对象的 JDBC 代码 这是该代码的一个片段 CallableStatement cStmt get
  • 关于 servlet 的简要想法[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 从哪里可以获得有关 servlet 的知识 大多数人会从 Sun 的有关 servlet 的官方教程开
  • Swing JTable:当行可见或滚动到底部时发生事件?

    我正在寻找一种方法 以便在 JTable 滚动时收到通知 以便特定行变得可见 或者在表底部滚动到视图中时失败 理想情况下 这应该在不轮询的情况下完成 而是通过一些事件触发来完成 有任何想法吗 Add a ChangeListener到滚动窗
  • jtree 编程式多选

    是否能够以编程方式选择 JTree 中的多个树节点 我已经设置了多选模式tree getSelectionModel setSelectionMode TreeSelectionModel DISCONTIGUOUS TREE SELECT
  • 解压缩 GZIP http 响应(使用 jersey 客户端 api、java)

    有人可以告诉我在从某些 Http 调用获取响应时需要做什么才能解压缩 GZIP 内容吗 为了进行调用 我使用 Jersey Client API 请参阅下面的代码 String baseURI http api stackoverflow

随机推荐

  • 如何使用正则表达式实现Java日志信息的抓取与收集

    首先 什么是Java日志信息 简单来说 Java应用程序在运行过程中会输出一些信息 这些信息可以用来追踪程序运行状态 调试错误等 而Java日志信息就是这些输出信息的集合 那么为什么要抓取和收集Java日志信息呢 一方面 这些信息可以帮助我
  • 失业的程序员(八):创业的要素

    一 管饭哥登场 按理说我规定我和卞工的上班时间是上午8点到10点 弹性足够大 虽曰规定 但是遵不遵守随意 原因只有一个 引用卞工的话 就两个人 考毛勤 我 很是认可 严密的考勤制度的建立是老板对员工不怎么太信任的开始 是一种等级制度的体现
  • 1.神奇的字符串之快速求和

    文章目录 前言 正题 先看第一个代码 直接循环取出每一位数 总结 前言 这个专栏是分享一些好用的数据 和一些解题比较快的小方法 会持续更新 因为博主还是计算机方向的小白 知道的东西还是很少 希望大家可以多多指教 正题 众所周知 字符串一直是
  • PyTorch实现Logistic regression

    逻辑回归 Logistic regression 回归方法是对数值型连续随机变量进行预测和建模的监督学习算法 其特点是标注的数据集具有数值型的目标变量 回归的目的是预测数值型的目标值 逻辑回归对应线性回归 旨在解决分类问题 即将模型的输出转
  • python如何对微信应用进行监听

    要在 Python 中监听微信应用 需要使用微信提供的接口和相关的第三方库 具体实现方法如下 首先需要申请微信公众平台账号并获取相应的 AppID 和 AppSecret 使用第三方库 如 itchat 来进行接口调用 Itchat 是一个
  • Git提交error: RPC failed; result=22, HTTP code = 500的解决方法

    新建了一个项目使用sourcetree提交Git时 提示错误 RPC failed result 22 HTTP code 500 这是由于上传的包过大 HTTP的头错误导致的 解决办法 在终端执行命令显示隐藏文件夹 显示全部文件 defa
  • wget -o -O和-O-有什么区别?bash改色

    wget o O和 O 有什么区别 wget o 下载过程信息存入日志文件wget o youlogname log url 下载文件放另一边 wget O 以其他名称保存下载的文件内容 输出下载过程信息wget O home ym dem
  • linux之librdkafka库安装以及将#include <librdkafka/rdkafka.h>更改为#include <rdkafka.h>调用

    公众号 嵌入式不难 本文仅供参考学习 如有错误之处 欢迎留言指正 下载源代码 使用如下命令 git clone https github com edenhill librdkafka git 切换到发布的稳定分支 刚下载下来的源代码默认在
  • -O1 -O2 -O3 优化的原理是什么?

    一般来说 如果不指定优化标识的话 gcc就会产生可调试代码 每条指令之间将是独立的 可以在指令之间设置断点 使用gdb中的 p命令查看变量的值 改变变量的值等 并且把获取最快的编译速度作为它的目标 当优化标识被启用之后 gcc编译器将会试图
  • 鸿蒙应用开发学习

    系列文章目录 第一章 HarmonyOS是什么 第二章 基础环境和开发工具 文章目录 系列文章目录 前言 一 HarmonyOS工程介绍 二 工程目录结构 三 工程目录介绍 1 entry 2 Ability 3 库文件 4 资源文件 5
  • Linux指令中touch和mkdir的区别

    在Linux中 mkdir 用于创建空的文件夹 格式 mkdir 选项 目录 选项 功能 m 默认文件目录的权限 m755 p 连续创建多层 v 显示创建过程 touch touch 是用于创建新的文件 或者修改文件的时间
  • 福昕阅读器注册码

    以下文字复制到记事本存为frpkey txt 复制到福昕阅读器的安装目录即可 FoxitReaderPro SN FRPFZ12391Modules Users 1Licensee OlivierGuilloryLicenseDate 20
  • sql中and和or的混合使用

    1 and的优先级高于or 2 使用 调整优先级 下面sql没有添加过滤条件 下面sql查出的结果是错误的 下面sql查出的结果是正确的
  • 延时函数

    Dos sleep 1 停留1秒 delay 100 停留100毫秒 Windows Sleep 100 停留100毫秒 Linux sleep 1 停留1秒 usleep 1000 停留1毫秒 每一个平台不太一样 最好自己定义一套跨平台的
  • 继续探索Roop(单张图视频换脸)的各方面:比如喜闻乐见的“加速”

    文章目录 一 Roop项目的特点 二 Roop也能加速 三 Roop更新和依赖 3 1 飞速更新 3 2 依赖问题 3 3 需要CUDA么 前两天写了 简单介绍Roop 类似SimSwap 单张图视频换脸的项目 介绍了基本安装使用 之后这个
  • [1193]ClickHouse写入常见问题: Too many parts (300)

    文章目录 一 场景及错误信息 二 报错原因 三 解决办法 扩展 一 场景及错误信息 今天使用 Datax 往 ClickHouse 同步数据时 出现如下错误 ClickHouse exception code 1002 host 10 12
  • Ubuntu22.04安装mysql集群一主一从

    Ubuntu22 04安装mysql集群 以下是在Ubuntu 22 04上安装一主一从的MariaDB集群的步骤 首先 你需要有两个 Ubuntu 22 04 的服务器 分别命名为 Server1 和 Server2 这两个服务器都需要安
  • 可调用对象与lambda表达式

    可调用对象与lambda表达式 OVERVIEW 可调用对象与lambda表达式 1 using 1 函数指针别名 case1 定义基础类型 case2 定义函数指针别名 2 模板定义别名 2 可调用对象 1 包装器 case1 基本用法
  • uniapp幸运大转盘

  • JAVA实现微信授权登录(详解)

    第一步 前期设置 登录微信公众号接口测试平台设置信息 登录微信公众号接口测试平台 登录成功后可以看到测试用的appid和appsecret 稍后再后台我们要用到这两个ID 如下图 紧接着需要设置网页授权 体验接口权限表 网页服务 网页帐号