授权使用微信登陆第三方_微信图标改成WeChat

授权使用微信登陆第三方_微信图标改成WeChat第三方平台系列文章,今天终于又开始更新了,今天继续学习微信(wechat)授权第三方登录一、准备工作1、申请微信公众测试号由于我们是个人开发者,我们需要去注册申请一个微信公众平台的测试号https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login我们使用微信扫码登录后,我们可以拿到appID和appsecret2、关注公众测试号3、配置回调域名在“网页服务”中找到“网页账号”,修改“网页授权获取用户基本信息”接口的

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

第三方平台系列文章,今天终于又开始更新了,今天继续学习微信(wechat)授权第三方登录

一、准备工作

1、申请微信公众测试号

由于我们是个人开发者,我们需要去注册申请一个微信公众平台的测试号

https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

Jetbrains全家桶1年46,售后保障稳定

微信公众平台
我们使用微信扫码登录后,我们可以拿到 appID 和 appsecret

测试号管理

2、关注公众测试号

测试号二维码

3、配置回调域名

在“网页服务”中找到“网页账号”,修改“网页授权获取用户基本信息”接口的回调域名

修改接口信息
授权回调页面域名
注意:这里说的是,配置网页授权回调页面 域名,跟我们平常对接的第三方接口不一样,不用填写完整的回调地址,只是回调域名,回调地址在回调域名之下

  • 例如
    回调地址:http://www.baidu.com/wechat/back
    那么这里:baidu.com

新手一般在这里容易弄混,配置完成,点击“确认”即可

二、开始开发

1、获取应用信息

我们将获取到的 appID 和 appsecret 写在配置文件中,我这里是 SpringBoot 项目,我就放在 application.yml 文件中

配置信息

2、引入 maven 依赖

<!-- 网络请求 -->
<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpclient</artifactId>
	<version>4.5.6</version>
</dependency>
<!-- alibaba的fastjson -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.51</version>
</dependency>

这里我们需要用到网络请求,和 JSON 对象的转换,所以我引入了 httpclient 和 fastjson,其余依赖请自行引入

3、从配置文件中获取 “wechat” 配置信息

/** * 公众平台提供的 appid 和 appsecret */
@Value("${wechat.oauth.appid}")
public String APPID;
@Value("${wechat.oauth.appsecret}")
public String APPKEY;
@Value("${wechat.oauth.callback}")
public String URL;

4、重定向到授权页面

/** * 请求授权页面 */
@RequestMapping("/auth")
public String token(HttpSession session) throws Exception { 
   
    // 用于第三方应用防止CSRF攻击
    String uuid = UUID.randomUUID().toString().replaceAll("-", "");
    session.setAttribute("state", uuid);
	// Step1:获取Authorization Code
    String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
            "appid=" + APPID +
            "&redirect_uri=" + URLEncoder.encode(URL) +
            "&response_type=code" +
            "&scope=snsapi_userinfo" +
            "&state=" + uuid +
            "#wechat_redirect";
    return PasswordUtils.redirectTo(url);
}
  • Step1 参数解释如下:
参数 是否必须 说明
appid 公众号的唯一标识
redirect_uri 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
response_type 返回类型,请填写code
scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数

授权页面
这时,我们访问,便会出现授权页面

5、授权回调

/** * 授权回调 */
@GetMapping(value = "/callback")
public void callback(HttpServletRequest request) throws Exception { 
   
    HttpSession session = request.getSession();
    // 得到Authorization Code
    String code = request.getParameter("code");
    // 我们放在地址中的状态码
    String state = request.getParameter("state");
    String uuid = (String) session.getAttribute("state");

    // 验证信息我们发送的状态码
    if (null != uuid) { 
   
        // 状态码不正确,直接返回登录页面
        if (!uuid.equals(state)) { 
   
            return PasswordUtils.redirectTo("/login");
        }
    }

    // Step2:通过Authorization Code获取Access Token
    String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
            "appid=" + APPID +
            "&secret=" + APPKEY +
            "&code=" + code +
            "&grant_type=authorization_code";
    JSONObject resJson = HttpRequestUtils.httpRequestGet(url);
    if (null == resJson) { 
   
        return PasswordUtils.redirectTo("/login");
    }
    String accessToken = resJson.getString("access_token");
    String openId = resJson.getString("openid");
    if (StringUtils.isBlank(accessToken) || StringUtils.isBlank(openId)) { 
   
        return PasswordUtils.redirectTo("/login");
    }

    url = "https://api.weixin.qq.com/sns/userinfo?" +
            "access_token=" + accessToken +
            "&openid=" + openId +
            "&lang=zh_CN";
    // Step3: 获取微信用户信息
    resJson = HttpRequestUtils.httpRequestGet(url);
    /** * TODO 这时就该写自己的业务逻辑了 */
}
  • Step2 参数解释如下:
