本片博客降解的网页授权分为两步,一是企业微信配置的自定义菜单,点击请求后台方法,该方法接收到请求,调用回调地址。二是再回调地址获取code,userid或openid、用户信息。完成授权流程,获取用户信息
一、准备工作
1、内网穿透
由于微信是本地开发,需要本地开发测试,准备一个内网穿透,将本地127.0.0.1:端口/项目名下所在的服务穿透到外网去,以便能与微信服务器通讯,开发调试;关于内网穿透的工具有很多,详细可以查看:可以实现内网穿透的几款工具,我个人比较推荐qydev,我使用的是qydev,qydev官网地址:https://www.qydev.com/
1.1开通内网穿透隧道
1.2内网穿透配置
1.3启动内网穿透
如有有问题,可参考qydev的官方教程
2、在企业微信配置可信域名
企业微信号在使用网页授权获取用户信息,开发者需要先到企业微信号先创建应用,在应用中设置可信域名
3、添加可信任的域名文件
找到【设置可信域名】点击,在弹窗点击【申请校验域名】,并将文件下载下来,上传到项目的根目录,一定要保证通过域名可以直接访问到下载的文件
下载域名验证文件
将文件放入到springboot里的static目录下,如果是用tomcat启动,直接放到root目录下即可
验证域名文件是否成功,直接输入域名+文件名称,查看是否有返回结果
4、配置自定义菜单请求的路径
二、企业微信对接流程和业务代码
2.1、对接流程
1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页 的。用户感知的就是直接进入了回调页(往往是业务页面)
2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权会产生一个授权页面,需要用户手动同意,在用户同意后,就可以通过获取用户基本信息的接口获取该用户的基本信息。 如用户的openid,昵称,性别,头像,所在地等。我们需要获取用户信息,这里选择就以snsapi_userinfo为scope发起的网页授权
具体而言,网页授权流程分为四步:
1、引导用户进入业务页面(方法),在这里调用回调方法,获取code
2、通过code换取网页授权access_token
3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和userid或openid获取用户基本信息(企业微信通讯录有改用户获取的是userid,没有则是openid)
以上4步,请详细阅读:微信网页授权官方文档,这里不再累赘
2.2、对接操作步骤
1.打开企业微信,点击工作台,找到自建的应用
2.点击配置的自定义菜单
3.点击测试的时候,调用后台Java自定义的方法【http://520.free.qydev.com/api/wechat/auth 前面测试菜单配置的连接】
//网页授权方式查看业务方法页面
@GetMapping("/auth")
public String auth() {
log.info("进入到微信页面自定义方法地址...");
//拼接微信网页授权地址
String redirectURL = String.format(WxConstant.WX_CONNECT_OAUTH2_AUTHORIZE_URL, WxConstant.WX_APP_ID, URIUtil.encodeURIComponent(WxConstant.REQUEST_URL),
WxConstant.WX_SNSAPI_BASE, StringUtils.trimToEmpty(WxConstant.WX_STATE));
log.info("【微信网页授权】获取redirectURL,redirectURL={}", redirectURL);
return "redirect:" + redirectURL;
}
4.在访问的方法里,定义了回调函数
5.重定向回调函数,获取code、userid、用户详细信息
//回调地址调用
@RequestMapping("/userinfo")
public String userinfo(HttpServletRequest req){
log.info("进入到回调地址...");
String code=req.getParameter("code");
log.info("【回调地址】获取的code值为{}",code);
try {
if(!"authdeny".equals(code)){
//拼装获取access_token的url请求
String tokenUrl = WxConstant.WX_GET_TOKEN_URL.replace("ID", WxConstant.WX_APP_ID).replace("SECRET", WxConstant.WX_SECRENT);
//获取访问用户身份的access_token
String access_token = AuthUtil.doGetJson(tokenUrl).get("access_token").toString();
log.info("【访问用户身份access_token】,access_token={}",access_token);
//拼装获取访问用户身份的userid的url请求
String useridURL = WxConstant.WX_GET_USERID_URL.replace("ACCESS_TOKEN", access_token).replace("CODE", code);
//获取访问用户身份的基本信息(如userid)
JSONObject obj=AuthUtil.doGetJson(useridURL);
log.info("【访问用户身份基本信息】,obj={}",obj);
//拼装获取访问用户身份详细信息的url请求
String userurl = WxConstant.WX_GET_USERINFO_URL.replace("ACCESS_TOKEN", access_token).replace("USERID", obj.getString("UserId"));
//获取访问用户身份的详细信息
JSONObject userInfo=AuthUtil.doGetJson(userurl);
log.info("【访问用户身份详细信息】,userInfo={}",userInfo);
}
} catch (Exception e) {
e.printStackTrace();
}
return "/index";
}
2.3测试验证
启动springboot项目(8080端口),打开企业微信找到【测试】应用,点击【测试】菜单
你会看到在回调函数里,获取了code、userid、用户详细信息