前些天做微信授权登录用到了一些关于调用微信接口的东西,写了个工具类分享给大家,如有问题欢迎大家批评指正!!!
package com.iyiqiba.utility;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;
import com.iyiqiba.common.WChartUser;
import com.iyiqiba.common.OAuthAccessToken;
/**
* 微信工具类
* @author ZSQ 2017年6月4日20:49:34
*
*/
public class WChartUtils {
private static Logger log = LoggerFactory.getLogger(WChartUtils.class);
public final static String APPID = "wx6a42b00945e04c";
public final static String APPSECRET = "05e78940a491423c47185e7ccb8ee";
//获取用户详细信息
public final static String SCOPE_INFO = "snsapi_userinfo";
//近获取用户open_id
public final static String SCOPE_BASE = "snsapi_base";
//微信请求接口地址
//获取access_token 接口地址 Get
public final static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
//获取网页授权登录access_token 接口地址Get
public final static String OAUTH_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
//获取授权登录用户信息 接口地址Get
public final static String OAUTH_WCHAT_USER_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
public final static String OAUTH_LOGIN_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
//access_token有效时间 时间有时间是7200 为了防止延时导致获取access_token的间断
public static long expires_in = 7100;
//上次获取access_token时间
private static Long lastGetAccessTokenTime = 0L;
//当前access_token值
private static String access_token = null;
/***
* 获取access_token
* @return access_token
* @throws IOException
*/
public static String getAccessToken() throws IOException{
if (access_token == null) {//当前没有获取access_token
access_token = refreshAccessToken();
}else {//已经获取过access_token
Long curTime = System.currentTimeMillis();
if ((curTime-lastGetAccessTokenTime)/1000 >= expires_in) {
access_token = refreshAccessToken();
}
}
return access_token;
}
/***
* 刷新access_token
* @return access_token
* @throws IOException
*/
public static String refreshAccessToken() throws IOException{
lastGetAccessTokenTime = System.currentTimeMillis();
String url = ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", APPSECRET);
String result = HttpsRequest.sendGet(url);
JSONObject json = JSONObject.parseObject(result);
String token = (String) json.get("access_token");
if (token == null) {
String errorCode = (String) json.get("errcode");
String errorMsg = (String) json.get("errmsg");
log.error("获取access_token失败:错误代码:" + errorCode + "错误信息:" + errorMsg);
}
return token;
}
/**
* 获取授权登录access_token
* @param code
* @return
* @throws IOException
*/
public static OAuthAccessToken getOAuthAccessToken(String code) throws IOException{
String url = OAUTH_ACCESS_TOKEN_URL.replace("APPID", APPID).replace("SECRET", APPSECRET).replace("CODE", code);
String result = HttpsRequest.sendGet(url);
JSONObject json= JSONObject.parseObject(result);
String token = json.getString("access_token");
if(token == null){
String errorCode = json.getString("errcode");
String errorMsg = json.getString("errmsg");
System.out.println(json.toString());
log.error("获取授权登录access_token失败:错误代码:" + errorCode + "错误信息:" + errorMsg);
return null;
}
OAuthAccessToken accessToken = (OAuthAccessToken) JSONObject.parseObject(result, OAuthAccessToken.class);
return accessToken;
}
/**
* 获取用户信息
* @return
* @throws IOException
*/
public static WChartUser getOAuthUserInfo(String code) throws IOException{
OAuthAccessToken accessToken = WChartUtils.getOAuthAccessToken(code);
if (accessToken == null) {
return null;
}
String token = accessToken.getAccess_token();
String openid = accessToken.getOpenid();
String url = OAUTH_WCHAT_USER_URL.replace("ACCESS_TOKEN", token).replace("OPENID", openid);
String result = HttpsRequest.sendGet(url);
JSONObject jsonObject = JSONObject.parseObject(result);
openid = jsonObject.getString("openid");
if(openid == null){
String errorCode = jsonObject.getString("errcode");
String errorMsg = jsonObject.getString("errmsg");
System.out.println(jsonObject.toString());
log.error("获取access_token失败:错误代码:" + errorCode + "错误信息:" + errorMsg);
return null;
}
WChartUser user = JSONObject.parseObject(result, WChartUser.class);
return user;
}
public static String getOAuthLoginUrl(String redirectUrl, String scope){
return OAUTH_LOGIN_URL.replace("APPID", APPID).replace("REDIRECT_URI", redirectUrl)
.replace("SCOPE", scope);
}
public static void main(String []args) throws Exception{
//WChartUtils.getOAuthUserInfo("123");
// String result = "{ \"access_token\":\"ACCESS_TOKEN\", \"expires_in\":7200, \"refresh_token\":\"REFRESH_TOKEN\", \"openid\":\"OPENID\", \"scope\":\"SCOPE\" }";
// System.out.println(result);
// OAuthAccessToken accessToken = JSONObject.parseObject(result, OAuthAccessToken.class);
// System.out.println(accessToken.getOpenid());
// System.out.println(accessToken.getAccess_token());
System.out.println(WChartUtils.getAccessToken());
}
}