微信登录
一、前期准备
1、注册微信公众平台,开通服务号(必须,订阅号没有接口调用权限)
2、注册开放平台,微信认证。认证后还需要做下面两个申请认证
1)管理中心--》创建应用(必须,审核基本一天时间)
2)帐号中心--》开发者资质认证,申请开发资质认证(必须,审核基本一天时间)
二、开发流程
1、获取二维码链接,即开发指南中的“第一步:请求CODE”
代码如下:其中state是自己生成的验证码
@RequestMapping(value = "/getCodeByAppIdAndScope") public void getCodeByAppIdAndScope(HttpServletResponse response) throws IOException { String redirect_uri = URLEncoder.encode(ServiceConfigUtil.getValue("redirect_uri"), "utf-8");//即下面的getAccessTokenByCode方法
String state = System.currentTimeMillis() + ""; String request_url = "https://open.weixin.qq.com/connect/qrconnect" + "?appid=" + appid + "&scope=snsapi_login" + "&redirect_uri=" + redirect_uri + "&response_type=code" + "&state=" + state + "#wechat_redirect";//URl的拼接 response.sendRedirect(request_url);//进行网络的请求 }
通过调用该链接会跳转二维码界面,用户扫描二维码确认后,微信后台会调用我们给定的redirect_uri,并且会有code和state参数,我们后台可以接收到code和state参数,这时可以进行指南中的“第二步:通过code获取access_token”,代码如下
@RequestMapping(value = "/getAccessTokenByCode") public String getAccessTokenByCode(HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes, Model model) { String code = request.getParameter("code"); String accessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" + "?appid=" + appid + "&secret=" + secret + "&code=" + code + "&grant_type=authorization_code";//Url的拼接 ResponseEntity result = RemoteJsonHelper.accessForEntityNoToken(HttpMethod.GET, accessTokenUrl, null);//这个是自己写的远程调用工具接口,没有的网上查查自己写一个即可 JSONObject jb = JSONObject.fromObject(result.getBody());
String accessToken = tokenObj.getString("access_token");//获取access_token
getUserInfoByAccessToken(accessToken);//据accessToken获取用户信息
}
接着就是获取用户信息,代码如下
private String getUserInfoByAccessToken(JSONObject tokenObj) { String accessToken = tokenObj.getString("access_token");//获取access_token String openId =tokenObj.getString("openid");//获取openid String userUrl = "https://api.weixin.qq.com/sns/userinfo" + "?access_token=" + accessToken + "&openid=" + openId; ResponseEntity result = RemoteJsonHelper.accessForEntityNoToken(HttpMethod.GET, userUrl, null); JSONObject jb = JSONObject.fromObject(result.getBody()); String nickname = jb.getString("nickname");//普通用户昵称 String headimgurl = jb.getString("headimgurl");//用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空 String openid = jb.getString("openid");//普通用户的标识,对当前开发者帐号唯一 int sex = jb.getInt("sex");//普通用户性别,1为男性,2为女性 String province = jb.getString("province"); String city = jb.getString("city"); String country = jb.getString("country"); boolean index = 判断该用户是否授权过
if(index) {//授权过直接登录 //登录 } else {
//添加处理并登录
} }
到这里微信登录流程结束。
三、开发中遇到问题
需要微信号开通服务号及开发这资质认证
2、redirect_uri 参数错误
将本地域名设置成与应用授权回调域一样的域名,我发生这个错误是因为本地测试时redirect_uri 链接上有端口导致的,也就是说这个链接的域名后不能有端口
这样回导致回调后报错,这时只要在地址栏中将配置的域名改成测试的域名即可(本地则为localhost:port),这样测试流程就可以走通了