1、通过微信接口获取code
微信获取code接口:
https://open.weixin.qq.com/connect/oauth2/authorize?
参数 | 是否必须 | 说明 |
appid | 是 | 公众号的唯一标识 |
redirect_uri | 是 | 授权后重定向的回调链接地址,请使用urlencode对链接进行处理 |
response_type | 是 | 返回类型,请填写code |
scope | 是 | 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息) |
state | 否 | 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节 |
#wechat_redirect | 是 | 无论直接打开还是做页面302重定向时候,必须带此参数 |
* code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期
2、Controller控制器:
/**
* 第三方登录接口
*/
@RequestMapping("/login")
public void getCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
//拼接url
StringBuilder url = new StringBuilder(); url.append("https://open.weixin.qq.com/connect/oauth2/authorize?"); //微信开放平台的appid
url.append("appid=" + ConfigConstans.wechatAppid); // 项目中的公众号的appid
//转码
try {
//回调地址 ,回调地址要进行Encode转码
String redirect_uri = URLEncoder.encode(ConfigConstans.contextPath + "/callback", "utf-8");
System.out.println("redirect_uri==" + redirect_uri); url.append("&redirect_uri=" + redirect_uri); //微信授权后回调的地址链接,代码如下
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
url.append("&response_type=code"); url.append("&scope=snsapi_userinfo"); // 当前使用的是授权登录,(snsapi_base) 不弹出授权页面,根据需求使用
url.append("&state=" + request.getSession().getId()); // 微信中的回调参数
url.append("#wechat_redirect");
System.out.println("url===" + url.toString());
String s = url.toString(); response.sendRedirect(s);
}
3、微信用户授权确认登陆
第一步登录链接拼好后,在手机微信中打开,微信便会跳转到确认授权页面,点击确认授权即可。(这一步,不用开发者做处理!)
用户同意授权,页面将跳转至
redirect_uri/?code=CODE&state=STATE。
4、微信回调code值请参考微信开放文档
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
5、微信回调方法
/**
* 微信 授权登录回调
**/
@RequestMapping("/callback")
public String callback(String code, String state, HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("====" + code + "===" + state + "===="); log.info("code===" + code);
log.info("state===" + state);
HttpSession session = request.getSession(); //拼写微信获取access_token访问地址
String url = "https://api.weixin.qq.com/sns/oauth2/access_token"; url += "?appid=" + ConfigConstans.wechatAppid; // 使用项目中的公众号的appid
url += "&secret=" + ConfigConstans.wechatAppsecret; // 使用项目中的公众号的appsecret
url += "&code=" + code; // code==200时,请求正确,信息返回正确 url += "&grant_type=authorization_code";
log.info("url=="+url); //获取返回数据
JSONObject userMap = urlHalder(url); // 接收回调信息
//获取openid
Object openId = userMap.get("openid"); //用户唯一标识,若程序有PC端和AP端,建议是有回调信息中的uuid
Object accessToken = userMap.get("access_token");
String loginurl = "";
if (ObjectUtils.isNotNull(openId) && ObjectUtils.isNotNull(accessToken)) {
String infourl = "https://api.weixin.qq.com/sns/userinfo"; infourl += "?access_token=" + accessToken;
infourl += "&openid=" + openId; //获取返回数据
JSONObject userInfoMap = urlHalder(infourl); //根据openId 获取用户信息
BasUser basUser = basUserService.getUserByopenId(userInfoMap.get("openid"));
if (ObjectUtils.isNull(basUser)){ //没有当前数据时,进入程序中的绑定页面
loginurl = ConfigConstans.contextPath+"/user/login?openId="+userInfoMap.get("openid");
}else { //有当前数据时,进入程序中的首页 loginurl = ConfigConstans.contextPath+"/index";
} session.setAttribute(UserCacheConstans.USER_OPENID,String.valueOf(userInfoMap.get("openid")));
}
return "redirect:" + loginurl;
}
* 正确时返回的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"
}
参数 | 描述 |
openid | 用户的唯一标识 |
nickname | 用户昵称 |
sex | 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 |
province | 用户个人资料填写的省份 |
city | 普通用户个人资料填写的城市 |
country | 国家,如中国为CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。 |
privilege | 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom) |
unionid | 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。 |