多场景信息推送解决方案,只需一行代码即可发送消息到钉钉群、腾讯云短信、阿里云短信等。
一行代码实现发送消息到钉钉群
MessageContext messageContext = new SendMessageServiceImpl().singleSend(new DingTextMessage("abcdefghijk"));
在日常开发中,我们经常需要向多个渠道进行数据推送,例如:
- 发送xx消息到某个钉钉群
- 发送xx邮件到某个邮箱
- 发送xx短信给某个客户
- ...
作为开发者,我们不可避免的需要去查阅渠道方的技术文档,再根据文档去书写对应的代码,这是一件十分枯燥且繁琐的事情。
easy-push
项目的初衷,就是为了解决这个令人烦恼的问题。
序号 | 渠道 | 实体类 | 说明 |
---|---|---|---|
1 | 钉钉群文本消息 | DingTextMessage | 钉钉文本类消息 |
2 | 腾讯云短信(V3) | SmsTencentV3Message | 腾讯云短信 |
3 | 阿里云短信(V3) | SmsAliV3Message | 阿里云短信 |
参见:CHANGELOG
在classpath下新增加
easy-push.properties
文件
所有配置项目,都以cn.yang37.easy-push
开头,下方是一个示例的配置文件:
############### 钉钉消息
cn.yang37.easy-push.ding.base-url=https://oapi.dingtalk.com
cn.yang37.easy-push.ding.access-key=xxx
cn.yang37.easy-push.ding.secret=xxx
############### 腾讯云短信V3
cn.yang37.easy-push.sms.tencent-v3.base-url=https://sms.tencentcloudapi.com
cn.yang37.easy-push.sms.tencent-v3.region=ap-guangzhou
cn.yang37.easy-push.sms.tencent-v3.secret-id=xxx
cn.yang37.easy-push.sms.tencent-v3.secret-key=xxx
############### 阿里云短信V3
cn.yang37.easy-push.sms.ali-v3.base-url=https://dysmsapi.aliyuncs.com
cn.yang37.easy-push.sms.ali-v3.access-key-id=xxx
cn.yang37.easy-push.sms.ali-v3.access-key-secret=xxx
前缀 | 项 | 类型 | 说明 |
---|---|---|---|
ding | base-url | String | 钉钉推送服务的默认url,内网时可以是代理机地址。默认值为: https://oapi.dingtalk.com |
ding | access-key | String | 推送钉钉时的ak |
ding | secret | String | 推送钉钉时的sk |
############### 钉钉消息
cn.yang37.easy-push.ding.base-url=https://oapi.dingtalk.com
cn.yang37.easy-push.ding.access-key=xxx
cn.yang37.easy-push.ding.secret=xxx
实体类:DingTextMessage
字段名 | 含义 | 类型 | 说明 |
---|---|---|---|
text | 文本内容 | string | 发送到钉钉群的文本内容 |
构建实体类:
DingTextMessage message = new DingTextMessage("123456789");
前缀 | 项 | 类型 | 说明 |
---|---|---|---|
sms.tencent-v3 | base-url | String | 推送url,内网时可以是代理机地址。默认值为: https://sms.tencentcloudapi.com |
sms.tencent-v3 | region | String | 地域参数,用来标识希望操作哪个地域的数据。接口接受的地域取值参考接口文档中输入参数公共参数 Region 的说明。注意:某些接口不需要传递该参数,接口文档中会对此特别说明,此时即使传递该参数也不会生效。 参考:region字段 |
sms.tencent-v3 | secret-id | String | 在 云API密钥 上申请的标识身份的 SecretId,一个 SecretId 对应唯一的 SecretKey ,而 SecretKey 会用来生成请求签名 Signature。 |
sms.tencent-v3 | secret-key | String | 在 云API密钥 上申请的标识身份的 SecretId,一个 SecretId 对应唯一的 SecretKey ,而 SecretKey 会用来生成请求签名 Signature。 |
cn.yang37.easy-push.sms.tencent-v3.base-url=https://sms.tencentcloudapi.com
cn.yang37.easy-push.sms.tencent-v3.region=ap-guangzhou
cn.yang37.easy-push.sms.tencent-v3.secret-id=xxx
cn.yang37.easy-push.sms.tencent-v3.secret-key=xxx
实体类:SmsTencentV3Message
详情请参考腾讯云:发送短信
字段名 | 含义 | 类型 | 说明 |
---|---|---|---|
phoneNumberSet | 下发手机号码 | Array of String | 下发手机号码,采用 E.164 标准,格式为+[国家或地区码][手机号],单次请求最多支持200个手机号且要求全为境内手机号或全为境外手机号。 例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 注:发送国内短信格式还支持0086、86或无任何国家或地区码的11位手机号码,前缀默认为+86。 示例值:+8618511122233 |
smsSdkAppId | 短信 SdkAppId | String | 在 短信控制台 添加应用后生成的实际 SdkAppId,示例如1400006666。 示例值:1400006666 |
templateId | 模板 ID | String | 必须填写已审核通过的模板 ID。模板 ID 可前往 国内短信 或 国际/港澳台短信 的正文模板管理查看,若向境外手机号发送短信,仅支持使用国际/港澳台短信模板。 示例值:1110 |
signName | 短信签名内容 | String | 使用 UTF-8 编码,必须填写已审核通过的签名,例如:腾讯云,签名信息可前往 国内短信 或 国际/港澳台短信 的签名管理查看。 |
templateParamSet | 模板参数 | Array of String | 若无模板参数,则设置为空。 |
extendCode | 短信码号扩展号 | String | 默认未开通,如需开通请联系 腾讯云短信小助手。 示例值:12 |
sessionContext | 用户的 session 内容 | String | 可以携带用户侧 ID 等上下文信息,server 会原样返回。注意长度需小于512字节。 示例值:test |
senderId | 国内短信无需填写该项 | String | 国际/港澳台短信已申请独立 SenderId 需要填写该字段,默认使用公共 SenderId,无需填写该字段。 |
构建实体类:
SmsTencentV3Message smsTencentV3Message = SmsTencentV3Message.builder()
.phoneNumberSet(new String[]{"18712341234"})
.smsSdkAppId("1400xxxx")
.signName("yang37")
.templateId("xxxx")
.templateParamSet(new String[]{"123456"})
.sessionContext("SessionContext")
.build();
前缀 | 项 | 类型 | 说明 |
---|---|---|---|
sms.ali-v3 | base-url | String | 推送url,内网时可以是代理机地址。默认值为: https://dysmsapi.aliyuncs.com |
sms.ali-v3 | access-key-id | String | 访问控制台获取:AccessKey |
sms.ali-v3 | access-key-secret | String | 访问控制台获取:AccessKey |
cn.yang37.easy-push.sms.ali-v3.base-url=https://dysmsapi.aliyuncs.com
cn.yang37.easy-push.sms.ali-v3.access-key-id=xxx
cn.yang37.easy-push.sms.ali-v3.access-key-secret=xxx
实体类:SmsAliV3Message
详情请参考阿里云:发送短信
字段名 | 含义 | 类型 | 说明 |
---|---|---|---|
phoneNumbers | 接收短信的手机号码 | string | 支持对多个手机号码发送短信,手机号码之间以半角逗号(,)分隔。上限为 1000 个手机号码。批量调用相对于单条调用及时性稍有延迟。验证码类型短信,建议使用单独发送的方式。 |
SignName | 短信签名名称 | string | 您可以通过 AddSmsSign 接口添加签名或在短信服务控制台添加签名,签名通过审核后,才可使用签名名称。 |
TemplateCode | 短信模板 Code | string | 您可以通过 AddSmsTemplate 接口添加模板或在短信服务控制台添加模板,模板通过审核后,才可使用模板 Code。 |
TemplateParam | 短信模板变量对应的实际值 | string | 支持传入多个参数。{"name":"张三","number":"1390000****"} |
SmsUpExtendCode | 上行短信扩展码 | string | 上行短信指发送给通信服务提供商的短信,用于定制某种服务、完成查询,或是办理某种业务等,需要收费,按运营商普通短信资费进行扣费。 |
OutId | 外部流水扩展字段 | string | 无特殊需要可忽略此字段。 |
构建实体类:
SmsAliV3Message smsAliV3Message = SmsAliV3Message.builder()
.PhoneNumbers("18712341234")
.SignName("阿里云短信测试")
.TemplateCode("SMS_154950909")
.TemplateParam("{\"code\":\"1234\"}")
.build();
easy-push的理念,是在发送时传入不同的消息对象,通过内部自动映射逻辑,完成这个发送。
public interface SendMessageService {
/**
* 发送单条消息
*
* @param message .
* @return .
*/
MessageContext singleSend(Message message);
/**
* 发送多条消息 .
*
* @param messageList .
* @return .
*/
List<MessageContext> multipleSend(List<Message> messageList);
}
显而易见,这里的Message
是一个父类,在实际使用时,我们需要什么便传递进什么。
所以,现在我们需要关注的点只在于:
- 写好配置文件
- 构建好我们要发送的消息对象
之后,一切逻辑,都会由easy-push来帮你完成。
一行代码实现发送消息到钉钉群
MessageContext messageContext = new SendMessageServiceImpl().singleSend(new DingTextMessage("abcdefghijk"));
在Maven中央仓库查询最新版本:cn.yang37 » easy-push-app
<dependency>
<groupId>cn.yang37</groupId>
<artifactId>easy-push-app</artifactId>
<version>0.1.3</version>
</dependency>
# 推送钉钉的URL,eg: https://oapi.dingtalk.com
cn.yang37.easy-push.ding.base-url=https://oapi.dingtalk.com
# 从钉钉获取
cn.yang37.easy-push.ding.access-key=xx
# 从钉钉获取
cn.yang37.easy-push.ding.secret=xx
根据场景构建对应的信息实体
// 钉钉-文本类型消息
Message message = new DingTextMessage("123");
SendMessageService sendMessageService = new SendMessageServiceImpl();
// 传入message实体
MessageContext messageContext = sendMessageService.singleSend(message);
Boolean state = messageContext.getState();
@Service
public class MessageSenderService {
@Autowired
private SendMessageService sendMessageService;
public void sendDingMessage(String content) {
DingTextMessage message = new DingTextMessage(content);
MessageContext messageContext = sendMessageService.singleSend(message);
// state显示发送结果
Boolean state = messageContext.getState();
}
}
easy-push是我临时起意的一个项目,但是我觉得这个思路是不错的。
发送的逻辑总是千变万化的,实际业务开发中,看文档真的佷很很头疼。
如果有一群为爱发电的我们来写好这些烦人的逻辑,这样,大家实际开发时只用再关注于业务代码,能提高不少效率。
不过精力有限,总是搁置很久才来更新一次,项目目前并不是很强大,也缺失了很多功能。
如果你有什么想法,或者想参与进来,可以提issue
,也可以发邮件联系我yang37z@qq.com
。
嗯,也许好些年后,咱们的项目真的能帮助到许多人呢^ ^。