参数 是否必须 说明
appid 公众号的唯一标识
secret 公众号的appsecret
code 填写第一步获取的code参数
grant_type 填写为authorization_code
  • Step3 参数解释如下:
参数 是否必须 说明
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
openid 用户的唯一标识
lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

6、网络请求方法

Step 2 和 Step 3 均为 GET 请求方式

/** * GET 请求 */
public static JSONObject httpRequestGet(String url) throws IOException { 
   
    CloseableHttpClient client = HttpClients.createDefault();
    HttpGet httpGet = new HttpGet(url);
    HttpResponse response = client.execute(httpGet);
    HttpEntity entity = response.getEntity();
    if (entity != null) { 
   
        String result = EntityUtils.toString(entity, "UTF-8");
        return JSONObject.parseObject(result);
    }
    httpGet.releaseConnection();
    return null;
}

三、文档资料

关于微信授权登录的文档地址如下:

https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

四、总结

该授权认证过程符合 OAuth2 认证基本流程,对于应用而言,其流程由获取Authorization Code和通过Authorization Code获取Access Token这2步组成,如图所示:

OAuth授权认证

如您在阅读中发现不足,欢迎留言!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200867.html原文链接:https://javaforall.net

(0)
上一篇 2025年8月19日 下午11:01
下一篇 2025年8月19日 下午11:43


相关推荐

  • AvalonEdit

    AvalonEditAvalonEditAvalonEditisaWPF-basedtexteditorcomponent.Itwaswrittenby DanielGrunwald&#

    2022年7月2日
    38
  • 77道Spring面试题以及参考答案(2021年最新版)

    77道Spring面试题以及参考答案(2021年最新版)一、Spring概述1.什么是spring?Spring是一个轻量级Java开发框架,最早有RodJohnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEEfull-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。Spring可以做很多事情,它为企

    2022年5月7日
    108
  • Java基础——成员变量、局部变量和静态变量的区别

    Java基础——成员变量、局部变量和静态变量的区别之前在刚开始学习Java的时候,就谈了谈Java基础中的变量,虽然知道这货以后会经常用到,但没想到了基本语法这里,竟然有冒出来了成员变量、局部变量和静态变量。变来变去太容易让人搞晕了,挑拣出来梳理一下喽!    要想区分这哥仨,首先,我们得知道它们分别是什么。先从成员变量下刀。成员变量    我们来研究一个事物:        属性:外在特征;例如人的身高

    2022年5月1日
    64
  • jvm的垃圾回收算法_jvm垃圾回收策略

    jvm的垃圾回收算法_jvm垃圾回收策略前言相比C语言,JVM虚拟机一个优势体现在对对象的垃圾回收上,JVM有一套完整的垃圾回收算法,可以对程序运行时产生的垃圾对象进行及时的回收,以便释放JVM相应区域的内存空间,确保程序稳定高效的运行,但在真正了解垃圾回收算法之前,有必要对JVM的对象的引用做一个简单的铺垫JVM对象可达性分析算法Java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象扫描堆中的对象,看是否能够沿着GCRoot对象为起点的引用链找到该对象,找不到表示可以被回收想象一下,对象在什么情况下会被认为是垃圾对象呢?

    2025年10月26日
    4
  • springboot项目使用IDEA远程Debug「建议收藏」

    springboot项目使用IDEA远程Debug「建议收藏」项目上线之后,如果日志打印的很模糊或者业务逻辑比较复杂,有时候无法定位具体的错误原因,因此可以通过IDEA远程代理进行Debug。线上的代码一定要和本地的一致!环境:2.1.4.RELEASE(org.springframework.boot) jdk1.8 ApacheMaven3.5.01、先创建一个准备远程调试的Demo,注意构建项目的配置<?xmlversion=”1.0″encoding=”UTF-8″?><projectxmlns=”htt.

    2025年10月19日
    5
  • 沉浸式翻译配置 Deepseek API 教程:3分钟搞定翻译接入

    沉浸式翻译配置 Deepseek API 教程:3分钟搞定翻译接入

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号