申请测试号
/**
* 用户同意授权,获取code
* @param request
* @param response
* @throws IOException
*/
@ResponseBody
@GetMapping("/getOauthAccessToken")
public void getOauthAccessToken(HttpServletRequest request, HttpServletResponse response) throws IOException {
//获取 appid,appScret,appScret
//
WechatPublic wechatPublic = wechatPublicService.selectWechatPublicById(100);
if (wechatPublic == null){
logger.error("AppID或者ARedirectUri不存在");
}
String appid = wechatPublic.getAppId();
String redirectUri = wechatPublic.getRedirectUri();
String url = WechatConstants.API_OAUTH_CODE;
url = url.replace("APPID", appid);
url = url.replace("REDIRECT_URI", URLEncoder.encode(redirectUri,"UTF-8"));
url = url.replace("SCOPE", "snsapi_userinfo");
//重定向到重定向地址
response.sendRedirect(url);
}
/**
* 获取用户信息
* @param request
* @param response
* @return
* @throws IOException
*/
@ResponseBody
@RequestMapping("/wxLogin")
public WechatUserInfoVo wxLogin(HttpServletRequest request, HttpServletResponse response) throws IOException {
//获取 appid,appSecret
WechatPublic wechatPublic = wechatPublicService.selectWechatPublicById(100);
if (wechatPublic == null){
logger.error("未获取到公众号参数");
}
String appid = wechatPublic.getAppId();
String appSecret = wechatPublic.getAppScret();
//获取code
String code=request.getParameter("code");
if (StringUtils.isEmpty(code)){
logger.error("参数code为空");
}
WechatAccessTokenVo accessTokenVo = wechatPublicService.getAccessToken(appid, appSecret, code);
//获取AccessToken
String accessToken = accessTokenVo.getAccessToken();
WechatUserInfoVo userInfo = null;
try{
//刷新access_token
String refreshToken = accessTokenVo.getRefreshToken();
wechatPublicService.refreshToken(appid,refreshToken);
//获取用户信息
String openId = accessTokenVo.getOpenId();
userInfo = wechatPublicService.getUserInfo(accessToken, openId);
//检验授权凭证
wechatPublicService.verifyAccessToken(accessToken, openId);
}catch (Exception e){
e.printStackTrace();
}
return userInfo;
}
/**
* 1.通过code换取网页授权access_token
* @param appid
* @param appSecret
* @param code
* @return
*/
@Override
public WechatAccessTokenVo getAccessToken(String appid, String appSecret , String code) {
WechatAccessTokenVo accessTokenVo = null;
// 获取网页授权access_token
String reqUrl = WechatConstants.API_OAUTH_TOKEN;
reqUrl = reqUrl.replace("APPID", appid);
reqUrl = reqUrl.replace("SECRET", appSecret);
reqUrl = reqUrl.replace("CODE", code);
JSONObject jsonObject = JSONObject.parseObject(restTemplate.getForEntity(reqUrl, String.class).getBody());
if (null != jsonObject) {
try {
accessTokenVo = new WechatAccessTokenVo();
accessTokenVo.setAccessToken(jsonObject.getString("access_token"));
accessTokenVo.setExpiresIn(jsonObject.getInteger("expires_in"));
accessTokenVo.setRefreshToken(jsonObject.getString("refresh_token"));
accessTokenVo.setOpenId(jsonObject.getString("openid"));
accessTokenVo.setScope(jsonObject.getString("scope"));
} catch (Exception e) {
accessTokenVo = new WechatAccessTokenVo();
accessTokenVo.setErrCode(jsonObject.getString("errcode"));
accessTokenVo.setErrMsg(jsonObject.getString("errmsg"));
}
}
return accessTokenVo;
}
/**
* 刷新access_token
* @param appid
* @param refreshToken
* @return
*/
@Override
public WechatAccessTokenVo refreshToken(String appid,String refreshToken) {
WechatAccessTokenVo accessTokenVo = null;
//获取第二步的refresh_token后,请求以下链接获取access_token
String reqUrl = WechatConstants.API_REFRESH_TOKEN;
reqUrl = reqUrl.replace("APPID", appid);
reqUrl = reqUrl.replace("REFRESH_TOKEN",refreshToken);
JSONObject jsonObject = JSONObject.parseObject(restTemplate.getForEntity(reqUrl, String.class).getBody());
if (null != jsonObject) {
try {
accessTokenVo = new WechatAccessTokenVo();
accessTokenVo.setAccessToken(jsonObject.getString("access_token"));
accessTokenVo.setExpiresIn(jsonObject.getInteger("expires_in"));
accessTokenVo.setRefreshToken(jsonObject.getString("refresh_token"));
accessTokenVo.setOpenId(jsonObject.getString("openid"));
accessTokenVo.setScope(jsonObject.getString("scope"));
} catch (Exception e) {
//accessTokenVo = null;
accessTokenVo = new WechatAccessTokenVo();
accessTokenVo.setErrCode(jsonObject.getString("errcode"));
accessTokenVo.setErrMsg(jsonObject.getString("errmsg"));
}
}
return accessTokenVo;
}
/**
* 拉取用户信息
* @param accessToken
* @param openId
* @return
*/
@Override
public WechatUserInfoVo getUserInfo(String accessToken, String openId) {
WechatUserInfoVo userInfo = null;
String getUserInfo = WechatConstants.API_SNS_UNIONID;
getUserInfo = getUserInfo.replace("ACCESS_TOKEN", accessToken);
getUserInfo = getUserInfo.replace("OPENID",openId);
JSONObject jsonObject = JSONObject.parseObject(restTemplate.getForEntity(getUserInfo, String.class).getBody());
if (null != jsonObject) {
try {
userInfo = new WechatUserInfoVo();
userInfo.setOpenid(jsonObject.getString("openid"));
userInfo.setNickname(new String(jsonObject.getString("nickname").getBytes("ISO-8859-1"), "UTF-8"));
userInfo.setSex(Integer.parseInt(jsonObject.getString("sex")));
userInfo.setProvince(new String(jsonObject.getString("province").getBytes("ISO-8859-1"), "UTF-8"));
userInfo.setCity(new String(jsonObject.getString("city").getBytes("ISO-8859-1"), "UTF-8"));
userInfo.setCountry(new String(jsonObject.getString("country").getBytes("ISO-8859-1"), "UTF-8"));
userInfo.setHeadimgurl(jsonObject.getString("headimgurl"));
userInfo.setPrivilegeList(JSONArray.toJavaObject(jsonObject.getJSONArray("privilege"), List.class));
userInfo.setUnionid(jsonObject.getString("unionid"));
} catch (Exception e) {
userInfo = new WechatUserInfoVo();
userInfo.setErrCode(jsonObject.getString("errcode"));
userInfo.setErrMsg(jsonObject.getString("errmsg"));
}
}
return userInfo;
}
/**
* 检验授权凭证(access_token)是否有效
* @param accessToken
* @param openId
*/
@Override
public void verifyAccessToken(String accessToken,String openId) {
String verifyAT = WechatConstants.API_VERIFY_TOKEN;
verifyAT = verifyAT.replace("ACCESS_TOKEN", accessToken);
verifyAT = verifyAT.replace("OPENID",openId);
JSONObject jsonObject = JSONObject.parseObject(restTemplate.getForEntity(verifyAT, String.class).getBody());
if (null != jsonObject) {
try {
int errorCode = jsonObject.getInteger("errcode");
String errorMsg = jsonObject.getString("errmsg");
log.info("授权凭证access_token有效 errcode:{} errmsg:{}", errorCode, errorMsg);
} catch (Exception e) {
int errorCode = jsonObject.getInteger("errcode");
String errorMsg = jsonObject.getString("errmsg");
log.error("授权凭证access_token无效 errcode:{} errmsg:{}", errorCode, errorMsg);
}
}
}