Browse Source

Merge branch 'master' of wangchaoqun/wxbase into master

王超群 1 year ago
parent
commit
cd93aa650a

+ 22 - 1
src/main/java/com/ematou/wxbase/controller/TokenRecordController.java

@@ -4,6 +4,8 @@ import com.ematou.wxbase.common.web.R;
 import com.ematou.wxbase.service.TokenRecordService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 /**
@@ -20,7 +22,16 @@ public class TokenRecordController {
     @GetMapping("/wxbase/token")
     public R<?> get() {
         try {
-            return new R<>().success(tokenRecordService.getLatestToken());
+            return new R<>().success(tokenRecordService.getLatestToken(null));
+        } catch (Exception e) {
+            return new R<>().error("获取AccessToken失败!errorMessage: " + e.getMessage());
+        }
+    }
+
+    @GetMapping("/wxbase/token/{system}")
+    public R<?> get(@PathVariable String system) {
+        try {
+            return new R<>().success(tokenRecordService.getLatestToken(system));
         } catch (Exception e) {
             return new R<>().error("获取AccessToken失败!errorMessage: " + e.getMessage());
         }
@@ -36,5 +47,15 @@ public class TokenRecordController {
         }
 
     }
+    @GetMapping("/wxbase/generate/token/{system}")
+    public R<?> generateToken(@PathVariable String system){
+
+        try {
+            return new R<>().success(tokenRecordService.generateToken(system));
+        } catch (Exception e) {
+            return new R<>().error("生成AccessToken失败!errorMessage:" + e.getMessage());
+        }
+
+    }
 
 }

+ 10 - 0
src/main/java/com/ematou/wxbase/entity/TokenRecord.java

@@ -31,8 +31,18 @@ public class TokenRecord {
 
     private String modTime;
 
+    private String appId;
+
     private Timestamp tstm;
 
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
     public Integer getId() {
         return id;
     }

+ 1 - 1
src/main/java/com/ematou/wxbase/mapper/TokenRecordMapper.java

@@ -19,7 +19,7 @@ public interface TokenRecordMapper {
 
     public int insertRecord(@Param("record") TokenRecord record);
 
-    public TokenRecord queryLatestAndValidRecord();
+    public TokenRecord queryLatestAndValidRecord(String appId);
 
     public int queryLatestAndValidRecordCount();
 

+ 2 - 1
src/main/java/com/ematou/wxbase/scheduler/RefreshAccessTokenScheduler.java

@@ -37,7 +37,8 @@ public class RefreshAccessTokenScheduler {
     public void refreshAccessToken() {
         try {
             logger.info("定时器开始刷新Token...");
-            tokenRecordService.generateToken();
+            tokenRecordService.generateToken("emato");
+            tokenRecordService.generateToken("qhemato");
         } catch (Exception e) {
             logger.error("定时刷新Token失败!errorMessage: " + e.getMessage());
         }

+ 97 - 7
src/main/java/com/ematou/wxbase/service/TokenRecordService.java

@@ -5,6 +5,7 @@ import com.ematou.wxbase.config.WxGeneralConfig;
 import com.ematou.wxbase.entity.OperationRecord;
 import com.ematou.wxbase.entity.TokenRecord;
 import com.ematou.wxbase.mapper.TokenRecordMapper;
+import io.netty.util.internal.StringUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -13,10 +14,13 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 import org.springframework.web.client.RestTemplate;
 
+import javax.annotation.PostConstruct;
 import java.text.ParseException;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * @author lhm
@@ -40,6 +44,31 @@ public class TokenRecordService {
     @Autowired
     WxGeneralConfig wxGeneralConfig;
 
+    private static Map<String,WxGeneralConfig> configMap = new ConcurrentHashMap<>();
+    @PostConstruct
+    private static void init (){
+        WxGeneralConfig eztConfig = new WxGeneralConfig();
+        eztConfig.setAppId("wxf9360d70bc1406ee");
+        eztConfig.setAppSecret("78413a82d0332ecbf7fdf475d0a8b08e");
+        eztConfig.setUrl("https://api.weixin.qq.com/cgi-bin/token?grant_type=%s&appid=%s&secret=%s");
+        eztConfig.setGrantType("client_credential");
+        eztConfig.setTicketUrl("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi");
+
+        configMap.put("emato",eztConfig);
+
+
+        WxGeneralConfig ematoConfig = new WxGeneralConfig();
+        ematoConfig.setAppId("wx8735db2da152ce19");
+        ematoConfig.setAppSecret("016edeba9d3f0508c95476ceec5f65e4");
+        ematoConfig.setUrl("https://api.weixin.qq.com/cgi-bin/token?grant_type=%s&appid=%s&secret=%s");
+        ematoConfig.setGrantType("client_credential");
+        ematoConfig.setTicketUrl("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi");
+
+        configMap.put("qhemato",ematoConfig);
+
+
+    }
+
     /**
      * 查询所有未失效的Token记录
      * @return 所有未失效的Token记录
@@ -87,22 +116,82 @@ public class TokenRecordService {
      *
      * @return token
      */
