Sfoglia il codice sorgente

fix 企业微信获取token

zoujiajian 3 anni fa
parent
commit
6a4323c8d2

+ 0 - 89
netflix-dao/src/main/java/com/cyksj/model/response/Callback.java

@@ -1,89 +0,0 @@
-package com.cyksj.model.response;
-
-import lombok.Getter;
-
-/**
- * @author valor.
- * @date 2019-07-23 14:56
- */
-@Getter
-public class Callback<T> {
-
-    /**
-     * 请求是否成功
-     */
-    private boolean success;
-
-    /**
-     * 页面转跳参数
-     */
-    private int code;
-
-    /**
-     * 返回的消息
-     */
-    private String message;
-
-    /**
-     * 返回的数据
-     */
-    private T value;
-
-
-    /**
-     * 返回subCode
-     */
-    private Integer subCode;
-
-    /**
-     * 返回信息
-     */
-    private String subMsg;
-
-
-    public Callback() { }
-
-    private Callback(boolean result) {
-        this.success = result;
-        this.message = "";
-        this.code = result ? 1 : 0;
-    }
-
-    public static <T> Callback<T> success() {
-        return new Callback<>(true);
-    }
-
-    public static <T> Callback<T> fail() {
-        return new Callback<>(false);
-    }
-
-    public Callback<T> setCode(int code) {
-        this.code = code;
-        return this;
-    }
-
-    public Callback<T> setSuccess(Boolean success){
-        this.success = success;
-        return this;
-    }
-
-    public Callback<T> setMsg(String msg) {
-        this.message = msg;
-        return this;
-    }
-
-    public Callback<T> setData(T data) {
-        this.value = data;
-        return this;
-    }
-
-    public Callback<T> setSubCode(int subCode) {
-        this.subCode = subCode;
-        return this;
-    }
-
-    public Callback<T> setSubMsg(String subMsg) {
-        this.subMsg = subMsg;
-        return this;
-    }
-}

+ 53 - 0
netflix-dao/src/main/java/com/cyksj/model/response/OffiaccountJsTicket.java

@@ -0,0 +1,53 @@
+package com.cyksj.model.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * @author valor.
+ * @date 2019/12/12 14:33
+ */
+public class OffiaccountJsTicket {
+
+    /* 参考 https://mp.weixin.qq.com/wiki?action=doc&id=mp1421141115&t=0.6171762253872093#62 */
+
+    private Integer errcode;
+
+    private String errmsg;
+
+    private String ticket;
+
+    @JsonProperty("expires_in")
+    private Integer expiresIn;
+
+    public Integer getErrcode() {
+        return errcode;
+    }
+
+    public void setErrcode(Integer errcode) {
+        this.errcode = errcode;
+    }
+
+    public String getErrmsg() {
+        return errmsg;
+    }
+
+    public void setErrmsg(String errmsg) {
+        this.errmsg = errmsg;
+    }
+
+    public String getTicket() {
+        return ticket;
+    }
+
+    public void setTicket(String ticket) {
+        this.ticket = ticket;
+    }
+
+    public Integer getExpiresIn() {
+        return expiresIn;
+    }
+
+    public void setExpiresIn(Integer expiresIn) {
+        this.expiresIn = expiresIn;
+    }
+}

+ 60 - 0
netflix-dao/src/main/java/com/cyksj/model/response/WechatAccessToken.java

@@ -0,0 +1,60 @@
+package com.cyksj.model.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * @author valor
+ * @date 2019-01-09 19:21
+ */
+public class WechatAccessToken {
+
+    /* 参考 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183 */
+
+    @JsonProperty("access_token")
+    private String accessToken;
+
+    @JsonProperty("expires_in")
+    private Integer expiresIn;
+
+    /**
+     * 错误码
+     */
+    private Integer errcode;
+
+    /**
+     * 错误信息
+     */
+    private String errmsg;
+
+    public String getAccessToken() {
+        return accessToken;
+    }
+
+    public void setAccessToken(String accessToken) {
+        this.accessToken = accessToken;
+    }
+
+    public Integer getExpiresIn() {
+        return expiresIn;
+    }
+
+    public void setExpiresIn(Integer expiresIn) {
+        this.expiresIn = expiresIn;
+    }
+
+    public Integer getErrcode() {
+        return errcode;
+    }
+
+    public void setErrcode(Integer errcode) {
+        this.errcode = errcode;
+    }
+
+    public String getErrmsg() {
+        return errmsg;
+    }
+
+    public void setErrmsg(String errmsg) {
+        this.errmsg = errmsg;
+    }
+}

+ 2 - 12
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpServiceImpl.java

@@ -1,7 +1,6 @@
 package com.cyksj.service.corp.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.common.util.ListsUtil;
