网站首页 > 技术教程 正文
写在前面
在日常开发过程中我们难免会遇到需要网页授权登录获取用户openId的情况,随着开发的深入我们会有很多网页需要用到用户的openId,而我们不可能每次都去写一个授权登录的接口去匹配每个网页,为了减少我们重复的工作,本篇文章将分享一个所有网页公共授权方案包括未配置的安全域名下的网页。如有不足之处,可在评论区指出。
本次使用开发语言为java。使用框架springboot。
前期配置
我们都知道要想实现微信公众号的网页授权登录,需在公众号管理后台“设置与开发”->“公众号设置”->"功能设置"中设置网页授权域名,如下图所示
但是微信官方将此域名配置限制为仅可设置两个,那我们需要跳转其他域名怎么办呢,其实很简单,我们接着往下看!
授权流程
大家都知道微信网页授权只需要在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(已认证服务号,默认拥有 scope 参数中的snsapi_base和snsapi_userinfo 权限),引导关注者打开如下页面:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
需要注意的是这里的授权登录很有可能多次转发,导致code过期的情况,因此可以加入参数connect_redirect=1告诉微信仅跳转一次
REDIRECT_URI就为我们的用户确认授权后 微信转发的地址 我们要实现公共网页的授权登录就在这里做文章
关于scope作用域这里就不再过多地描述snsapi_base仅可以拿到户的 openid,并且用户是无感知的,是静默的。snsapi_userinfo可以拿到用户的基本信息,但不是无感知的需要用户手动确认,特殊情况除外(对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是 scope 为snsapi_userinfo,也是静默授权,用户无感知)。
实现代码
/**
* 公共重定向
* @param url
* @param request
* @return
*/
@RequestMapping("/common")
public String authCommonUrl(String url, HttpServletRequest request)
try {
if (StringUtils.isEmpty(url)) {
return "/error";
}
return "redirect:https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + environment.getProperty("wechat.appId")
+ "&redirect_uri="
+ URLEncoder.encode(
environment.getProperty("wechat.baseRedirectUrl") + "/authcommonurl?url=" + URLEncoder.encode(url, "utf-8"),
"utf-8")
+ "&response_type=code&scope=snsapi_userinfo&connect_redirect=1&state=join#wechat_redirect";
} catch (Exception e) {
logger.error("重定向发生异常->RedirectController.authCommon:" + ParamsUtils.showParams(request), e);
return "/error";
}
}
可以看到我们将redirect_uri设置成了一个公共的获取用户信息的接口地址,然后在该地址上传入我们需要最终跳转的url,这里的url我们如果需要传递其他参数,也可以直接加在url上。这里我们只要保证redirect_uri在网页授权的安全域名下,而url任意域名都可以啦。
获取用户信息重定向url地址
/**
* 授权回调转发
* @param url
* @param code
* @param request
* @return
*/
@SuppressWarnings({ "unchecked" })
@RequestMapping(value = "/authcommonurl")
public String authCommon(String url, String code, HttpServletRequest request) {
HttpSession session = request.getSession();
try {
if (StringUtils.isEmpty(url)) {
return "/error";
}
if (StringUtils.isEmpty(code)) {
return "/error";
}
// 首先判断session中是否存在用户信息,存在则跳过以下获取用户信息方法,不存在继续执行
String sessionId = session.getId();
CacheObject<JSONObject> cache = MapCacheManager.getInstance().getCache(sessionId);
JSONObject userInfoJO = cache != null ? cache.getObject() : null;
if (userInfoJO == null || StringUtils.isEmpty(userInfoJO.optString("nickname", ""))) {// 里面为整个网页登录授权过程
// 调用获取accessToken接口 获取accessToken
String json = HttpsUtil.httpMethodGet(getAccessTokenUrl(code), "UTF-8");
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(json);
} catch (Exception e) {
logger.error("获取授权accesstoken转换json异常->NotStaticAuthReturnController.authHd:" + json, e);
}
if (!jsonObject.has("access_token")) {
return "/error";
}
String access_token = jsonObject.optString("access_token", "");
String openid = jsonObject.optString("openid", "");
// 得到获取用户信息的链接
// 获取用户信息接口 获取用户信息
String userInfoJson = HttpsUtil.httpMethodGet(getUserinfoUrl(access_token, openid), "UTF-8");
try {
userInfoJO = new JSONObject(userInfoJson);
} catch (JSONException e) {
userInfoJO = new JSONObject();
logger.error("获取用户信息转换json异常->NotStaticAuthReturnController.authcommon:" + userInfoJson, e);
}
if (!userInfoJO.has("nickname")) {
return "/error";
}
userInfoJO.put("nickname", EmojiFilter.filterEmoji(userInfoJO.optString("nickname", "")));
cache = new CacheObject<>();
cache.setExpires_in(7200L);
cache.setObject(userInfoJO);
MapCacheManager.getInstance().putCache(sessionId, cache);
}
// System.out.println("用户信息:" + userInfoJO.toString());//输出用户信息 测试用
String user_openid = userInfoJO.optString("openid", "");
if (StringUtils.isEmpty(user_openid)) {
return "/error";
}
return "redirect:" + url + (url.contains("?") ? "&" : "?") + "openId=" + user_openid;
} catch (Exception e) {
e.printStackTrace();
logger.error("微信授权异常->NotStaticAuthReturnController.authCommonurl:" + ParamsUtils.showParams(request), e);
return "/error";
}
}
这里我们作用域是snsapi_userinfo有获取用户的基本信息,若无需这些信息,按需求删除代码即可。
如有问题或不足之处可在评论区指出,觉得还行的看官动动小手帮忙点个赞吧!
祝大家健健康康,每天开开心心!
- 上一篇: 网络连接不上时网络设置(自用自救)
- 下一篇: 一台电脑上怎么登陆两个微信账号?登陆两个账号的操作方法
猜你喜欢
- 2024-10-25 微信这个开关要尽快清理,不然微信被别人登录了,你可能都不知道
- 2024-10-25 微信PC端终于可以自动登陆了,再教你如何微信多开和消息防撤回
- 2024-10-25 微信 Android 版本的 8.0.9 发布:是正式版
- 2024-10-25 微信PC端将支持自动登录(微信自动电脑登陆)
- 2024-10-25 微信电脑版今早崩了?网友反映无法登录,腾讯回应
- 2024-10-25 微信PC版自动登录功能即将上线(微信pc端自动登陆)
- 2024-10-25 一早起来发现,微信崩了?网友:无法登录电脑端,急!
- 2024-10-25 微信被自动登录?官方:纯属误解!教你查看你的微信是否被登录
- 2024-10-25 微信网页版文件传输助手正式上线:可与手机、平板、PC端同时在线
- 2024-10-25 腾讯邮箱如何『绑定微信』开启安全登录『客户端专用密码』?
你 发表评论:
欢迎- 09-12思科交换机常用配置命令_思科 交换机命令
- 09-12思科交换机配置命令大全,交换机配置案例详解
- 09-12思科网络交换机配置命令(详细命令总结归纳)
- 09-12你天天都在使用笔记本电脑,那么笔记本的键盘功能你真的了解吗?
- 09-12拳皇97全人物摇杆键盘出招表 妈妈再也不用担心我的97了
- 09-12咔咔响的机械键盘 还有这些你不知道的
- 09-12电脑手机数字键盘的使用方法_电脑用手机键盘输入
- 09-12键盘功能键使用_键盘功能键是哪个位置
- 最近发表
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)