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

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

上级 2fdfdb16
...@@ -44,7 +44,7 @@ public class RefreshTokenAspect { ...@@ -44,7 +44,7 @@ public class RefreshTokenAspect {
*/ */
private void refreshToken(JoinPoint point){ private void refreshToken(JoinPoint point){
Object[] args = point.getArgs(); Object[] args = point.getArgs();
if (args.length > 0) { if (args.length > 0 && args[0] instanceof MsgOpenAccess) {
MsgOpenAccess msgOpenAccess = (MsgOpenAccess) args[0]; MsgOpenAccess msgOpenAccess = (MsgOpenAccess) args[0];
if(msgOpenAccess.getOpenType().equals("wechat") || msgOpenAccess.getOpenType().equals("dingtalk")){ if(msgOpenAccess.getOpenType().equals("wechat") || msgOpenAccess.getOpenType().equals("dingtalk")){
notifyCoreService.refreshToken(msgOpenAccess); notifyCoreService.refreshToken(msgOpenAccess);
......
package cn.ibizlab.core.extensions.domain;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.Map;
@Data
public class Msg {
@NotBlank(message="系统标识不能为空")
private String system;
@NotBlank(message="模板标识不能为空")
private String templateid;
@NotBlank(message="模板类型不能为空")
private String msgtypes;
@NotBlank(message="用户标识不能为空")
private String userids;
private Map templparams;
}
package cn.ibizlab.core.extensions.domain;
import com.alibaba.fastjson.JSONArray;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class Template {
@NotBlank(message="系统标识不能为空")
private String system;
@NotNull(message="模板不能为空")
private JSONArray template;
@NotBlank(message="模板类型不能为空")
private String templtypes;
}
package cn.ibizlab.core.extensions.service; package cn.ibizlab.core.extensions.service;
import cn.ibizlab.core.extensions.domain.Msg;
import cn.ibizlab.core.extensions.domain.Template;
import cn.ibizlab.core.notify.domain.MsgOpenAccess; import cn.ibizlab.core.notify.domain.MsgOpenAccess;
import cn.ibizlab.core.notify.domain.MsgTemplate; import cn.ibizlab.core.notify.domain.MsgTemplate;
import cn.ibizlab.core.notify.domain.MsgUserAccount; import cn.ibizlab.core.notify.domain.MsgUserAccount;
...@@ -7,10 +9,12 @@ import cn.ibizlab.core.notify.service.IMsgOpenAccessService; ...@@ -7,10 +9,12 @@ import cn.ibizlab.core.notify.service.IMsgOpenAccessService;
import cn.ibizlab.core.notify.service.IMsgTemplateService; import cn.ibizlab.core.notify.service.IMsgTemplateService;
import cn.ibizlab.core.notify.service.IMsgUserAccountService; import cn.ibizlab.core.notify.service.IMsgUserAccountService;
import cn.ibizlab.util.errors.BadRequestAlertException; import cn.ibizlab.util.errors.BadRequestAlertException;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest; import com.aliyuncs.CommonRequest;
import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient; import com.aliyuncs.IAcsClient;
import com.aliyuncs.dm.model.v20151123.BatchSendMailRequest;
import com.aliyuncs.dm.model.v20151123.SingleSendMailRequest; import com.aliyuncs.dm.model.v20151123.SingleSendMailRequest;
import com.aliyuncs.http.MethodType; import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.DefaultProfile;
...@@ -30,12 +34,8 @@ import org.springframework.http.ResponseEntity; ...@@ -30,12 +34,8 @@ import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.Calendar; import java.util.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Service @Service
@Slf4j @Slf4j
...@@ -62,9 +62,17 @@ public class NotifyCoreService { ...@@ -62,9 +62,17 @@ public class NotifyCoreService {
*/ */
private final String aliSmsDomain="dysmsapi.aliyuncs.com"; private final String aliSmsDomain="dysmsapi.aliyuncs.com";
/** /**
* 阿里短信服务方法名 * 阿里短信服务单处理行为
*/
private final String aliSendSmsAction="SendSms";
/**
* 阿里短信服批处理行为
*/
private final String aliSendBatchSmsAction="SendBatchSms";
/**
* 阿里邮件批处理行为
*/ */
private final String aliSmsAction="SendSms"; private final String aliBatchSendMailAction="BatchSendMail";
/** /**
* 消息类型 * 消息类型
*/ */
...@@ -79,7 +87,7 @@ public class NotifyCoreService { ...@@ -79,7 +87,7 @@ public class NotifyCoreService {
RestTemplate restTemplate; RestTemplate restTemplate;
@Autowired @Autowired
@Lazy @Lazy
IMsgOpenAccessService smsConfigService; IMsgOpenAccessService openAccessService;
@Autowired @Autowired
@Lazy @Lazy
IMsgTemplateService templateService; IMsgTemplateService templateService;
...@@ -89,12 +97,11 @@ public class NotifyCoreService { ...@@ -89,12 +97,11 @@ public class NotifyCoreService {
/** /**
* 获取钉钉token * 获取钉钉token
* @param accessId * @param openAccess
* @return * @return
*/ */
@SneakyThrows @SneakyThrows
public String getDingTalkToken(String accessId){ public String getDingTalkToken(MsgOpenAccess openAccess){
MsgOpenAccess openAccess=smsConfigService.get(accessId);
String accessKey=openAccess.getAccessKey(); String accessKey=openAccess.getAccessKey();
String accessSecret=openAccess.getSecretKey(); String accessSecret=openAccess.getSecretKey();
DingTalkClient client = new DefaultDingTalkClient(dingTalkTokenApi); DingTalkClient client = new DefaultDingTalkClient(dingTalkTokenApi);
...@@ -109,11 +116,10 @@ public class NotifyCoreService { ...@@ -109,11 +116,10 @@ public class NotifyCoreService {
/** /**
* 获取微信token * 获取微信token
* @param accessId * @param openAccess
* @return * @return
*/ */
public String getWeChatToken(String accessId){ public String getWeChatToken(MsgOpenAccess openAccess){
MsgOpenAccess openAccess=smsConfigService.get(accessId);
String accessKey=openAccess.getAccessKey(); String accessKey=openAccess.getAccessKey();
String accessSecret=openAccess.getSecretKey(); String accessSecret=openAccess.getSecretKey();
ResponseEntity<String> result = restTemplate.getForEntity(String.format(weChatGetTokenApi,accessKey,accessSecret), String.class); ResponseEntity<String> result = restTemplate.getForEntity(String.format(weChatGetTokenApi,accessKey,accessSecret), String.class);
...@@ -127,7 +133,7 @@ public class NotifyCoreService { ...@@ -127,7 +133,7 @@ public class NotifyCoreService {
* @param userId * @param userId
*/ */
@SneakyThrows @SneakyThrows
public boolean sendDingTalkMsg(String tid,String userId){ private boolean sendDingTalkMsg(String tid,String userId){
String authUserId=getAuthUserId(userId,MsgType.dingtalk); String authUserId=getAuthUserId(userId,MsgType.dingtalk);
MsgTemplate template=templateService.get(tid); MsgTemplate template=templateService.get(tid);
MsgOpenAccess openAccess =template.getOpenaccess(); MsgOpenAccess openAccess =template.getOpenaccess();
...@@ -152,7 +158,7 @@ public class NotifyCoreService { ...@@ -152,7 +158,7 @@ public class NotifyCoreService {
* @param userId * @param userId
*/ */
@SneakyThrows @SneakyThrows
public boolean SendAliSms(String tid,String userId){ private boolean sendAliSms(String tid,String userId,Map templParams){
String authUserId=getAuthUserId(userId,MsgType.aliyun); String authUserId=getAuthUserId(userId,MsgType.aliyun);
MsgTemplate template=templateService.get(tid); MsgTemplate template=templateService.get(tid);
MsgOpenAccess openAccess =template.getOpenaccess(); MsgOpenAccess openAccess =template.getOpenaccess();
...@@ -164,14 +170,25 @@ public class NotifyCoreService { ...@@ -164,14 +170,25 @@ public class NotifyCoreService {
CommonRequest request = new CommonRequest(); CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST); request.setSysMethod(MethodType.POST);
request.setSysDomain(aliSmsDomain); request.setSysDomain(aliSmsDomain);
request.setSysAction(aliSmsAction); if(authUserId.contains(",")){
request.putQueryParameter("RegionId", region); request.setSysAction(aliSendBatchSmsAction);
request.putQueryParameter("PhoneNumbers", authUserId); request.putQueryParameter("RegionId", region);
request.putQueryParameter("SignName", template.getTemplateName()); request.putQueryParameter("PhoneNumbers", Arrays.asList(authUserId.split(",")).toString());
request.putQueryParameter("TemplateCode", template.getTemplateId()); request.putQueryParameter("SignName", Arrays.asList(template.getTemplateName().split(",")).toString());
request.putQueryParameter("TemplateParam", ""); request.putQueryParameter("TemplateCode", template.getTemplateId());
client.getCommonResponse(request); request.putQueryParameter("TemplateParam", templParams.toString());
log.info(String.format("成功向用户[%s]发送一条短信!",authUserId)); client.getCommonResponse(request);
}
else{
request.setSysAction(aliSendSmsAction);
request.putQueryParameter("RegionId", region);
request.putQueryParameter("PhoneNumbers", authUserId);
request.putQueryParameter("SignName", template.getTemplateName());
request.putQueryParameter("TemplateCode", template.getTemplateId());
request.putQueryParameter("TemplateParam", templParams.toString());
client.getCommonResponse(request);
}
log.info(String.format("成功向用户[%s]发送一条短信",authUserId));
return true; return true;
} }
...@@ -181,7 +198,8 @@ public class NotifyCoreService { ...@@ -181,7 +198,8 @@ public class NotifyCoreService {
* @param userId * @param userId
*/ */
@SneakyThrows @SneakyThrows
public boolean sendAliEMail(String tid,String userId){ private boolean sendAliEMail(String tid,String userId){
String authUserId=getAuthUserId(userId,MsgType.aliyun); String authUserId=getAuthUserId(userId,MsgType.aliyun);
MsgTemplate template=templateService.get(tid); MsgTemplate template=templateService.get(tid);
MsgOpenAccess openAccess =template.getOpenaccess(); MsgOpenAccess openAccess =template.getOpenaccess();
...@@ -190,31 +208,43 @@ public class NotifyCoreService { ...@@ -190,31 +208,43 @@ public class NotifyCoreService {
String accessSecret=openAccess.getSecretKey(); String accessSecret=openAccess.getSecretKey();
DefaultProfile profile = DefaultProfile.getProfile(StringUtils.isEmpty(region)?"cn-hangzhou":region, accessKey, accessSecret); DefaultProfile profile = DefaultProfile.getProfile(StringUtils.isEmpty(region)?"cn-hangzhou":region, accessKey, accessSecret);
IAcsClient client = new DefaultAcsClient(profile); IAcsClient client = new DefaultAcsClient(profile);
SingleSendMailRequest request = new SingleSendMailRequest();
request.setAccountName(template.getTemplateId()); if(authUserId.contains(",")){
request.setAddressType(1); BatchSendMailRequest request = new BatchSendMailRequest();
request.setReplyToAddress(false); request.setTemplateName(template.getTemplateName());
request.setToAddress(authUserId); request.setAccountName(template.getTemplateId());
request.setSubject(template.getTemplateName()); request.setReceiversName(authUserId);
request.setHtmlBody(template.getContent()); request.setAddressType(1);
client.getAcsResponse(request); request.setActionName(aliBatchSendMailAction);
log.info(String.format("成功向用户[%s]发送一条邮件!",authUserId)); }
else{
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; return true;
} }
/** /**
* 发送微信消息 * 发送微信消息
* @param tid * @param tid
* @param userId * @param userId
*/ */
public boolean sendWeChatMsg(String tid,String userId){ private boolean sendWeChatMsg(String tid,String userId,Map templParams){
String authUserId=getAuthUserId(userId,MsgType.wechat); String authUserId=getAuthUserId(userId,MsgType.wechat);
MsgTemplate template=templateService.get(tid); MsgTemplate template=templateService.get(tid);
MsgOpenAccess openAccess =template.getOpenaccess(); MsgOpenAccess openAccess =template.getOpenaccess();
Map paramMap=new HashMap(); Map paramMap=new HashMap();
paramMap.put("template_id",template.getTemplateId()); paramMap.put("template_id",template.getTemplateId());
paramMap.put("touser",authUserId); paramMap.put("touser",authUserId);
paramMap.put("data",new HashMap()); paramMap.put("data",templParams);
HttpEntity request = new HttpEntity(paramMap); HttpEntity request = new HttpEntity(paramMap);
ResponseEntity<String> result = restTemplate.postForEntity(String.format(weChatSendMsgApi,openAccess.getAccessToken()), request , String.class); ResponseEntity<String> result = restTemplate.postForEntity(String.format(weChatSendMsgApi,openAccess.getAccessToken()), request , String.class);
getResult(result.getBody()); getResult(result.getBody());
...@@ -228,13 +258,29 @@ public class NotifyCoreService { ...@@ -228,13 +258,29 @@ public class NotifyCoreService {
*/ */
private String getAuthUserId(String userId,MsgType type){ private String getAuthUserId(String userId,MsgType type){
QueryWrapper<MsgUserAccount> qw =new QueryWrapper(); QueryWrapper<MsgUserAccount> qw =new QueryWrapper();
qw.eq("userid",userId);
qw.eq("identity_type",type); qw.eq("identity_type",type);
MsgUserAccount userAccount =userAccountService.getOne(qw); if(userId.contains(",")){
if(userAccount==null || StringUtils.isEmpty(userAccount.getIdentifier())) qw.in("userid",userId.split(","));
throw new BadRequestAlertException("未能获取到授权用户","NotifyCoreService","sendDingTalkMsg"); List<MsgUserAccount> userAccounts =userAccountService.list(qw);
if(userAccounts==null || userAccounts.size()==0)
throw new BadRequestAlertException("未能获取到授权用户","NotifyCoreService","sendDingTalkMsg");
return userAccount.getIdentifier(); StringBuffer authUserIds=new StringBuffer();
for(MsgUserAccount userAccount: userAccounts){
if(StringUtils.isEmpty(authUserIds.toString())){
authUserIds.append(userAccount.getIdentifier());
}else{
authUserIds.append(","+userAccount.getIdentifier());
}
}
return authUserIds.toString();
}else{
qw.eq("userid",userId);
MsgUserAccount userAccount =userAccountService.getOne(qw);
if(userAccount==null || StringUtils.isEmpty(userAccount.getIdentifier()))
throw new BadRequestAlertException("未能获取到授权用户","NotifyCoreService","sendDingTalkMsg");
return userAccount.getIdentifier();
}
} }
/** /**
...@@ -246,7 +292,7 @@ public class NotifyCoreService { ...@@ -246,7 +292,7 @@ public class NotifyCoreService {
if(resultJo.containsKey("errcode") && resultJo.getInteger("errcode")!=0) if(resultJo.containsKey("errcode") && resultJo.getInteger("errcode")!=0)
throw new BadRequestAlertException(String.format("发送消息失败,%s",resultJo.toString()),"",""); throw new BadRequestAlertException(String.format("发送消息失败,%s",resultJo.toString()),"","");
else else
log.info("发送消息成功!"); log.info("发送消息成功");
} }
/** /**
...@@ -258,10 +304,10 @@ public class NotifyCoreService { ...@@ -258,10 +304,10 @@ public class NotifyCoreService {
String tempToken=null; String tempToken=null;
switch (openAccess.getOpenType()){ switch (openAccess.getOpenType()){
case "wechat": case "wechat":
tempToken=getWeChatToken(openAccess.getId()); tempToken=getWeChatToken(openAccess);
break; break;
case "dingtalk": case "dingtalk":
tempToken=getDingTalkToken(openAccess.getId()); tempToken=getDingTalkToken(openAccess);
break; break;
} }
if(!StringUtils.isEmpty(tempToken)){ if(!StringUtils.isEmpty(tempToken)){
...@@ -277,4 +323,83 @@ public class NotifyCoreService { ...@@ -277,4 +323,83 @@ public class NotifyCoreService {
} }
return openAccess; return openAccess;
} }
/**
* 创建模板
* @param template
* @return
*/
public boolean createMsgTemplate(Template template){
String system=template.getSystem() ;
JSONArray templates = template.getTemplate();
String templateTypes=template.getTempltypes();
for(int a=0;a<templates.size();a++){
List<MsgOpenAccess> openAccesses=new ArrayList<>();
List<MsgTemplate> msgTemplates=new ArrayList<>();
for(String templateType : templateTypes.split(",")){
//创建消息平台
MsgOpenAccess openAccess=openAccessService.getById(system+templateType);
if(openAccess==null)
{
openAccess=new MsgOpenAccess();
openAccess.setId(system+templateType);
openAccess.setName(templateType);
openAccess.setDisabled(0);
openAccess.setOpenType(templateType);
openAccesses.add(openAccess);
}
//创建消息模板
MsgTemplate msgTemplate =JSONObject.toJavaObject(templates.getJSONObject(a),MsgTemplate.class);
msgTemplate.setAccessId(openAccess.getId());
msgTemplate.setOpenType(templateType);
msgTemplate.setTemplateType(templateType);
msgTemplate.setTid(system+msgTemplate.getTid()+templateType);
msgTemplates.add(msgTemplate);
}
if(openAccesses.size()>0)
openAccessService.saveOrUpdateBatch(openAccesses);
if(msgTemplates.size()>0)
templateService.saveOrUpdateBatch(msgTemplates);
}
return true;
}
/**
* 发送消息
* @param msg
* @return
*/
public boolean sendMsg(Msg msg){
String system = msg.getSystem();
String templateId =msg.getTemplateid();
String msgTypes=msg.getMsgtypes();
String userIds=msg.getUserids();
Map templParams=msg.getTemplparams();
for(String msgType:msgTypes.split(",")){
MsgTemplate msgTemplate=templateService.getById(system+templateId+msgType);
if(msgTemplate==null){
throw new BadRequestAlertException(String.format("发送消息失败,无法获取到[%s]对应的rt模板",templateId),"","");
}
else{
switch(msgType){
case "aliyun-sms":
sendAliSms(msgTemplate.getTid(),userIds,templParams);
break;
case "aliyun-email":
sendAliEMail(msgTemplate.getTid(),userIds);
break;
case "dingtalk":
sendDingTalkMsg(msgTemplate.getTid(),userIds);
break;
case "wechat":
sendWeChatMsg(msgTemplate.getTid(),userIds,templParams);
break;
default:
throw new BadRequestAlertException(String.format("发送消息失败,尚未提供[%s]类型对应的消息服务",msgType),"","");
}
}
}
return true;
}
} }
package cn.ibizlab.api.rest.extensions; package cn.ibizlab.api.rest.extensions;
import cn.ibizlab.core.extensions.domain.Msg;
import cn.ibizlab.core.extensions.domain.Template;
import cn.ibizlab.core.extensions.service.NotifyCoreService; import cn.ibizlab.core.extensions.service.NotifyCoreService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
public class NotifyCoreResource { public class NotifyCoreResource {
...@@ -16,28 +15,13 @@ public class NotifyCoreResource { ...@@ -16,28 +15,13 @@ public class NotifyCoreResource {
@Autowired @Autowired
NotifyCoreService notifyCoreService; NotifyCoreService notifyCoreService;
@RequestMapping(method = RequestMethod.GET,value = "/sendDingTalkMsg") @RequestMapping(method = RequestMethod.POST,value = "/SendMsg")
public ResponseEntity<Boolean> sendDingTalkMsg(@Validated @RequestParam String tid, @RequestParam String userId){ public ResponseEntity<Boolean> SendMsg(@Validated @RequestBody Msg msg){
return ResponseEntity.status(HttpStatus.OK).body(notifyCoreService.sendDingTalkMsg(tid,userId)); return ResponseEntity.status(HttpStatus.OK).body(notifyCoreService.sendMsg(msg));
// return ResponseEntity.status(HttpStatus.OK).body(notifyCoreService.sendDingTalkMsg("6c2e3779dd159ceba3e70e7502f4cf6f","760fd9aae5bb9475cb4e18b80d689ea7"));
} }
@RequestMapping(method = RequestMethod.GET,value = "/sendWeChatMsg") @RequestMapping(method = RequestMethod.POST,value = "/createMsgTemplate")
public ResponseEntity<Boolean> sendWeChatMsg(@Validated @RequestParam String tid,@RequestParam String userId){ public ResponseEntity<Boolean> createMsgTemplate(@Validated @RequestBody Template template){
return ResponseEntity.status(HttpStatus.OK).body(notifyCoreService.sendWeChatMsg(tid,userId)); return ResponseEntity.status(HttpStatus.OK).body(notifyCoreService.createMsgTemplate(template));
// 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 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册