@@ -252,21 +251,12 @@ public class CorpServiceImpl implements CorpService {
 
 	@Override
 	public String getJsTicket(String corpId) throws Exception {
-		String jsTicket = redisService.getStr(RedisService.key.CORP_JS_TICKET_KEY.getName() + corpId);
-		if (StrUtil.isBlank(jsTicket)) {
-			return wxCorpOps.getJsTicket(corpId);
-		}
-		return jsTicket;
+		return wxCorpOps.getJsTicket(corpId);
 	}
 
 	@Override
 	public String getAgentJsTicket(String corpId, String agentId) throws Exception {
-		String jsTicket = redisService.getStr(RedisService.key.CORP_AGENT_JS_TICKET_KEY.getName() + corpId);
-		if (StrUtil.isBlank(jsTicket)) {
-			return wxCorpOps.getAgentJsTicket(corpId, agentId);
-		} else {
-			return jsTicket;
-		}
+		return wxCorpOps.getAgentJsTicket(corpId, agentId);
 	}
 
 }

+ 45 - 27
netflix-service/src/main/java/com/cyksj/service/corp/impl/WxCorpOpsImpl.java

@@ -23,7 +23,6 @@ import java.net.URLEncoder;
 import java.net.http.HttpRequest;
 import java.net.http.HttpResponse;
 import java.util.List;
