官网地址:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
官网提供的四个步骤
- 第一步:用户同意授权,获取code
- 第二步:通过code换取网页授权access_token
- 第三步:刷新access_token(如果需要)
- 第四步:拉取用户信息(需scope为 snsapi_userinfo)
- 附:检验授权凭证(access_token)是否有效
一、获取code
首先我们需要引导用户打开这个链接
https://open.weixin.qq.com/connect/oauth2/authorize?
appid=appid //微信的appid
&redirect_uri= //授权成功后需要跳转的页面
&response_type=code //返回类型,填写code
&scope=snsapi_userinfo
&state=STATE#wechat_redirect
-
所需要的参数
-
授权效果
当用户点击链接后则会自动出现微信的这个授权页面,当点击确定登入的时候,就会重定向到我们链接中redirect_uri的地址,并且这个地址后面微信会给拼接一个code
-
测试效果
以下就是我测试中跳转的地址,可以看到多了个code参数,这个code参数只有本次有效,重新点击链接则会重新生成,这样我们就拿到了code值。
二、获取access_token
第一部获得微信返回的code后,拿着这个CODE 还有APPID还有公钥我们在获取access_token
url = "https://api.weixin.qq.com/sns/oauth2/access_token?
appid=APPID //公众号的appid
&secret=SECRET // 公众号的appsecret
&code=CODE /// 填写第一步获取的code参数
&grant_type=authorization_code"; // 填写为authorization_code
//发送doGet请求
JSONObject htmlAccessToken = HttpUtil.doGet(url);
// 返回说明
// 正确时返回的JSON数据包如下:
{
"access_token":"ACCESS_TOKEN", // 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
"expires_in":7200, // access_token接口调用凭证超时时间,单位(秒)
"refresh_token":"REFRESH_TOKEN", // 用户刷新access_token
"openid":"OPENID", // 用户唯一标识
"scope":"SCOPE" // 用户授权的作用域,使用逗号(,)分隔
}
-
参数说明
-
返回参数说明
三、刷新access_token
-
由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。
-
获取第二步的refresh_token后,请求以下链接获取access_token:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN -
请求方式同步骤二 用 HttpUtil.doGet(replace)
-
参数说明
-
返回参数说明
四、拉取用户信息
//请求方法
String url = https://api.weixin.qq.com/sns/userinfo
?access_token=ACCESS_TOKEN // 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
&openid=OPENID // 用户的唯一标识
&lang=zh_CN // 国家地区语言版本
//发送doGet请求
JSONObject htmlAccessToken = HttpUtil.doGet(url);
//返回说明
//正确时返回的JSON数据包如下:
{
"openid": "OPENID",
"nickname": NICKNAME,
"sex": 1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
-
参数说明
-
返回参数说明
-
检验授权凭证(access_token)是否有效
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库