1. 定义接口常量
// 凭证获取(GET)
public final static String token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
// 用户同意授权,获取code
public final static String WX_OAUTH_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
// 用户同意授权,回调url
public final static String WX_REDIRECT_URL = "http://14wj577900.51mypc.cn/showIndex";
// 拉去用户信息url
public final static String WX_SNSAPI_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
//微信openId
public final static String WX_OPEN_ID = "wxd571b8847be86a0f";
//微信appSecret
public final static String WX_APP_SECRET = "d25f8dfeeac2606a76d649ce8d735518";
2. 获取token,验证是否授权
微信后台请求接口
public String home(HttpServletRequest request) {
// 请求获取用户授权
String requestUrl = Constant.WX_OAUTH_URL
.replace("APPID", Constant.WX_OPEN_ID)
.replace("REDIRECT_URI",
CommonMethod.urlEncodeUTF8(Constant.WX_REDIRECT_URL))
.replace("SCOPE", "snsapi_base").replace("STATE", "123");
request.setAttribute("url", requestUrl);
return "url";
}
//解析编码
public static String urlEncodeUTF8(String source) {
String result = source;
try {
result = java.net.URLEncoder.encode(source, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
// 获取TOKEN
Token accessToken = CommonMethod.getToken(Constant.WX_OPEN_ID,
Constant.WX_APP_SECRET, code);
if (!OAuth(request, accessToken.getAccessToken(),
accessToken.getOpenId())) {
return "error";
}
// 获取接口访问凭证
public static Token getToken(String appid, String appsecret, String code) {
Token token = null;
String requestUrl = Constant.token_url.replace("APPID", appid).replace("SECRET", appsecret).replace("CODE", code);
// 发起GET请求获取凭证
net.sf.json.JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);
if (null != jsonObject) {
try {
token = new Token();
token.setAccessToken(jsonObject.getString("access_token"));
token.setExpiresIn(jsonObject.getInt("expires_in"));
token.setOpenId(jsonObject.getString("openid"));
} catch (JSONException e) {
token = null;
// 获取token失败
System.out.println("获取token失败");
e.printStackTrace();
//log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
}
}
return token;
}
//授权
public boolean OAuth(HttpServletRequest request, String accessToken,
String openId) {
TBaseMember member = null;
// 拼接请求地址
String requestUrl = Constant.WX_SNSAPI_URL.replace("ACCESS_TOKEN",
accessToken).replace("OPENID", openId);
// 获取用户信息
JSONObject jsonObject = CommonMethod.httpsRequest(requestUrl, "GET",
null);
if (null != jsonObject) {
try {
// 根据openid查询判断用户是否存在
TBaseMember tbm = memberService.selectMemberByOpenId(jsonObject
.getString("openid"));
if (null != tbm) {
request.getSession().setAttribute("member", tbm);
} else {
member = new TBaseMember();
member.setmId(AutoGenerationCode.getUUId());
member.setmState("01");
member.setIsValid("01");
member.setCreateDate(new Date());
member.setmOpenid(jsonObject.getString("openid"));
member.setExt2(jsonObject.getString("nickname"));
member.setmSex("0" + jsonObject.getInt("sex"));
member.setExt1(jsonObject.getString("headimgurl"));
memberService.insertSelective(member);
request.getSession().setAttribute("member", member);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return false;
}
3. 用户授权
定义接口凭证
public class Token {
// 接口访问凭证
private String accessToken;
// 凭证有效期,单位:秒
private int expiresIn;
}