package com.matrix.system.shopXcx.api; import com.matrix.component.tools.HttpRequest; import com.matrix.component.tools.HttpResponse; import com.matrix.core.tools.LogUtil; import com.matrix.system.common.bean.BusParameterSettings; import com.matrix.system.common.constance.AppConstance; import com.matrix.system.common.dao.BusParameterSettingsDao; import net.sf.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.IOException; @Service public class WeChatApiTools { @Value("${wechar_login_url}") private String wecharLoginUrl; @Value("${xcx_manager_appid}") private String xcxManagerAppid; @Value("${xcx_manager_secret}") private String xcxManagerSecret; @Autowired private BusParameterSettingsDao busParameterSettingsDao; /** * 微信登录url */ private static final String WECHAT_LOGIN_URL = "wechar_login_url"; /** * 上一次获取时间 */ private static Long preTime; /** * 当前有效的微信token */ private static String accessToken = ""; /** * 获取小程序登录地址 * * @author JIANGYOUYAO * @email 935090232@qq.com * @date 2018年5月23日 * @param code * @return */ public String getXcxLoginUrl(String code,Long companyId) { String wechatLoginUrl =wecharLoginUrl; return String.format(wechatLoginUrl, getAppid(companyId), getSecret(companyId), code); } /** * 获取管理端小程序登录地址 * * @param code * @return */ public String getManagerXcxLoginUrl(String code) { String wechatLoginUrl = wecharLoginUrl; String appId =xcxManagerAppid; String secret = xcxManagerSecret; return String.format(wechatLoginUrl, appId, secret, code); } /** * 获取小程序APPId * @return */ public String getAppid(Long companyId){ BusParameterSettings appId = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_APPID, companyId); return appId.getParamValue(); } /** * 获取小程序秘钥 * @return */ public String getSecret(Long companyId){ BusParameterSettings secret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_SECRET, companyId); return secret.getParamValue(); } /** * 清空token */ public static void cleanAccessToken() { preTime = null; accessToken = ""; } public String getAccessToken(Long companyId) 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(companyId) + "&secret=" + getSecret(companyId), 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; } }