diff --git a/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java b/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java new file mode 100644 index 000000000..394b8eb19 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/controller/WechatApiController.java @@ -0,0 +1,17 @@ +package com.ruoyi.bps.controller; + +import com.ruoyi.bps.service.IWechatApiService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class WechatApiController { + @Autowired + IWechatApiService wechatApiService; + + @RequestMapping("anon/getAccessToken") + public String getAccessToken() { + return wechatApiService.GetAccessToken(); + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/domain/WechatAccessToken.java b/box-bps/src/main/java/com/ruoyi/bps/domain/WechatAccessToken.java new file mode 100644 index 000000000..95d318913 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/domain/WechatAccessToken.java @@ -0,0 +1,112 @@ +package com.ruoyi.bps.domain; + +import java.util.Date; + +public class WechatAccessToken { + private Long sid; + private String corpId; + private String agentId; + private String secret; + private String errcode; + private String errmsg; + private String access_token; //access_token + private String expires_in; + private Date getTokenTime; + private String aesKey; + + public Long getSid() { + return sid; + } + + public void setSid(Long sid) { + this.sid = sid; + } + + public String getCorpId() { + return corpId; + } + + public void setCorpId(String corpId) { + this.corpId = corpId; + } + + public String getAgentId() { + return agentId; + } + + public void setAgentId(String agentId) { + this.agentId = agentId; + } + + public String getSecret() { + return secret; + } + + public void setSecret(String secret) { + this.secret = secret; + } + + public String getErrcode() { + return errcode; + } + + public void setErrcode(String errcode) { + this.errcode = errcode; + } + + public String getErrmsg() { + return errmsg; + } + + public void setErrmsg(String errmsg) { + this.errmsg = errmsg; + } + + public String getAccess_token() { + return access_token; + } + + public void setAccess_token(String access_token) { + this.access_token = access_token; + } + + public String getExpires_in() { + return expires_in; + } + + public void setExpires_in(String expires_in) { + this.expires_in = expires_in; + } + + public Date getGetTokenTime() { + return getTokenTime; + } + + public void setGetTokenTime(Date getTokenTime) { + this.getTokenTime = getTokenTime; + } + + public String getAesKey() { + return aesKey; + } + + public void setAesKey(String aesKey) { + this.aesKey = aesKey; + } + + @Override + public String toString() { + return "WechatAccessToken{" + + "sid='" + sid + '\'' + + ", corpId='" + corpId + '\'' + + ", agentId='" + agentId + '\'' + + ", secrect='" + secret + '\'' + + ", errcode='" + errcode + '\'' + + ", errmsg='" + errmsg + '\'' + + ", access_token='" + access_token + '\'' + + ", expires_in='" + expires_in + '\'' + + ", getTokenTime=" + getTokenTime + + ", aesKey='" + aesKey + '\'' + + '}'; + } +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/mapper/WechatAccessTokenMapper.java b/box-bps/src/main/java/com/ruoyi/bps/mapper/WechatAccessTokenMapper.java new file mode 100644 index 000000000..541980bd7 --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/mapper/WechatAccessTokenMapper.java @@ -0,0 +1,67 @@ +package com.ruoyi.bps.mapper; + +import com.ruoyi.bps.domain.WechatAccessToken; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +/** + * 企业微信获取Access Token 的Mapper接口 + * + * @author Bo + * @date 2021-07-21 + */ +public interface WechatAccessTokenMapper +{ + + + + /** + * 根据SID查询Access Token + * + * @param sid + * @return 企业微信Access Token信息 + */ + public WechatAccessToken selectWechatAccessTokenById(Long sid); + + + /** + * 查询Access Token + * @param wechatAccessToken + * @return 企业微信Access Token信息 + */ + public List selectWechatAccessTokenList(WechatAccessToken wechatAccessToken); + + /** + * 新增Access Token + * + * @param wechatAccessToken Access Token + * @return 结果 + */ + public int insertWechatAccessToken(WechatAccessToken wechatAccessToken); + + /** + * 修改Access Token + * + * @param wechatAccessToken Access Token + * @return 结果 + */ + public int updateWechatAccessToken(WechatAccessToken wechatAccessToken); + + /** + * 删除Access Token + * + * @param sid Access TokenID + * @return 结果 + */ + public int deleteWechatAccessTokenById(Long sid); + + /** + * 批量删除Access Token + * + * @param sids 需要删除的数据ID + * @return 结果 + */ + public int deleteWechatAccessTokenByIds(String[] sids); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/IWechatApiService.java b/box-bps/src/main/java/com/ruoyi/bps/service/IWechatApiService.java new file mode 100644 index 000000000..6a75b451c --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/IWechatApiService.java @@ -0,0 +1,6 @@ +package com.ruoyi.bps.service; + +public interface IWechatApiService { + //获取Access Token + public String GetAccessToken(); +} diff --git a/box-bps/src/main/java/com/ruoyi/bps/service/impl/WechatApiServiceImpl.java b/box-bps/src/main/java/com/ruoyi/bps/service/impl/WechatApiServiceImpl.java new file mode 100644 index 000000000..58d589ecf --- /dev/null +++ b/box-bps/src/main/java/com/ruoyi/bps/service/impl/WechatApiServiceImpl.java @@ -0,0 +1,96 @@ +package com.ruoyi.bps.service.impl; + +import com.google.gson.Gson; +import com.ruoyi.bps.domain.WechatAccessToken; +import com.ruoyi.bps.mapper.WechatAccessTokenMapper; +import com.ruoyi.bps.service.IWechatApiService; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.http.HttpUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +@Service +public class WechatApiServiceImpl implements IWechatApiService { + @Value("${wechat.corpId}") + private String corpId; + @Value("${wechat.secret}") + private String secret; + @Value("${wechat.agentId}") + private String agentId; + + @Autowired + WechatAccessTokenMapper wechatAccessTokenMapper; + + /** + * 获取企业微信Access Token + * @return Access Token + */ + @Override + public String GetAccessToken() { + //获取本地数据库中的Token + WechatAccessToken wat = new WechatAccessToken(); + wat.setCorpId(corpId); + wat.setSecret(secret); + List list= wechatAccessTokenMapper.selectWechatAccessTokenList(wat); + WechatAccessToken returnWat; + //如果数据库中没有对应corpId+corpSecret的数据,或者数据多于一条,则从企业微信获取Token,并插入数据库 + if(list.isEmpty() || list.size() <=0) + { + returnWat= getAccessTokenFromWechat(corpId,secret,agentId); + wechatAccessTokenMapper.insertWechatAccessToken(returnWat); + return returnWat.getAccess_token(); + } + + //如果数据库中存在多条corpId+corpSecret的数据,则全部删除再从企业微信获取Token,并插入数据库 + if(list.size()>1 || StringUtils.isEmpty(list.get(0).getAccess_token())) + { + for(WechatAccessToken token:list){ + wechatAccessTokenMapper.deleteWechatAccessTokenById(token.getSid()); + } + returnWat= getAccessTokenFromWechat(corpId,secret,agentId); + wechatAccessTokenMapper.insertWechatAccessToken(returnWat); + return returnWat.getAccess_token(); + } + + //如果获取到的数据中,Token或更新时间为空,或者离过期时间小于1000秒,则从企业微信获取Token,并更新数据库 + int a= differenceSecond(DateUtils.getNowDate(),list.get(0).getGetTokenTime())-Integer.parseInt(list.get(0).getExpires_in())-1000; + if(StringUtils.isEmpty(list.get(0).getAccess_token()) || list.get(0).getGetTokenTime() ==null + || differenceSecond(DateUtils.getNowDate(),list.get(0).getGetTokenTime())>Integer.parseInt(list.get(0).getExpires_in())-1000){ + returnWat= getAccessTokenFromWechat(corpId,secret,agentId); + returnWat.setSid(list.get(0).getSid()); + wechatAccessTokenMapper.updateWechatAccessToken(returnWat); + return returnWat.getAccess_token(); + } + + //如果以上情况皆不是,则返回本地数据库的token + return list.get(0).getAccess_token(); + + } + + //根据corpId与corpSecret获取Token + private WechatAccessToken getAccessTokenFromWechat(String corpId,String secret, String agentId){ + String param ="corpid=" + corpId + "&corpsecret=" + secret; + String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"; + WechatAccessToken wechatAccessToken= new Gson().fromJson(HttpUtils.sendGet(url,param),WechatAccessToken.class); + wechatAccessToken.setCorpId(corpId); + wechatAccessToken.setSecret(secret); + wechatAccessToken.setAgentId(agentId); + wechatAccessToken.setGetTokenTime(DateUtils.getNowDate()); + return wechatAccessToken; + } + + /** + * + * @param minuendDate 被减数日期 + * @param subtractionDate 减数日期 + * @return 相差秒数 + */ + public int differenceSecond(Date minuendDate, Date subtractionDate ) { + return (int)((minuendDate.getTime() - subtractionDate.getTime()) / 1000); + } +} diff --git a/box-bps/src/main/resources/mapper/bps/WechatAccessTokenMapper.xml b/box-bps/src/main/resources/mapper/bps/WechatAccessTokenMapper.xml new file mode 100644 index 000000000..d5dfc1c85 --- /dev/null +++ b/box-bps/src/main/resources/mapper/bps/WechatAccessTokenMapper.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + select sid, corp_id, agent_id, secret, errcode, errmsg, access_token, expires_in, get_token_time, aes_key from wechat_access_token + + + + + + + + insert into wechat_access_token + + corp_id, + agent_id, + secret, + errcode, + errmsg, + access_token, + expires_in, + getToken_time, + aes_key, + + + #{corpId}, + #{agentId}, + #{secret}, + #{errcode}, + #{errmsg}, + #{access_token}, + #{expires_in}, + #{getTokenTime}, + #{aesKey}, + + + + + update wechat_access_token + + corp_id = #{corpId}, + agent_id = #{agentId}, + secret = #{secret}, + errcode = #{errcode}, + errmsg = #{errmsg}, + access_token = #{access_token}, + expires_in = #{expires_in}, + get_token_time = #{getTokenTime}, + aes_key = #{aesKey}, + + where sid = #{sid} + + + + delete from wechat_access_token where sid = #{sid} + + + + delete from wechat_access_token where sid in + + #{sid} + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 5582ace2b..10b87328c 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -141,3 +141,11 @@ xss: swagger: # 是否开启swagger enabled: true + +#企业微信 +wechat: + corpId: ww4ed3771457e5f463 + agentId: 1000080 + secret: drtHKYabI9_EgjJQ8aqDPTQkY1WUYeWUTMkYw7D_z64 + token: 111 + aesKey: 111 \ No newline at end of file