| 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.core.tools.PropertiesUtil; | 
| 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.stereotype.Service; | 
|   | 
| import java.io.IOException; | 
|   | 
| @Service | 
| public class WeChatApiTools { | 
|   | 
|   | 
|     @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 = PropertiesUtil.getString(WECHAT_LOGIN_URL); | 
|         return String.format(wechatLoginUrl, getAppid(companyId), getSecret(companyId), 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; | 
|     } | 
|   | 
|   | 
| } |