授权使用微信登陆第三方_微信图标改成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授权认证

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • linux文件共享 samba_文件共享服务

    linux文件共享 samba_文件共享服务Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成;SMB(ServerMessagesBlock,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务;SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统,

  • android 测试用例模板下载,app测试用例模板.doc

    android 测试用例模板下载,app测试用例模板.docapp测试用例模板APP基本测试用例个人首页1.我的页面2.个人信息页面3.个性标签页面4.TA的页面消息页面消息页面发布商品和图片发布商品分享图片买买买页面买买买页面一级分类页面买手热荐品类二级分类页面侧边栏页面购物车页面我的钱包页面一、编号条件步骤预期结果实际结果1打开我的页面?出现我的信息(头像、昵称、签名、关注数、粉丝数、入手、出手)、中部出现切换我发表的与我喜欢的tab、下部列表出现内容…

  • Oracle创建用户、角色、授权、建表

    Oracle创建用户、角色、授权、建表oracle数据库的权限系统分为系统权限与对象权限。系统权限(databasesystemprivilege)可以让用户执行特定的命令集。例如,createtable权限允许用户创建表,grantanyprivilege权限允许用户授予任何系统权限。对象权限(databaseobjectprivilege)可以让用户能够对各个对象进行某些操作。例如delete权限允许用

  • android菜鸟教程_菜鸟软件下载app

    android菜鸟教程_菜鸟软件下载app相对布局是通过相对定位的方式让控件出现在布局任意位置; 在相对布局中如果不指定控件摆放的位置,那么控件都会被默认放在RelativeLayout的左上角。因此要先指定第一个控件的位置,其他控件为该位置的相对位置;RelativeLayout属性:(使用相对布局属性需要先指定控件的id,其他控件根据该控件的id,来确定相对于该控件的相对位置)示例:xmlversion=”1

    2022年10月30日
  • 初识JMM_一!,识J

    初识JMM_一!,识J1.什么是JMM?JMM:(JavaMemoryModel的缩写)作用:缓存一致性协议,用于定义数据读写的规则。JMM定义了线程工作内存和主内存之间的抽象关系:线程之间的共享变量存储在主内存(MainMemory)中,每个线程都有一个私有的本地内存(LocalMemory)所有的变量都存储在主内存中,每个线程还有自己的工作内存,工作内存存储在高速缓存或者寄存器中,保存了该线程使用的变量的主内存副本拷贝。线程只能直接操作工作内存中的变量,不同线程之间的变量值传递需要通过主内存来完成。

  • oracle删除索引并释放空间_oracle日志文件 定期清理

    oracle删除索引并释放空间_oracle日志文件 定期清理1.背景概述近期应用升级上线过程中,存在删除业务表索引的变更操作,且因删除索引导致次日业务高峰时期,数据库响应缓慢的情况,经定位是缺失索引导致。与用户沟通,虽然变更中删除索引的需求很少,但也存在此类需求。本文从数据库层面,旨在尽可能避免类似问题发生,制定删除索引的变更规范。2.索引删除规范若确认需要做索引删除,可以使用Oracle提供的两个功能特性协助判断删除索引是否会有隐患。2.1增加索引监控…

发表回复

您的电子邮箱地址不会被公开。

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