提交 b49932c5 编写于 作者: zhouweidong's avatar zhouweidong

钉钉、微信、阿里消息集成

上级 b523a3c9
......@@ -98,6 +98,25 @@
<artifactId>jobs-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-ecs</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dm</artifactId>
</dependency>
</dependencies>
......
package cn.ibizlab.core.extensions.aspect;
import cn.ibizlab.core.extensions.service.NotifyCoreService;
import cn.ibizlab.core.notify.domain.MsgOpenAccess;
import cn.ibizlab.core.notify.service.IMsgOpenAccessService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* 新建或更新时刷新token
*/
@Aspect
@Order(0)
@Component
public class RefreshTokenAspect {
@Autowired
@Lazy
IMsgOpenAccessService smsConfigService;
@Autowired
@Lazy
NotifyCoreService notifyCoreService;
@Before(value = "execution(* cn.ibizlab.core.notify.service.IMsgOpenAccessService.create*(..))")
public void afterCreate(JoinPoint point) throws Exception {
refreshToken(point);
}
@Before(value = "execution(* cn.ibizlab.core.notify.service.IMsgOpenAccessService.update*(..))")
public void afterUpdate(JoinPoint point) throws Exception {
refreshToken(point);
}
/**
* 刷新token
* @param point
*/
private void refreshToken(JoinPoint point){
Object[] args = point.getArgs();
if (args.length > 0) {
MsgOpenAccess msgOpenAccess = (MsgOpenAccess) args[0];
if(msgOpenAccess.getOpenType().equals("wechat") || msgOpenAccess.getOpenType().equals("dingtalk")){
notifyCoreService.refreshToken(msgOpenAccess);
}
}
}
}
package cn.ibizlab.core.extensions.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RedisConfig {
@Bean
// @LoadBalanced
@ConditionalOnMissingBean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
\ No newline at end of file
package cn.ibizlab.core.extensions.service;
import cn.ibizlab.core.notify.domain.MsgOpenAccess;
import cn.ibizlab.core.notify.domain.MsgTemplate;
import cn.ibizlab.core.notify.domain.MsgUserAccount;
import cn.ibizlab.core.notify.service.IMsgOpenAccessService;
import cn.ibizlab.core.notify.service.IMsgTemplateService;
import cn.ibizlab.core.notify.service.IMsgUserAccountService;
import cn.ibizlab.util.errors.BadRequestAlertException;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dm.model.v20151123.SingleSendMailRequest;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiGettokenRequest;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Service
@Slf4j
public class NotifyCoreService {
/**
* 钉钉获取token api
*/
private final String dingTalkTokenApi="https://oapi.dingtalk.com/gettoken";
/**
* 钉钉发送消息api
*/
private final String dingTalkSendMsgApi="https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2";
/**
* 微信获取token api
*/
private final String weChatGetTokenApi="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
/**
* 微信发送消息api
*/
private final String weChatSendMsgApi="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s";
/**
* 阿里短信服务域名
*/
private final String aliSmsDomain="dysmsapi.aliyuncs.com";
/**
* 阿里短信服务方法名
*/
private final String aliSmsAction="SendSms";
/**
* 消息类型
*/
enum MsgType{
dingtalk,
aliyun,
wechat,
}
@Autowired
RestTemplate restTemplate;
@Autowired
IMsgOpenAccessService smsConfigService;
@Autowired
IMsgTemplateService templateService;
@Autowired
IMsgUserAccountService userAccountService;
/**
* 获取钉钉token
* @param accessId
* @return
*/
@SneakyThrows
public String getDingTalkToken(String accessId){
MsgOpenAccess openAccess=smsConfigService.get(accessId);
String accessKey=openAccess.getAccessKey();
String accessSecret=openAccess.getSecretKey();
DingTalkClient client = new DefaultDingTalkClient(dingTalkTokenApi);
OapiGettokenRequest req = new OapiGettokenRequest();
req.setAppkey(accessKey);
req.setAppsecret(accessSecret);
req.setHttpMethod("GET");
OapiGettokenResponse rsp = client.execute(req);
getResult(rsp.getBody());
return rsp.getBody();
}
/**
* 获取微信token
* @param accessId
* @return
*/
public String getWeChatToken(String accessId){
MsgOpenAccess openAccess=smsConfigService.get(accessId);
String accessKey=openAccess.getAccessKey();
String accessSecret=openAccess.getSecretKey();
ResponseEntity<String> result = restTemplate.getForEntity(String.format(weChatGetTokenApi,accessKey,accessSecret), String.class);
getResult(result.getBody());
return result.getBody();
}
/**
* 发送钉钉消息
* @param tid
* @param userId
*/
@SneakyThrows
public boolean sendDingTalkMsg(String tid,String userId){
String authUserId=getAuthUserId(userId,MsgType.dingtalk);
MsgTemplate template=templateService.get(tid);
MsgOpenAccess openAccess =template.getOpenaccess();
DingTalkClient client = new DefaultDingTalkClient(dingTalkSendMsgApi);
OapiMessageCorpconversationAsyncsendV2Request req = new OapiMessageCorpconversationAsyncsendV2Request();
req.setAgentId(Long.parseLong(template.getTemplateId()));
req.setUseridList(authUserId);
OapiMessageCorpconversationAsyncsendV2Request.Msg obj1 = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
obj1.setMsgtype("text");
OapiMessageCorpconversationAsyncsendV2Request.Text obj2 = new OapiMessageCorpconversationAsyncsendV2Request.Text();
obj2.setContent(template.getContent());
obj1.setText(obj2);
req.setMsg(obj1);
OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(req, openAccess.getAccessToken());
getResult(rsp.getBody());
return true;
}
/**
* 发送阿里短信
* @param tid
* @param userId
*/
@SneakyThrows
public boolean SendAliSms(String tid,String userId){
String authUserId=getAuthUserId(userId,MsgType.aliyun);
MsgTemplate template=templateService.get(tid);
MsgOpenAccess openAccess =template.getOpenaccess();
String region=openAccess.getRegionId();
String accessKey=openAccess.getAccessKey();
String accessSecret=openAccess.getSecretKey();
DefaultProfile profile = DefaultProfile.getProfile(StringUtils.isEmpty(region)?"cn-hangzhou":region, accessKey, accessSecret);
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain(aliSmsDomain);
request.setSysAction(aliSmsAction);
request.putQueryParameter("RegionId", region);
request.putQueryParameter("PhoneNumbers", authUserId);
request.putQueryParameter("SignName", template.getTemplateName());
request.putQueryParameter("TemplateCode", template.getTemplateId());
request.putQueryParameter("TemplateParam", "");
client.getCommonResponse(request);
log.info(String.format("成功向用户[%s]发送一条短信!",authUserId));
return true;
}
/**
* 发送阿里邮件
* @param tid
* @param userId
*/
@SneakyThrows
public boolean sendAliEMail(String tid,String userId){
String authUserId=getAuthUserId(userId,MsgType.aliyun);
MsgTemplate template=templateService.get(tid);
MsgOpenAccess openAccess =template.getOpenaccess();
String region=openAccess.getRegionId();
String accessKey=openAccess.getAccessKey();
String accessSecret=openAccess.getSecretKey();
DefaultProfile profile = DefaultProfile.getProfile(StringUtils.isEmpty(region)?"cn-hangzhou":region, accessKey, accessSecret);
IAcsClient client = new DefaultAcsClient(profile);
SingleSendMailRequest request = new SingleSendMailRequest();
request.setAccountName(template.getTemplateId());
request.setAddressType(1);
request.setReplyToAddress(false);
request.setToAddress(authUserId);
request.setSubject(template.getTemplateName());
request.setHtmlBody(template.getContent());
client.getAcsResponse(request);
log.info(String.format("成功向用户[%s]发送一条邮件!",authUserId));
return true;
}
/**
* 发送微信消息
* @param tid
* @param userId
*/
public boolean sendWeChatMsg(String tid,String userId){
String authUserId=getAuthUserId(userId,MsgType.wechat);
MsgTemplate template=templateService.get(tid);
MsgOpenAccess openAccess =template.getOpenaccess();
Map paramMap=new HashMap();
paramMap.put("template_id",template.getTemplateId());
paramMap.put("touser",authUserId);
paramMap.put("data",new HashMap());
HttpEntity request = new HttpEntity(paramMap);
ResponseEntity<String> result = restTemplate.postForEntity(String.format(weChatSendMsgApi,openAccess.getAccessToken()), request , String.class);
getResult(result.getBody());
return true;
}
/**
* 获取第三方用户标识
* @param userId
* @return
*/
private String getAuthUserId(String userId,MsgType type){
QueryWrapper<MsgUserAccount> qw =new QueryWrapper();
qw.eq("userid",userId);
qw.eq("identity_type",type);
MsgUserAccount userAccount =userAccountService.getOne(qw);
if(userAccount==null || StringUtils.isEmpty(userAccount.getIdentifier()))
throw new BadRequestAlertException("未能获取到授权用户","NotifyCoreService","sendDingTalkMsg");
return userAccount.getIdentifier();
}
/**
* 解析接口返回结果
* @param result
*/
private void getResult(String result){
JSONObject resultJo = JSONObject.parseObject(result);
if(resultJo.containsKey("errcode") && resultJo.getInteger("errcode")!=0)
throw new BadRequestAlertException(String.format("发送消息失败,%s",resultJo.toString()),"","");
else
log.info("发送消息成功!");
}
/**
* 设置新token及过期时间
* @param openAccess
* @return
*/
public MsgOpenAccess refreshToken(MsgOpenAccess openAccess){
String tempToken=null;
switch (openAccess.getOpenType()){
case "wechat":
tempToken=getWeChatToken(openAccess.getId());
break;
case "dingtalk":
tempToken=getDingTalkToken(openAccess.getId());
break;
}
if(!StringUtils.isEmpty(tempToken)){
JSONObject objToken = JSONObject.parseObject(tempToken);
if(objToken!=null){
Calendar calendar =Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.SECOND,Integer.parseInt(objToken.getString("expires_in")));
Date date = calendar.getTime();
openAccess.setAccessToken(objToken.getString("access_token"));
openAccess.setExpiresTime(new Timestamp(date.getTime()));
}
}
return openAccess;
}
}
package cn.ibizlab.core.extensions.service;
import cn.ibizlab.core.notify.domain.MsgOpenAccess;
import cn.ibizlab.core.notify.service.IMsgOpenAccessService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 定时刷新token
*/
@Service
@Slf4j
public class RefreshTokenService{
@Autowired
IMsgOpenAccessService smsConfigService;
@Autowired
NotifyCoreService notifyCoreService;
@Scheduled(fixedRate = 1800000)
public void refreshToken() {
QueryWrapper<MsgOpenAccess> qw=new QueryWrapper();
qw.eq("disabled",0).isNotNull("access_key").isNotNull("secret_key").and(i -> i.eq("open_type","wechat").or().eq("open_type","dingtalk"));
List<MsgOpenAccess> accessList= smsConfigService.list(qw);
if(accessList.size()==0)
return ;
List<MsgOpenAccess> refreshAccessList=new ArrayList<>();
for(MsgOpenAccess openAccess : accessList){
String accessToken = openAccess.getAccessToken();
Timestamp expiresTime = openAccess.getExpiresTime();
if(StringUtils.isEmpty(accessToken)){
notifyCoreService.refreshToken(openAccess);
refreshAccessList.add(openAccess);
}
else{
if(expiresTime!=null && expiresTime.before(new Timestamp(new Date().getTime()))){
notifyCoreService.refreshToken(openAccess);
refreshAccessList.add(openAccess);
}
}
}
if(refreshAccessList.size()>0)
smsConfigService.updateBatch(refreshAccessList);
}
}
\ No newline at end of file
......@@ -89,6 +89,10 @@
<oracle.version>11.2.0.3</oracle.version>
<postgresql.version>42.2.6</postgresql.version>
<alibaba-dingtalk.version>1.0.1</alibaba-dingtalk.version>
<aliyun-sdk-core.version>4.5.4</aliyun-sdk-core.version>
<aliyun-sdk-ecs.version>4.19.6</aliyun-sdk-ecs.version>
<aliyun-sdk-dm.version>3.3.1</aliyun-sdk-dm.version>
</properties>
<dependencyManagement>
......@@ -270,6 +274,28 @@
<version>${baomidou-jobs.version}</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
<version>${alibaba-dingtalk.version}</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>${aliyun-sdk-core.version}</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-ecs</artifactId>
<version>${aliyun-sdk-ecs.version}</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dm</artifactId>
<version>${aliyun-sdk-dm.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
......@@ -349,8 +375,6 @@
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
package cn.ibizlab.api.rest.extensions;
import cn.ibizlab.core.extensions.service.NotifyCoreService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class NotifyCoreResource {
@Autowired
NotifyCoreService notifyCoreService;
@RequestMapping(method = RequestMethod.GET,value = "/sendDingTalkMsg")
public ResponseEntity<Boolean> sendDingTalkMsg(@Validated @RequestParam String tid, @RequestParam String userId){
return ResponseEntity.status(HttpStatus.OK).body(notifyCoreService.sendDingTalkMsg(tid,userId));
// return ResponseEntity.status(HttpStatus.OK).body(notifyCoreService.sendDingTalkMsg("6c2e3779dd159ceba3e70e7502f4cf6f","760fd9aae5bb9475cb4e18b80d689ea7"));
}
@RequestMapping(method = RequestMethod.GET,value = "/sendWeChatMsg")
public ResponseEntity<Boolean> sendWeChatMsg(@Validated @RequestParam String tid,@RequestParam String userId){
return ResponseEntity.status(HttpStatus.OK).body(notifyCoreService.sendWeChatMsg(tid,userId));
// return ResponseEntity.status(HttpStatus.OK).body(notifyCoreService.sendWeChatMsg("8ddcea1f2a9743f159bd765133443684","760fd9aae5bb9475cb4e18b80d689ea7"));
}
@RequestMapping(method = RequestMethod.GET,value = "/sendAliEMail")
public ResponseEntity<Boolean> sendAliEMail(@Validated @RequestParam String tid,@RequestParam String userId){
return ResponseEntity.status(HttpStatus.OK).body(notifyCoreService.sendAliEMail(tid,userId));
// return ResponseEntity.status(HttpStatus.OK).body(notifyCoreService.sendAliEMail("5f4c72e0eb1eb3cf5b57c319a021d5b9","760fd9aae5bb9475cb4e18b80d689ea7"));
}
@RequestMapping(method = RequestMethod.GET,value = "/SendAliSms")
public ResponseEntity<Boolean> SendAliSms(@Validated @RequestParam String tid,@RequestParam String userId){
return ResponseEntity.status(HttpStatus.OK).body(notifyCoreService.SendAliSms(tid,userId));
// return ResponseEntity.status(HttpStatus.OK).body(notifyCoreService.SendAliSms("Vufzr1HEvhntkIOK8HkT_poUTLAmpwSbjzK0ncOkSuw","18677074230"));
}
}
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册