-import java.util.Optional;
 
 /*
  *项目名: netflix
@@ -40,8 +39,6 @@ public class WxCorpOpsImpl implements WxCorpOps {
 	@Autowired
 	private RedisService redisService;
 
-	private final static String remoteUrl = "wx-ops.liuliangbang.vip";
-
 	@Override
 	public CorpExternalContactInfo getExternalContact(String corpId, String userId) throws Exception {
 		String url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token=" + getAccessToken(corpId) + "&external_userid=" + userId;
@@ -60,7 +57,7 @@ public class WxCorpOpsImpl implements WxCorpOps {
 
 	@Override
 	public String getAccessToken(String corpId) throws Exception {
-		String accessToken = redisService.getStr(RedisKey.ACCESS_TOKEN_KEY + corpId);
+		String accessToken = redisService.getStr(RedisKey.CORP_ACCESS_TOKEN_KEY + corpId);
 		if (StringUtils.isNotBlank(accessToken)) {
 			return accessToken;
 		}
@@ -172,9 +169,9 @@ public class WxCorpOpsImpl implements WxCorpOps {
 
 	@Override
 	public String getJsTicket(String corpId) throws Exception {
-		String jsTicket = redisService.getStr(RedisKey.JS_TICKET_KEY + corpId);
+		String jsTicket = redisService.getStr(RedisKey.CORP_JS_TICKET_KEY + corpId);
 		if (StrUtil.isBlank(jsTicket)) {
-			return js_ticket(this.getAccessToken(corpId));
+			return js_ticket(corpId);
 		}
 		return jsTicket;
 	}
@@ -189,10 +186,11 @@ public class WxCorpOpsImpl implements WxCorpOps {
 	}
 
 	public String access_token(String corpId) throws Exception {
-		corpId = Optional.ofNullable(corpId).orElse(yhlXWxCorpConfig.getCorpId());
-
-		String url = "http://" + remoteUrl + "/wx/corp/access_token" +
-				"?corpId=" + corpId;
+		BaseWxCorpConfig corpConfig = WxCorpFactory.getBaseWxCorpConfig(corpId);
+		if (corpId == null) {
+			throw BusinessRuntimeException.getInstance("{0}企业微信不存在", corpId);
+		}
+		String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s", corpConfig.getCorpId(), corpConfig.getCorpSecret());
 		HttpResponse<byte[]> res =
 				J11HttpC.custom()
 						.ofGet()
@@ -204,16 +202,24 @@ public class WxCorpOpsImpl implements WxCorpOps {
 			throw BusinessRuntimeException.getInstance("获取access_token失败: " + IoKit.toString(res.body()));
 		}
 
-		Callback callback = Jsons.parseObject(res.body(), Callback.class);
-		if (!callback.isSuccess()) {
-			throw BusinessRuntimeException.getInstance(callback.getMessage());
+		WechatAccessToken token = Jsons.parseObject(res.body(), WechatAccessToken.class);
+		if (null == token) {
+			throw BusinessRuntimeException.getInstance("获取企业微信access_token失败: " + IoKit.toString(res.body()));
 		}
-		return (String) callback.getValue();
+
+		final Integer errcode = token.getErrcode();
+		if (null != errcode && 0 != errcode) {
+			throw BusinessRuntimeException.getInstance("获取企业微信access_token失败: " + token.getErrmsg() + "[" + errcode + "]");
+		}
+		//存入redis
+		String accessToken = token.getAccessToken();
+		// 设置过期时间 比微信官方给的时间提前300秒过期
+		redisService.set(RedisKey.CORP_ACCESS_TOKEN_KEY + corpId, accessToken, token.getExpiresIn() - 300L);
+		return accessToken;
 	}
 
 	public String js_ticket(String corpId) throws Exception {
-		String url = "http://" + remoteUrl + "/wx/corp/js_ticket" +
-				"?corpId=" + corpId;
+		String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=%s", this.getAccessToken(corpId));
 		HttpResponse<byte[]> res =
 				J11HttpC.custom()
 						.ofGet()
@@ -222,19 +228,25 @@ public class WxCorpOpsImpl implements WxCorpOps {
 						.send(HttpResponse.BodyHandlers.ofByteArray());
 
 		if (200 != res.statusCode()) {
-			throw BusinessRuntimeException.getInstance("获取access_token失败: " + IoKit.toString(res.body()));
+			throw BusinessRuntimeException.getInstance("获取js_ticket失败: " + IoKit.toString(res.body()));
 		}
 
-		Callback callback = Jsons.parseObject(res.body(), Callback.class);
-		if (!callback.isSuccess()) {
-			throw BusinessRuntimeException.getInstance(callback.getMessage());
+		OffiaccountJsTicket ticket = Jsons.parseObject(res.body(), OffiaccountJsTicket.class);
+		if (null == ticket) {
+			throw BusinessRuntimeException.getInstance("获取js_ticket失败: " + IoKit.toString(res.body()));
 		}
-		return (String) callback.getValue();
+
+		final Integer errcode = ticket.getErrcode();
+		if (null != errcode && 0 != errcode) {
+			throw BusinessRuntimeException.getInstance("获取js_ticket失败: " + ticket.getErrmsg() + "[" + errcode + "]");
+		}
+		String jsTicket = ticket.getTicket();
+		redisService.set(RedisKey.CORP_JS_TICKET_KEY + corpId, jsTicket, ticket.getExpiresIn() - 300L);
+		return jsTicket;
 	}
 
 	private String agentJsTicket(String corpId) throws Exception {
-		String url = "http://" + remoteUrl + "/wx/corp/agent_js_ticket" +
-				"?corpId=" + corpId;
+		String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token=%s&type=agent_config", this.getAccessToken(corpId));
 		HttpResponse<byte[]> res =
 				J11HttpC.custom()
 						.ofGet()
@@ -246,10 +258,16 @@ public class WxCorpOpsImpl implements WxCorpOps {
 			throw BusinessRuntimeException.getInstance("获取agent_js_ticket失败: " + IoKit.toString(res.body()));
 		}
 
-		Callback callback = Jsons.parseObject(res.body(), Callback.class);
-		if (!callback.isSuccess()) {
-			throw BusinessRuntimeException.getInstance(callback.getMessage());
+		OffiaccountJsTicket ticket = Jsons.parseObject(res.body(), OffiaccountJsTicket.class);
+		if (null == ticket) {
+			throw BusinessRuntimeException.getInstance("获取agent_js_ticket失败: " + IoKit.toString(res.body()));
+		}
+		final Integer errcode = ticket.getErrcode();
+		if (null != errcode && 0 != errcode) {
+			throw BusinessRuntimeException.getInstance("获取agent_js_ticket失败: " + ticket.getErrmsg() + "[" + errcode + "]");
 		}
-		return (String) callback.getValue();
+		String jsTicket = ticket.getTicket();
+		redisService.set(RedisKey.CORP_AGENT_JS_TICKET_KEY + corpId, jsTicket, ticket.getExpiresIn() - 300L);
+		return jsTicket;
 	}
 }

+ 2 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/WxCorpController.java

@@ -133,7 +133,7 @@ public class WxCorpController {
 	@GetMapping("/get/jsTicket")
 	public Result<CorpJsSdkTicket> getJsTicket(String corpId, String agentId, String url) throws Exception {
 		corpId = Optional.ofNullable(corpId).orElse(yhlxWxCorpConfig.getCorpId());
-		agentId = Optional.ofNullable(agentId).orElse("1000010");
+		agentId = Optional.ofNullable(agentId).orElse("1000004");
 
 		// 获取js-ticket
 		String ticket = corpService.getJsTicket(corpId);
@@ -165,7 +165,7 @@ public class WxCorpController {
 	@GetMapping("/get/agentJsTicket")
 	public Result<CorpJsSdkTicket> getagentJsTicket(String corpId, String agentId, String url) throws Exception {
 		corpId = Optional.ofNullable(corpId).orElse(yhlxWxCorpConfig.getCorpId());
-		agentId = Optional.ofNullable(agentId).orElse("1000010");
+		agentId = Optional.ofNullable(agentId).orElse("1000004");
 
 		// 获取js-ticket
 		String ticket = corpService.getAgentJsTicket(corpId, agentId);