微信网页授权获取用户信息,只需要在微信端配置一下授权域名,之后的操作都是在服务器端实现。
1. 微信后台配置授权域名
2.服务器端实现获取用户信息
写一个测试页面,页面中有一个连接,
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx5dcb95b593046871&redirect_uri=https%3A%2F%2F你在微信端填写的域名%2F目录1%2F目录2&response_type=code&scope=snsapi_base&state=回调传回参数#wechat_redirect
注意几个点:
1.微信端的域名:第一步中填写的域名地址
2.目录1,2地址:可以是一级目录,也可以是多级的,这个没有影响,我这里是2级。【和支付是有区别的,支付的时候,需要配置支付的信任目录,所以固定死了级别。】
3. 回调传回参数:当用户点击这个链接时,会调起微信的授权页面,用户操作之后,微信会回调你填写的redirect_uri地址,并且传回参数state,所以可以让state传递一些特殊的参数。但是长度有限制,需要注意。
后端的代码:
/**
* 获取用户信息
* @param request
* @param model
* @return
*/
@RequestMapping("/getUserInfo")
public String getUserInfo(HttpServletRequest request,Model model){
//微信在回调时,会传回一个code参数,获取这个code,如果没有code,那么说明失败,注意返回错误页面。
String code = request.getParameter("code");
log.info("code:" + code);
if (StringUtils.isBlank(code)) {
return "/pages/notice";
}
// 如果在上方的连接地址中有填写state的值,那么微信会将state原样返回,这里获取一下。
String state = request.getParameter("state");
log.info("state:" + state);
if (StringUtils.isBlank(state)) {
log.info("没有返回state参数");
}
// 获取到了code之后,使用code,作为参数,调用微信的接口,换取access_token。
//oauth2_url=https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
String oauth2_url = WeChatConfig.oauth2_url.replace("APPID", BaseController.appid).replace("SECRET", BaseController.appsecret).replace("CODE", code);
// 自己写一个工具类,调用接口,推荐使用okhttp。
String auth_return = WeixinHttpUtils.post(oauth2_url, null);
log.info("auth_return:" + auth_return);
// 得到返回的json结构。
JSONObject json = JSON.parseObject(auth_return);
/**
* 需要用到的access_token
* {"access_token":"12_0g6UMlYeFtgCLT4TaGW5jS6bAt8MwxAoKYeyUmnHlqXMfICauOHMKs7k6HySOWTOhskV1BpLJ-syx3ZJbs922MWkVpuZqA_VpvL9CW7qLvs",
* 有效时间
* "expires_in":7200,
* "refresh_token":"12_JRqTvJnPVX_7ePOIK15qEJg_1oYvSdi4sqLzWWHyeK77LitTz-6XX1OYQjNH0rO54u-tDA_TKZTUaJKVFNXxsI5MtKE9P7_c2P6DeLF0pPU",
* 当前用户的openid
* "openid":"odXbo1Oub7qVBeptNt_kdtInQfLI",
* "scope":"snsapi_base"
* }
*/
Object errorCode = json.get("errcode");
if (errorCode != null) {
return "400";
} else {
String openId = json.getString("openid");
String access_token = json.getString("access_token");
// 使用access_token去交换用户的详细资料,头像,名称等信息。
//userInfo_url=https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
String userinfo_url = WeChatConfig.userInfo_url.replace("ACCESS_TOKEN", access_token).replace("OPENID", openId);
String userinfoUrlReturn = WeixinHttpUtils.post(userinfo_url, null);
/**
* 最后返回的详细信息
* 其中如果此公众号有绑定开放平台,就会返回unionid,如果没有绑定,此参数是么有的。
* {
* "sex":1,"nickname":"小饼干",
* "unionid":"oTn_Ewte8QsnEIg9yWBSBzfCbBFE",
* "privilege":[],"province":"广东",
* "openid":"odXbo1Oub7qVBeptNt_kdtInQfLI",
* "language":"zh_CN",
* "headimgurl":"http://thirdwx.qlogo.cn/mmopen/vi_32/WtxCbgVS8HKibRlpByx3FKdB9aibIyiboric9icqzOzH3aW5Ys7kJcDiaKkVllYybM5kiaIskC8GqEL3dib4VRsL3mn5RQ/132",
* "country":"中国","city":"广州"
* }
*/
JSONObject userObj = JSON.parseObject(userinfoUrlReturn);
log.info(userObj.toJSONString());
request.getSession().setAttribute("checkTicketMyselfUser", userObj);
request.getSession().setMaxInactiveInterval(0);
}
return "userinfo";
}
以上。