REQ-2211: 获取钉钉config

This commit is contained in:
yangchen 2024-04-07 19:11:52 +08:00
parent 9d21a6c713
commit 9ad24ca275
3 changed files with 45 additions and 16 deletions

View File

@ -9,10 +9,16 @@ import java.util.List;
*/
@Data
public class GetDingDingConfigReq {
/**
* 目前后端写死
* 三方凭证ID
*/
private Long ouId;
private String appKey;
/**
* 三方凭证密钥
*/
private String appSecret;
/**
* 当前网页的URL不包含#及其后面部分
*/

View File

@ -4,6 +4,7 @@ import cn.axzo.riven.common.constants.RedisKeyConstant;
import cn.axzo.riven.common.util.Throws;
import cn.azxo.framework.common.utils.LogUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.aliyun.dingtalkoauth2_1_0.models.CreateJsapiTicketResponse;
import com.aliyun.dingtalkoauth2_1_0.models.CreateJsapiTicketResponseBody;
import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest;
@ -38,7 +39,7 @@ public class DingDingNewSdkManger {
String key = String.format(RedisKeyConstant.DING_DING_V2_ACCESS_TOKEN_KEY, appKey);
String tokenStr = redisTemplate.opsForValue().get(key);
if (StringUtils.hasText(tokenStr)) {
return JSONUtil.toBean(tokenStr, GetAccessTokenResponseBody.class);
return JSON.parseObject((String) JSON.parse(tokenStr), GetAccessTokenResponseBody.class);
}
GetAccessTokenRequest req = new GetAccessTokenRequest();
@ -51,7 +52,7 @@ public class DingDingNewSdkManger {
logErr("getAccessToken", e);
throw Throws.bizDefaultException();
}
String data = JSONUtil.toJsonStr(res.getBody());
String data = JSON.toJSONString(res.getBody());
redisTemplate.opsForValue().set(key, data, res.getBody().expireIn - 200L, TimeUnit.SECONDS);
return res.getBody();
}
@ -63,13 +64,13 @@ public class DingDingNewSdkManger {
String key = String.format(RedisKeyConstant.DING_DING_V2_JSAPI_TICKET, appKey);
String tokenStr = redisTemplate.opsForValue().get(key);
if (StringUtils.hasText(tokenStr)) {
return JSONUtil.toBean(tokenStr, CreateJsapiTicketResponseBody.class);
return JSON.parseObject((String) JSON.parse(tokenStr), CreateJsapiTicketResponseBody.class);
}
com.aliyun.dingtalkoauth2_1_0.models.CreateJsapiTicketHeaders createJsapiTicketHeaders = new com.aliyun.dingtalkoauth2_1_0.models.CreateJsapiTicketHeaders();
createJsapiTicketHeaders.xAcsDingtalkAccessToken = accessToken;
try {
CreateJsapiTicketResponse res = dingTalkOauthClient.createJsapiTicketWithOptions(createJsapiTicketHeaders, new RuntimeOptions());
String data = JSONUtil.toJsonStr(res.getBody());
String data = JSON.toJSONString(res.getBody());
redisTemplate.opsForValue().set(key, data, res.getBody().expireIn - 200L, TimeUnit.SECONDS);
return res.getBody();
} catch (Exception e) {

View File

@ -6,31 +6,53 @@ import cn.axzo.riven.client.res.GetDingDingConfigRes;
import cn.axzo.riven.common.util.DdConfigSign;
import cn.axzo.riven.common.util.Throws;
import cn.axzo.riven.manger.DingDingNewSdkManger;
import cn.axzo.riven.repository.entity.ThirdPartyCredential;
import cn.axzo.riven.repository.service.ThirdPartyCredentialDao;
import cn.azxo.framework.common.utils.LogUtil;
import com.aliyun.dingtalkoauth2_1_0.models.CreateJsapiTicketResponseBody;
import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponseBody;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.net.URL;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
/**
* @author yangchen@axzo.cn
*/
@Service
public class DingDingService {
@Autowired
private ThirdPartyCredentialDao thirdPartyCredentialDao;
@Autowired
private DingDingNewSdkManger dingDingNewSdkManger;
public GetDingDingConfigRes getDingDingConfig(GetDingDingConfigReq req) {
ThirdPartyCredential dingTalk = thirdPartyCredentialDao.getByOuIdAndChannel(req.getOuId(), "DingTalk");
if (dingTalk == null) {
throw Throws.bizException(BaseCode.FORBIDDEN, "企业未配置钉钉");
// 从url里获取 corpId 防止恶意请求
String corpId;
try {
URL urlObj = new URL(req.getUrl());
String query = urlObj.getQuery();
Map<String, String> params = new HashMap<>();
if (query != null) {
String[] pairs = query.split("&");
for (String pair : pairs) {
int idx = pair.indexOf("=");
String key = URLDecoder.decode(pair.substring(0, idx), "UTF-8");
String value = URLDecoder.decode(pair.substring(idx + 1), "UTF-8");
params.put(key, value);
}
}
corpId = params.get("corpId");
} catch (Exception e) {
throw Throws.bizException(BaseCode.BAD_REQUEST, "url参数不正确");
}
GetAccessTokenResponseBody accessToken = dingDingNewSdkManger.getAccessToken(dingTalk.getAppKey(), dingTalk.getAppSecret());
CreateJsapiTicketResponseBody jsapiTicket = dingDingNewSdkManger.createJsapiTicket(dingTalk.getAppKey(), accessToken.getAccessToken());
if (!StringUtils.hasText(corpId)) {
throw Throws.bizException(BaseCode.BAD_REQUEST, "url参数corpId不正确");
}
GetAccessTokenResponseBody accessToken = dingDingNewSdkManger.getAccessToken(req.getAppKey(), req.getAppSecret());
CreateJsapiTicketResponseBody jsapiTicket = dingDingNewSdkManger.createJsapiTicket(req.getAppKey(), accessToken.getAccessToken());
String randomStr = DdConfigSign.getRandomStr(10);
long ts = System.currentTimeMillis() / 1000;
String sign;
@ -42,7 +64,7 @@ public class DingDingService {
}
GetDingDingConfigRes getDingDingConfigRes = new GetDingDingConfigRes();
getDingDingConfigRes.setAppId(req.getAppId());
getDingDingConfigRes.setCorpId(dingTalk.getAppKey());
getDingDingConfigRes.setCorpId(corpId);
getDingDingConfigRes.setTimeStamp(ts);
getDingDingConfigRes.setNonceStr(randomStr);
getDingDingConfigRes.setSignature(sign);