1.申请账号-微信开放平台
https://open.weixin.qq.com/
-
创建移动应用
image.png -
可得到AppID与AppSecret
image.png -
客户端(IOS Android)集成微信登录
目的是获取临时票据 code,传给服务端
略.
- 服务端
文档: https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Development_Guide.html
5.1 通过客户端传过来的code,以及AppId和AppSecret调用微信服务,获取accessToken以及openId
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + secret + "&code=" + code + "&grant_type=authorization_code";
//获取accessToken
String accessTokenStr = restTemplate.getForObject(url, String.class);
JSONObject accessTokenObj = JSON.parseObject(accessTokenStr);
log.info("wechatLogin accessTokenResult:{}", accessTokenObj);
if (StringUtils.isNotEmpty(accessTokenObj.getString("errcode"))) {
throw Excep.le(UserErrMsgs.Err_000900040013);
}
//用户的openId
String openId = accessTokenObj.getString(WeChatConsts.OPEN_ID);
//用户的accessToken,可用来获取微信用户的基本信息
String accessTokenObjString = accessTokenObj.getString(WeChatConsts.ACCESS_TOKEN);
openId: 每个微信用户对应一个微信应用都有一个唯一的openId,所以可以根据获取到的openId是否绑定了本系统的用户来判断用是否已经进行了微信绑定。
5.2 获取用户的基本信息(解决乱码问题)
- 解决乱码问题:先使用ISO8859-1获取到用户信息的字节数组,再将字节数组使用UFT8编码成字符串。
String result = new RestTemplate().getForObject("https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId, String.class);
JSONObject jsonObject = JSON.parseObject(new String(result.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8));
if (StringUtils.isNotEmpty(jsonObject.getString("errcode"))) {
return null;
}
- 注意: 如果需要存储微信用户的头像,不可直接存储微信返回的头像地址,因为如果微信用户更换了头像,该地址将失效。所以正确的做法是将微信用户的头像转储到自己的OSS上。
网友评论