package com.matrix.system.shopXcx.api; import com.matrix.core.tools.LogUtil; import com.matrix.core.tools.PropertiesUtil; import com.matrix.core.tools.StringUtils; import com.matrix.component.tools.HttpRequest; import com.matrix.component.tools.HttpResponse; import net.sf.json.JSONObject; import java.io.IOException; public class WeChatApiTools { /** * 小程序秘钥 */ private static final String XCX_SECRET = "xcx_secret"; /** * 小程序appid */ private static final String XCX_APPID = "xcx_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 = ""; /** * 获取小程序登录地址 * * @author JIANGYOUYAO * @email 935090232@qq.com * @date 2018年5月23日 * @param code * @return */ public static String getXcxLoginUrl(String code) { String wechatLoginUrl = PropertiesUtil.getString(WECHAT_LOGIN_URL); return String.format(wechatLoginUrl, getAppid(), getSecret(), code); } /** * 获取小程序APPId * @return */ public static String getAppid(){ if(StringUtils.isBlank(appid)){ appid = PropertiesUtil.getString(XCX_APPID); } return appid; } /** * 获取小程序秘钥 * @return */ public static String getSecret(){ if(StringUtils.isBlank(secret)){ secret = PropertiesUtil.getString(XCX_SECRET); } return secret; } /** * 清空token */ public static void cleanAccessToken() { preTime = null; accessToken = ""; } public static String getAccessToken() throws IOException { if (isTokenInvalid()) { synchronized (accessToken) { if (isTokenInvalid()) { LogUtil.info("刷新微信accessToken"); HttpRequest reqObj = new HttpRequest(); HttpResponse result = null; result = reqObj .sendHttpGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + getAppid() + "&secret=" + getSecret(), null); JSONObject json = JSONObject.fromObject(result.getDataString()); 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; } }