|
|
@@ -21,6 +21,8 @@ import java.util.Collections;
|
|
|
import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.Map;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+
|
|
|
@Slf4j
|
|
|
@Component
|
|
|
public class WechatApi {
|
|
|
@@ -30,6 +32,8 @@ public class WechatApi {
|
|
|
|
|
|
@Value("${wx.mp.configs[0].secret}")
|
|
|
private String secret;
|
|
|
+ @Autowired
|
|
|
+ private RedisCache redisCache;
|
|
|
// private String appId = "wx7670b3b1b1cfcd47";
|
|
|
// private String secret = "c6e5726c7039092a907c3242c8d3e406";
|
|
|
|
|
|
@@ -38,14 +42,28 @@ public class WechatApi {
|
|
|
|
|
|
// 获取 access_token
|
|
|
public String getAccessToken() {
|
|
|
- if (accessToken == null || System.currentTimeMillis() > tokenExpireTime) {
|
|
|
- String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
|
|
|
- + appId + "&secret=" + secret;
|
|
|
- RestTemplate restTemplate = new RestTemplate();
|
|
|
- Map<String, Object> res = restTemplate.getForObject(url, Map.class);
|
|
|
- accessToken = (String) res.get("access_token");
|
|
|
- tokenExpireTime = System.currentTimeMillis() + 7000 * 1000; // 提前100秒刷新
|
|
|
+ Object cachedTokenObj = redisCache.getCacheObject("wxQrCodeToken:");
|
|
|
+ if (cachedTokenObj != null) {
|
|
|
+ return cachedTokenObj.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
|
|
|
+ + appId + "&secret=" + secret;
|
|
|
+ RestTemplate restTemplate = new RestTemplate();
|
|
|
+ Map<String, Object> res = restTemplate.getForObject(url, Map.class);
|
|
|
+
|
|
|
+ // 添加错误处理
|
|
|
+ if (res == null || !res.containsKey("access_token")) {
|
|
|
+ throw new RuntimeException("获取微信access_token失败");
|
|
|
}
|
|
|
+ log.info("微信返回结果:{}" , res);
|
|
|
+ accessToken = (String) res.get("access_token");
|
|
|
+
|
|
|
+ // 使用微信返回的过期时间,并设置合理的缓存时间
|
|
|
+ Integer expiresIn = (Integer) res.get("expires_in");
|
|
|
+ long cacheTime = (expiresIn != null) ? expiresIn - 300 : 600; // 提前5分钟过期
|
|
|
+
|
|
|
+ redisCache.setCacheObject("wxQrCodeToken:", accessToken, 1200, TimeUnit.SECONDS);
|
|
|
return accessToken;
|
|
|
}
|
|
|
|
|
|
@@ -63,6 +81,7 @@ public class WechatApi {
|
|
|
|
|
|
RestTemplate restTemplate = new RestTemplate();
|
|
|
Map<String, Object> res = restTemplate.postForObject(url, body, Map.class);
|
|
|
+ log.info("微信返回结果:{}" , res);
|
|
|
String ticket = (String) res.get("ticket");
|
|
|
return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + URLEncoder.encode(ticket, "UTF-8");
|
|
|
}
|