/**
* 根据code获取userId后跳转到需要带用户信息的最终页面
* @param request
* @param code 获取微信重定向到自己设置的URL中code参数
* @return
*/
@ResponseBody
@RequestMapping(value = { "/oauth2url" })
@CrossOrigin
public R Oauth2MeUrl(HttpServletRequest request, @RequestParam String code) {
R r = new R();
UserMDLVo userMDLVo = new UserMDLVo();
UserDO userDO = new UserDO();
String openId=oAuth2Service.Oauth2MeUrl(request, code);
if(null==openId||"".equals(openId)){
userMDLVo.setOpenId("");
r.put("Msg", "openId为空!");
r.put("code", 0);//code无效查不出openID
}else{
userDO = userService.findUserListByOpenId(openId);
if(null==userDO || "".equals(userDO) ){
r.put("code", 2);//openID存在,用户不存在,进行验证码登录
r.put("openId", openId);
r.put("msg", "用户不存在");
}else{
r.put("openId", openId);
r.put("code", 1);
r.put("userId", userDO.getUserId());
r.put("msg", "用户存在");//openID存在,用户存在,进入系统
}
}
return r;
}
/**
*
* @Title: Oauth2MeUrl
* @Description: 根据code获取openId
* @param code
* @param request
* @param
* @return String
* @throws
* @author
* @date 2018年7月22日 下午2:30:13
*/
@Override
public String Oauth2MeUrl(HttpServletRequest request, String code) {
String openId="";
//获取企业号AccessToken
AccessToken accessToken = QiYeUtil.getAccessToken(Constants.CORPID, Constants.Secret);
//获取request对象关联的session对象,如果没有session,则返回一个新的session
HttpSession session = request.getSession();
if (accessToken != null && accessToken.getToken() != null) {
//将AccessToken存储到session中
session.setAttribute("accessToken", accessToken);
//调用接口获取openId openId为空
openId = QiYeUtil.getMemberGuidByCode(accessToken.getToken(), code, Constants.AGENTID);
if (openId != null && openId.length()!=0) {
// 将openId存储到session中
session.setAttribute("openId", openId);
//根据openId查找用户id
return openId;
}
}
return openId;
}
/**
* 微信企业号调用类 {"errcode":0,"errmsg":"ok"} 此结果表示调用方法成功返回
*
* @author xumy
*
*/
public class QiYeUtil {
/**
* 获取企业号AccessToken
*
* @param CorpID
* @param CorpSecret
* @return
*/
public static AccessToken getAccessToken(String CorpID, String CorpSecret) {
AccessToken accessToken = WechatAccessToken.getAccessToken(CorpID,CorpSecret, 1);
System.out.println("accessToken=" + accessToken);
return accessToken;
}
/**
* OAuth2验证接口根据code获取成员信息
* @param token
* @param code
* @param AgentID
* @return
*/
public static Result oAuth2GetUserByCode(String token, String code,
int AgentID) {
Result result = new Result();
//根据code获取成员信息
JSONObject jo = WechatOAuth2.getUserByCode(token, code, AgentID);
if (jo != null && jo.size()!=0) {
try {
//getString中的参数为空,会抛出异常
String userId = jo.getString("UserId");
if (userId != null && userId.length() > 0) {
result.setErrmsg("");
result.setErrcode("0");
result.setObj(userId);
} else {
result.setErrmsg(jo.getString("errmsg"));
result.setErrcode(jo.getString("errcode"));
}
} catch (Exception e) {
result.setErrmsg("accessToken 超时......");
result.setErrcode("42001");
}
}
return result;
}
/**
* 构造带员工身份信息的URL
*
* @param corpid
* 企业id
* @param redirect_uri
* 授权后重定向的回调链接地址,请使用urlencode对链接进行处理
* @param state
* 重定向后会带上state参数,企业可以填写a-zA-Z0-9的参数值
* @return
*/
public static String oAuth2Url(String corpid, String redirect_uri) {
try {
//解决接口GET请求中文参数的问题
redirect_uri = java.net.URLEncoder.encode(redirect_uri, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//state参数
String oauth2Url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + corpid + "&redirect_uri=" + redirect_uri
+ "&response_type=code&scope=snsapi_base&state=xumy#wechat_redirect";
return oauth2Url;
}
/**
* 调用接口获取用户信息
*
* @param token
* @param code
* @param agentId
* @return
* @throws SQLException
* @throws RemoteException
*/
public static String getMemberGuidByCode(String token, String code, int agentId) {
//根据code获取成员信息,result.getObj()返回用户id
Result result = QiYeUtil.oAuth2GetUserByCode(token, code, agentId);
if (result.getErrcode() == "0") {
if (result.getObj() != null) {
// 此处可以通过微信授权用code的Userid查询自己本地服务器中的数据
return result.getObj();
}
}
return "";
}
}
package com.bootdo.common.domain;
public class AccessToken {
// 获取到的凭证
private String token;
// 凭证有效时间,单位:秒
private int expiresIn;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
}
public class WechatOAuth2 {
private static final String get_oauth2_url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE&agentid=AGENTID";
/**
* 根据code获取成员信息
*
* @param token
* @param code
* @param AgentID
* @return
*/
public static JSONObject getUserByCode(String token, String code, int AgentID) {
//String menuUrl ="https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token="+token+"&agentid="+AgentID+"&code="+code;
String menuUrl = get_oauth2_url.replace("ACCESS_TOKEN", token).replace("CODE", code).replace("AGENTID", AgentID + "");
//发起https请求并获取结果
JSONObject jo = HttpRequestUtil.httpRequest(menuUrl, EnumMethod.GET.name(), null);
System.out.println("jo=" + jo);
return jo;
}
}
public class Constants {
/**
* 常量说明:
* 此处定义的常量需要持久化,可以保存在数据库中,在需要的地方读取。
* 在多企业号中,最好以每个应用来定义。
*/
public static final int AGENTID = 888888888888;
public static final String TOKEN = "***********";
public static final String CORPID = "8888888888888";
public static final String Secret = "yuuigjhk7698kh9gkjl";
public static final String encodingAESKey = "7elblhwDERg1IC9bcHdRCL16TjOfP1C3h8yyowpUtck";
}