代码基于jeecgboot 的uniapp项目修改
业务类相关代码
//region 授权登录
/**
* 获取code的地址
* @return
*/
@Override
public String getCodeUrl(String url) throws UnsupportedEncodingException {
//scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
url = URLEncoder.encode(url, "UTF-8");
String path = String.format("https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=STATE#wechat_redirect",
appId,url,"snsapi_userinfo");
return path;
}
/**
* 获取用户的access_token
* @param code
* @return
*/
@Override
public WxUserInfoVo getUserAccessToken(String code) throws Exception {
String path = "/sns/oauth2/access_token";
Map<String, String> param = new HashMap<>();
param.put("grant_type", "authorization_code");
param.put("appid", appId);
param.put("secret", appsecret);
param.put("code",code);
try {
HttpResponse httpResponse = HttpUtils.doGet(host, path, null, param);
String s = EntityUtils.toString(httpResponse.getEntity());
JSONObject jsonObject = JSONObject.parseObject(s);
if (jsonObject.containsKey("access_token")) {
WxUserInfoVo vo = new WxUserInfoVo();
vo.setAccessToken(jsonObject.getString("access_token"));
vo.setExpiresIn(jsonObject.getInteger("expires_in"));
vo.setOpenId(jsonObject.getString("openid"));
vo.setRefreshToken(jsonObject.getString("refresh_token"));
vo.setScope(jsonObject.getString("scope"));
return vo;
} else {
String errMsg = String.format("获取微信用户access_token失败: errcode = %s, errmsg =%s", jsonObject.getString("errcode"), jsonObject.getString("errmsg"));
// log.error(errMsg);
throw new Exception(errMsg);
}
} catch (Exception e) {
// log.error(e.getMessage());
throw e;
}
}
/**
* 获取微信用户信息
* @param vo
* @return
* @throws Exception
*/
@Override
@Cacheable(value = IWxService.CACHE_WX_USER,key = "#vo.openId")
public WxUserInfoVo getWxUserInfo(WxUserInfoVo vo) throws Exception {
String path = "/sns/userinfo";
Map<String, String> param = new HashMap<>();
param.put("access_token", vo.getAccessToken());
param.put("openid", vo.getOpenId());
param.put("lang", "zh_CN");
try {
HttpResponse httpResponse = HttpUtils.doGet(host, path, null, param);
String s = EntityUtils.toString(httpResponse.getEntity());
JSONObject jsonObject = JSONObject.parseObject(s);
log.info("微信用户:{}",s);
if (jsonObject.containsKey("openid")) {
vo.setOpenId(jsonObject.getString("openid"));
vo.setNickname(jsonObject.getString("nickname"));
vo.setSex(jsonObject.getInteger("sex"));
vo.setProvince(jsonObject.getString("province"));
vo.setCity(jsonObject.getString("city"));
vo.setCountry(jsonObject.getString("country"));
vo.setHeadimgurl(jsonObject.getString("headimgurl"));
vo.setPrivilege(jsonObject.getString("privilege"));
vo.setUnionid(jsonObject.getString("unionid"));
return vo;
} else {
String errMsg = String.format("获取微信用户信息失败: errcode = %s, errmsg =%s", jsonObject.getString("errcode"), jsonObject.getString("errmsg"));
// log.error(errMsg);
throw new Exception(errMsg);
}
} catch (Exception e) {
// log.error(e.getMessage());
throw e;
}
}
//endregion
控制器相关代码:
@ApiOperation(value=