-    public TokenRecord getLatestToken() throws ParseException {
-        // 如果数据库中没有或者是该token已过期,则需要重新生成token
-        TokenRecord tokenRecord = tokenRecordMapper.queryLatestAndValidRecord();
+    public TokenRecord getLatestToken(String system) throws ParseException {
+        TokenRecord tokenRecord;
+        if(StringUtil.isNullOrEmpty(system)){
+            // 如果数据库中没有或者是该token已过期,则需要重新生成token
+            tokenRecord = tokenRecordMapper.queryLatestAndValidRecord(wxGeneralConfig.getAppId());
+        }else{
+            WxGeneralConfig wxGeneralConfigTmp = configMap.get(system);
+            tokenRecord = tokenRecordMapper.queryLatestAndValidRecord(wxGeneralConfigTmp.getAppId());
+        }
+
+
         if (null == tokenRecord) {
             // 需要生成Token
-            return generateToken();
+            if(StringUtil.isNullOrEmpty(system)){
+                return generateToken();
+            }else{
+                return generateToken(system);
+            }
+
         }
         String expiresTime = tokenRecord.getExpiresTime();
         Date tokenExpiresTime = DateUtils.parseString(expiresTime);
         Date now = new Date();
         if (now.getTime() > tokenExpiresTime.getTime()) {
-            return generateToken();
+            if(StringUtil.isNullOrEmpty(system)){
+                return generateToken();
+            }else{
+                return generateToken(system);
+            }
         }
         return tokenRecord;
     }
 
+
+    /**
+     * 主动请求微信生成accessToken
+     *
+     * @return token记录
+     */
+    public TokenRecord generateToken(String system) throws RuntimeException {
+        WxGeneralConfig wxGeneralConfig = configMap.get(system);
+        String url = "";
+        if(Objects.nonNull(wxGeneralConfig)){
+            url = String.format(wxGeneralConfig.getUrl(), wxGeneralConfig.getGrantType(), wxGeneralConfig.getAppId(), wxGeneralConfig.getAppSecret());
+        }
+        Map response = null;
+        try {
+            response = restTemplate.getForEntity(url, Map.class).getBody();
+        } catch (Exception e) {
+            logger.error("请求微信平台失败!errorMessage:" + e.getMessage());
+            throw new RuntimeException("请求微信平台失败!");
+        }
+        if (null == response) {
+            logger.error("请求微信平台失败!errorMessage:response is null");
+            throw new RuntimeException("请求微信平台失败!");
+        }
+
+        OperationRecord operationRecord = wrapOperationRecord("目前暂无");
+        TokenRecord tokenRecord = wrapTokenRecord(operationRecord, response,wxGeneralConfig.getAppId());
+
+        if (null == tokenRecord) {
+            Object errcode = response.get("errcode");
+            Object errmsg = response.get("errmsg");
+            logger.error("请求微信平台生成AccessToken失败!errorCode:" + errcode + ",errorMessage:" + errmsg);
+            throw new RuntimeException("请求微信平台生成AccessToken失败!");
+        }
+
+        // 保存操作记录
+        operationRecordService.insertRecord(operationRecord);
+        int latestId = operationRecordService.queryLatestId();
+        // 保存TokenRecord
+        tokenRecord.setOpId(latestId);
+        insertRecord(tokenRecord);
+        return tokenRecord;
+    }
+
     /**
      * 主动请求微信生成accessToken
      *
@@ -125,7 +214,7 @@ public class TokenRecordService {
         }
 
         OperationRecord operationRecord = wrapOperationRecord("目前暂无");
-        TokenRecord tokenRecord = wrapTokenRecord(operationRecord, response);
+        TokenRecord tokenRecord = wrapTokenRecord(operationRecord, response,wxGeneralConfig.getAppId());
 
         if (null == tokenRecord) {
             Object errcode = response.get("errcode");
@@ -179,7 +268,7 @@ public class TokenRecordService {
      * @param response        请求微信平台响应
      * @return Token记录
      */
-    private TokenRecord wrapTokenRecord(OperationRecord operationRecord, Map response) {
+    private TokenRecord wrapTokenRecord(OperationRecord operationRecord, Map response,String appid) {
         TokenRecord tokenRecord = new TokenRecord();
         String accessToken = (String) response.get("access_token");
         Integer expiresIn = (Integer) response.get("expires_in");
@@ -196,6 +285,7 @@ public class TokenRecordService {
             tokenRecord.setExpiresTime(DateUtils.formatDate(new Date(expiresTime)));
             tokenRecord.setOpId(operationRecord.getOpId());
             tokenRecord.setIsValid(0);
+            tokenRecord.setAppId(appid);
             return tokenRecord;
         }
         return null;

+ 1 - 1
src/main/java/com/ematou/wxbase/service/impl/TicketRecordServiceImpl.java

@@ -96,7 +96,7 @@ public class TicketRecordServiceImpl implements TicketRecordService {
         // 获取微信 token
         TokenRecord latestToken = null;
         try {
-            latestToken = tokenRecordService.getLatestToken();
+            latestToken = tokenRecordService.getLatestToken(null);
         } catch (ParseException e) {
             logger.error("获取微信 token 失败", e);
             throw new RuntimeException("获取微信 token 失败!");

+ 10 - 1
src/main/resources/mybatis/TokenRecordMapper.xml

@@ -5,7 +5,7 @@
 <mapper namespace="com.ematou.wxbase.mapper.TokenRecordMapper">
 
     <sql id="Base_Column_List">
-        id, access_token, expires_time, effect_time, expires_in, op_id, is_valid, creater_sn, create_time, moder_sn, mod_time, tstm
+        id, access_token, expires_time, effect_time, expires_in, op_id, is_valid, creater_sn, create_time, moder_sn, mod_time, tstm, app_id
     </sql>
 
     <!-- 插入记录后返回id -->
@@ -48,6 +48,9 @@
             <if test="record.tstm != null">
                 tstm,
             </if>
+            <if test="record.appId != null">
+                app_id,
+            </if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides="," >
             <if test="record.accessToken != null">
@@ -83,6 +86,9 @@
             <if test="record.tstm != null">
                 #{record.tstm},
             </if>
+            <if test="record.appId != null">
+                #{record.appId},
+            </if>
         </trim>
     </insert>
 
@@ -100,6 +106,9 @@
         <include refid="Base_Column_List"/>
         from wx_token_record
         where is_valid=0
+        <if test="appId != null">
+            and app_id = #{appId}
+        </if>
         order by id desc
         limit 1
     </select>

+ 1 - 1
src/test/java/com/ematou/wxbase/WxbaseApplicationTests.java

@@ -16,7 +16,7 @@ class WxbaseApplicationTests {
     @Test
     void contextLoads() throws Exception {
 
-        TokenRecord latestToken = tokenRecordService.getLatestToken();
+        TokenRecord latestToken = tokenRecordService.getLatestToken(null);
 
         System.out.println(latestToken);