这两天了解了下使用微信第三方登录相关问题,这样方便用户登录,不用担心密码遗忘的问题,所以记录下微信登录的简单流程
首先在在微信开放平台注册,记住要选择开发者,每个微信都可以成为开发者,点击打开微信开放平台链接
或者在微信公众平台申请一个服务的公众号
两者的区别可以自行百度
第三方微信接口登录流程图:
用户首先请求登录第三方应用(app.web等),一般现在用户登录会有很多登录方式,邮箱/手机号/用户名密码/第三方等,这里可以判断用户的登录方式,如果是微信登录就是接下来的流程:
1.请求第三方应用登录
2.第三方应用请求微信授权登录,是遵循OAuth2.0的协议授权码模式
3.微信开放平台会请求用户是否授权登录
4.用户确认授权登录(是或者否)
5.微信会返回给第三方应用一个code(授权临时票据,需要使用code去微信申请token令牌)
6.根据返回的code+appId+appsecret去获取access_token,其中 appId是服务器在微信平台认证后会自动生成,代表这这个第三方应用的唯一标识, appsecret是密匙,加密解密使用,也是在服务器在微信平台认证后生成的 access_token 就是令牌,可以去获取用户微信的基本信息(头像,昵称,性别,地址)有效期是2个小时
好了 流程嘚吧完了,接下来上代码
1.用户扫描二维码
https://open.weixin.qq.com/connect/qrconnect?appid=xxxxxxxxf&redirect_uri=xxxxxxxxxxxx&response_type=code&scope=snsapi_login&state=#wechat_redirect
2.redirect_uri是扫描成功后需要跳转的页面(跳转会带有参数code和state/如果用户没有授权则不会返回code,但是会返回state)
/**
* 微信引导页进入的方法
* @return
*/
@RequestMapping("/loginByWeiXin")
public String loginByWeiXin(HttpServletRequest request, Map<String, Object> map) {
// 获取code和state 2 个参数
String code = request.getParameter("code");
String state = request.getParameter("state");
System.out.println("code -------" + code + ", state ------- " + state);
if(code != null && !"".equals(code)) {
// 授权成功, 获取用户token和openID
OAuthInfo authInfo = WeiXinUtil.getAccess_token(code);
String openid = authInfo.getOpenid();
String access_token = authInfo.getAccess_token();
if(access_token == null) {
// Code 使用过 异常
System.out.println("Code 使用过 异常.....");
return "redirect:" + 跳转的路径;
}
// 查询微信号是否绑定第三方平台
SysUser sysUser = weiXinService.getUserByWeiXinID(openid);
if(sysUser == null) {
//获取随机字符串长度是57的
String randomStr = StringUtil.getRandomString(57);
request.getSession().setAttribute(openid, randomStr);
// 尚未绑定账号
System.out.println("尚未绑定账号.....");
return "redirect:/index.jsp?openid=" + openid + "&state=" + randomStr;
}
userController.doSomeLoginWorkToHomePage(sysUser.getMcid(), map);
// 登录成功
return "homePage";
}
// 未授权
return "redirect:" + 路径;
}
3.根据code获取token(实体类OAuthInfo封装微信返回来的用户信息)
public static OAuthInfo getAccess_token(String code){
String authUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code ";
authUrl= authUrl.replace("APPID", Param.APPID);
authUrl = authUrl.replace("SECRET", Param.SECRET);
authUrl = authUrl.replace("CODE", code);
String jsonString = HTTPRequestUtil.sendPost(authUrl,"");
System.out.println("jsonString: " + jsonString);
OAuthInfo auth = null;
try {
auth = (OAuthInfo) JacksonUtil.parseJSONToObject(OAuthInfo.class, jsonString);
} catch (Exception e) {
e.printStackTrace();
}
return auth;
}
返回的用户信息格式:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" //客户授权后才会有这个字段
}