package com.matrix.system.shopXcx.api; import com.matrix.component.tools.HttpRequest; import com.matrix.component.tools.HttpResponse; import com.matrix.core.exception.GlobleException; import com.matrix.core.tools.LogUtil; import com.matrix.core.tools.StringUtils; import net.sf.json.JSONObject; import java.io.IOException; /*** * 公众号api工具 */ public class WeChatGzhApiTools { /** * 公众号秘钥 */ private static final String GZH_SECRET = "gzh_secret"; /** * 公众号appid */ private static final String GZH_APPID = "gzh_appid"; /** * 微信登录url */ private static final String WECHAT_LOGIN_URL = "wechar_login_url"; /** * 上一次获取时间 */ private static Long preTime; /** * 当前有效的微信token */ private static String accessToken = ""; private static String appid = ""; private static String secret = ""; /** * 清空token */ public static void cleanAccessToken() { preTime = null; accessToken = ""; } public static String getAccessToken(String gzhAppId, String gzhSecret) { if (isTokenInvalid()) { synchronized (accessToken) { if (isTokenInvalid()) { LogUtil.info("刷新微信accessToken"); HttpRequest reqObj = new HttpRequest(); HttpResponse result = null; try { result = reqObj .sendHttpGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + gzhAppId+ "&secret=" + gzhSecret, null); } catch (IOException e) { LogUtil.error("获取公众号accessToken失败"+e.getMessage(),e); throw new GlobleException(e.getMessage()); } JSONObject json = JSONObject.fromObject(result.getDataString()); if(json.has("errmsg")){ throw new GlobleException("获取返回刷新的accessToken失败"+json.toString()); }else{ String access_token = json.getString("access_token"); accessToken = access_token; preTime = System.currentTimeMillis(); LogUtil.info("返回刷新的accessToken={}", accessToken); return access_token; } } else { return accessToken; } } } else { LogUtil.info("返回现有accessToken={}", accessToken); return accessToken; } } /** * token是否无效 * TODO 由于现在有多个环境,为了防止冲突每次都获取新的token * @return */ private static boolean isTokenInvalid() { /** if (StringUtils.isNotBlank(accessToken) && preTime != null) { Long now = System.currentTimeMillis() / 1000; Long pre = preTime / 1000; boolean invalid = (now - pre) > 6200; return invalid; } else { return true; }*/ return true; } }