# 短信云服务
# 阿里云短信
# 简介
阿里云通信(原名阿里大于),是阿里云旗下产品,融合了三大运营商的通信能力,通过将传统通信业务和能力与互联网相结合,创新融合阿里巴巴生态内容,全力为中小企业和开发者提供优质服务阿里大于提供包括短信、语音、流量直充、私密专线、店铺手机号等个性化服务。通过阿里大于打通三大运营商通信能力,全面融合阿里巴巴 生态,以开放API及SDK的方式向开发者提供通信和数据服务,更好地支撑企业业务发展和创新服务。
# 前期准备
(1)在阿里云官网 https://www.aliyun.com/ 注册账号 (2)手机下载「阿里云」APP,完成实名认证 (3)登录阿里云,产品中选择「短信服务」
(4)申请签名(选择验证码类型)
(5)申请模板
(6)创建 accessKey (注意保密!)
(7)充值 (没必要充太多,1至2元足矣)
# 开发步骤
(1)创建工程,引入依赖
<!--阿里云短信服务SDK-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.9</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.1.0</version>
</dependency>
2
3
4
5
6
7
8
9
10
11
(2)创建测试类
注意:将其中的 accessKeyId、accessKeySecret 、phone(手机号)、signName(签名)、templateCode(模板)、templateParam(模板参数)、outId(额外参数) 替换成自己的配置后,就可以运行代码了。
package com.devclub.crays.module.sms.util;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.*;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 短信API产品的DEMO程序,执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可)
* <br>
* <br>
* 备注:当前Demo工程编码采用UTF-8,国际短信发送请勿参照此DEMO
*
* @author: RyuZheng
* @date: 2020.01.14
*/
public class AliSmsDemo {
/** 产品名称:短信API产品名称,开发者无需替换 */
static final String product = "Dysmsapi";
/** 产品域名:开发者无需替换 */
static final String domain = "dysmsapi.aliyuncs.com";
// TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
/** accessKeyId */
static final String accessKeyId = "your_accessKeyId";
/** accessKeySecret */
static final String accessKeySecret = "your_accessKeySecret";
/**
* 初始化acsClient实例
*
* @return
* @throws ClientException
*/
public static IAcsClient aliSmsClient() throws ClientException {
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", product, domain);
//可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
return new DefaultAcsClient(profile);
}
/**
* 发送短信。详情https://help.aliyun.com/document_detail/55284.html?spm=a2c4g.11186623.6.647.71163520UlAX5d
*
* @param phone 待发送手机号
* @param signName 短信签名-可在短信控制台中找到
* @param templateCode 短信模板-可在短信控制台中找到
* @param templateParam 模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时
* @param outId outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
* @return SendSmsResponse
* @throws ClientException
*/
public static SendSmsResponse sendSms(String phone, String signName, String templateCode, String templateParam, String outId) throws ClientException {
//初始化acsClient,暂不支持region化
IAcsClient acsClient = aliSmsClient();
//组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
//必填:待发送手机号
request.setPhoneNumbers(phone);
//必填:短信签名-可在短信控制台中找到
request.setSignName(signName);
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(templateCode);
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam(templateParam);
//选填-上行短信扩展码(无特殊需求用户请忽略此字段)
//request.setSmsUpExtendCode("90997");
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.setOutId(outId);
//hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
return sendSmsResponse;
}
/**
* 批量发送。详情https://help.aliyun.com/document_detail/66041.html
*
* @param phoneNumberJson 短信接收号码,JSON格式,批量上限为100个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
* @param signNameJson 短信签名,JSON格式
* @param templateCode 短信模板ID
* @param templateParamJson 短信模板变量替换JSON串,友情提示:如果JSON中需要带换行符,请参照标准的JSON协议。
* @return SendBatchSmsResponse
* @throws ClientException
*/
public static SendBatchSmsResponse sendBatchSms(String phoneNumberJson, String signNameJson, String templateCode, String templateParamJson) throws ClientException {
SendBatchSmsRequest request = new SendBatchSmsRequest();
request.setPhoneNumberJson(phoneNumberJson);
request.setSignNameJson(signNameJson);
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(templateCode);
request.setTemplateParamJson(templateParamJson);
IAcsClient acsClient = aliSmsClient();
return acsClient.getAcsResponse(request);
}
/**
* 查询发送的短信。https://help.aliyun.com/document_detail/55289.html?spm=a2c4g.11186623.6.648.72a53144NTp88y
*
* @param bizId 可选-流水号
* @param phone 必填-号码
* @param sendDate 短信发送日期格式yyyyMMdd,支持最近30天记录查询
* @param pageSize 必填-页大小
* @param currentPage 必填-当前页码从1开始计数
* @return QuerySendDetailsResponse
* @throws ClientException
*/
public static QuerySendDetailsResponse querySendDetails(String bizId, String phone, String sendDate, long pageSize, long currentPage) throws ClientException {
IAcsClient acsClient = aliSmsClient();
//组装请求对象
QuerySendDetailsRequest request = new QuerySendDetailsRequest();
//必填-号码
request.setPhoneNumber(phone);
//可选-流水号
request.setBizId(bizId);
//必填-发送日期 支持30天内记录查询,格式yyyyMMdd
request.setSendDate(sendDate);
//必填-页大小
request.setPageSize(pageSize);
//必填-当前页码从1开始计数
request.setCurrentPage(currentPage);
//hint 此处可能会抛出异常,注意catch
QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
return querySendDetailsResponse;
}
public static void main(String[] args) throws InterruptedException, ClientException {
//===========================
//准备参数
//===========================
String phone = "1853825****";
String signName = "极简之家";
String templateCode = "SMS_186941157";
String templateParam = "{\"code\":\"123456\"}";
String outId = "yourOutId";
SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
String sendDate = ft.format(new Date());
long pageSize = 10L;
long currentPage = 1L;
//===========================
//发送短信
//===========================
SendSmsResponse response = sendSms(phone, signName, templateCode, templateParam, outId);
System.out.println("短信接口返回的数据----------------");
System.out.println("Code=" + response.getCode());
System.out.println("Message=" + response.getMessage());
System.out.println("RequestId=" + response.getRequestId());
System.out.println("BizId=" + response.getBizId());
Thread.sleep(3000L);
//===========================
//查询明细
//===========================
if(response.getCode() != null && response.getCode().equals("OK")) {
QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(response.getBizId(), phone, sendDate, pageSize, currentPage);
System.out.println("短信明细查询接口返回数据----------------");
System.out.println("Code=" + querySendDetailsResponse.getCode());
System.out.println("Message=" + querySendDetailsResponse.getMessage());
int i = 0;
for(QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs())
{
System.out.println("SmsSendDetailDTO["+i+"]:");
System.out.println("Content=" + smsSendDetailDTO.getContent());
System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode());
System.out.println("OutId=" + smsSendDetailDTO.getOutId());
System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum());
System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());
System.out.println("SendDate=" + smsSendDetailDTO.getSendDate());
System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus());
System.out.println("Template=" + smsSendDetailDTO.getTemplateCode());
}
System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount());
System.out.println("RequestId=" + querySendDetailsResponse.getRequestId());
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# 腾讯云短信
# 简介
腾讯云短信(Short Message Service,SMS)沉淀腾讯十多年短信服务技术和经验,为 QQ、微信等亿级平台和10万+客户提供国内短信和国际/港澳台短信服务。国内短信验证秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,稳定可靠。腾讯云短信旨在帮助广大开发者快速灵活接入高质量的文本、国际/港澳台短信服务。
# 前期准备
(1)在腾讯云官网 https://cloud.tencent.com/ 注册账号 (2)完成实名认证,可以参考文档 https://cloud.tencent.com/document/product/378/10495 。
认证模式不同,短信使用的权益也有所不同,具体可以看下图:
(3)登录腾讯云,产品中选择「短信」,也可以直接通过产品网址 https://cloud.tencent.com/product/sms 进入到 短信SMS 产品页,开通短信服务
(4)申请签名(选择验证码类型)
(5)申请模板
(6)获取SDK AppID和AppKey (注意保密!)
云短信应用SDK AppID
和AppKey
可在短信控制台 (opens new window)的应用信息里获取,如您尚未添加应用,请到短信控制台 (opens new window)中添加应用。
# 开发步骤
(1)创建工程,引入依赖
<!--腾讯云短信服务SDK-->
<dependency>
<groupId>com.github.qcloudsms</groupId>
<artifactId>qcloudsms</artifactId>
<version>1.0.6</version>
</dependency>
2
3
4
5
6
(2)创建测试类
Java SDK 使用指南:https://cloud.tencent.com/document/product/382/13613
package com.devclub.crays.module.sms.util;
import com.github.qcloudsms.SmsMultiSender;
import com.github.qcloudsms.SmsMultiSenderResult;
import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import com.github.qcloudsms.httpclient.HTTPException;
import org.json.JSONException;
import java.io.IOException;
/**
* Description: 腾讯云短信
*
* @author: RyuZheng
* @date: 2020.03.30
*/
public class QcloudSmsDemo {
public static void main(String[] args) {
//****************************************
//准备必要参数
//****************************************
// 短信应用 SDK AppID,SDK AppID 以1400开头
int appid = 1400009099;
// 短信应用 SDK AppKey
String appkey = "9ff91d87c2cd7cd0ea762f141975d1df37481d48700d70ac37470aef";
// 需要发送短信的手机号码
String[] phoneNumbers = {"18538195006", "12345678902", "12345678903"};
// 短信模板 ID,需要在短信应用中申请。NOTE: 这里的模板 ID`7839`只是示例,真实的模板 ID 需要在短信控制台中申请
int templateId = 7839;
// 签名 NOTE: 签名参数使用的是`签名内容`,而不是`签名ID`。这里的签名"腾讯云"只是示例,真实的签名需要在短信控制台申请
String smsSign = "腾讯云";
// 模板参数
String[] params = {"5678"};
//指定模板ID单发短信
sendSmsSingle(appid, appkey, phoneNumbers[0], templateId, smsSign, params);
//指定模板ID群发短信
sendSmsMulti(appid, appkey, phoneNumbers, templateId, smsSign, params);
}
/**
* <p>指定模板ID单发短信</p>
* 注意:无论单发/群发短信还是指定模板ID单发/群发短信都需要从控制台中申请模板并且模板已经审核通过,才可能下发成功,否则返回失败。
*
* @param appid 短信应用 SDK AppID
* @param appkey 短信应用 SDK AppKey
* @param phoneNumber 需要发送短信的手机号码
* @param templateId 短信模板 ID
* @param smsSign 签名
* @param params 模板参数
*/
public static void sendSmsSingle(int appid, String appkey, String phoneNumber, int templateId, String smsSign, String[] params){
try {
SmsSingleSender singleSender = new SmsSingleSender(appid, appkey);
// 签名不能为空串
SmsSingleSenderResult result = singleSender.sendWithParam("86", phoneNumber, templateId, params, smsSign, "", "");
System.out.println(result);
} catch (HTTPException e) {
// HTTP响应码错误
e.printStackTrace();
} catch (JSONException e) {
// json解析错误
e.printStackTrace();
} catch (IOException e) {
// 网络IO错误
e.printStackTrace();
}
}
/**
* <p>指定模板ID群发短信</p>
* Note 群发一次请求最多支持200个号码,如有对号码数量有特殊需求请联系腾讯云短信技术支持(QQ:3012203387)。 Note 无论单发/群发短信还是指定模板ID单发/群发短信都需要从控制台中申请模板并且模板已经审核通过,才可能下发成功,否则返回失败。
*
* @param appid 短信应用 SDK AppID
* @param appkey 短信应用 SDK AppKey
* @param phoneNumbers 需要发送短信的手机号码
* @param templateId 短信模板 ID
* @param smsSign 签名
* @param params 模板参数
*/
public static void sendSmsMulti(int appid, String appkey, String[] phoneNumbers, int templateId, String smsSign, String[] params){
try {
SmsMultiSender multiSender = new SmsMultiSender(appid, appkey);
// 签名不能为空串
SmsMultiSenderResult result = multiSender.sendWithParam("86", phoneNumbers, templateId, params, smsSign, "", "");
System.out.println(result);
} catch (HTTPException e) {
// HTTP响应码错误
e.printStackTrace();
} catch (JSONException e) {
// json解析错误
e.printStackTrace();
} catch (IOException e) {
// 网络IO错误
e.printStackTrace();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# 七牛云短信
# 简介
云短信服务SMS(Short Message Service,SMS)是七牛云为用户提供的一种通信服务,支持向国内和国际/港澳台快速发送验证码、短信通知和营销推广短信,服务范围覆盖全球 200 多个国家和地区。
七牛云短信服务国内短信支持三网合一专属通道,移动、联通、电信网全覆盖,充分满足跨网发送的需求,实时监控自动切换,到达率高达99%。
产品功能
云短信服务当前支持的功能如下表所示:
功能 | 介绍 |
---|---|
验证码短信 | 支持发送验证码类短信,满足用户登入、信息变更、用户注册、身份验证、找回密码、异常登入等常见的业务场景。 |
通知类短信 | 支持发送提醒类通知短信,如物流快递、旅游航空、餐饮、电子商务、招聘信息、售后服务状态更新等场景。 |
营销推广类短信 | 可发送营销推广类短信,支持高并发批量发送,可以满足会员生日、客户关怀、节日祝福、线上线下打折促销、业务推广、新品上线、客户维系等场景。 |
国际/港澳台 | 七牛云短信服务覆盖全球 200 多个国家及地区,为企业海外市场业务拓展增值。 |
语音短信 | 提供语音短信功能, 是文本短信的强力补充。 |
智能调度 | 七牛短信服务平台融合多家专属运营商,多通道智能调度,轻松应对业务高峰。 |
API 接入 | 提供详尽短信接入文档,支持 GO, Ruby, Python, Java 等语言的 SDK 和 API 接入。 |
数据统计 | 丰富的数据统计,包含但不限于请求量、发送成功量、失败量等统计数据。 |
批量发送 | 通过控制台即可批量发送短信,无需研发投入。 |
产品优势
特性 | 介绍 |
---|---|
三网合一 全球覆盖 | 国内移动、联通、电信网全覆盖,充分满足跨网发送的需求。国际短信服务覆盖全球 200 多个国家和地区,秒级送达全球。 |
快速稳定 | 国内短信三网合一专属通道,快速直达,链接用户仅需 3-5 秒到达。专线机房,支持大容量、高并发,99% 超高到达率。电信级运维保障,实时监控自动切换。 |
高并发处理 | 支持多个生产者和消费者并发访问同一个队列,无需特殊设置即可自由调整并发度。确保某条消息在取出之后的特定时间段内,无法被其他消费者获得。在保证号码及终端质量的前提下,多通道智能调度保障发送,3-5 秒到达率 99% 以上。 |
智能监控调度 | 七牛短信服务平台融合多家专属运营商,多通道智能调度,轻松应对业务高峰。电信级运维保障,实时监控自动切换 电信级运维保障,实时监控自动切换。支持大容量,高并发处理,高效的调度算法解决高峰时段的业务压力。海量数据多通道智能分流,到达率可靠 |
满足个性化定制 | 支持自定义签名,支持为不同的客户提供独享通道、专用通道、大客户通道 |
接入便捷 | 提供详尽、完善的短信接入文档,简单易懂,快速上线。接入便捷:提供 API/SDK 方式简易接入,登陆即可一键开通。使用便捷:无需自行搭建短信服务,免运维提供多种语言 SDK,包括 GO, Ruby, Python, Java 等任您选择。 |
# 快速入门
本文旨在介绍七牛云短信如何快速接入服务。
# 基本概念
短信格式:短信由签名和正文内容组成,发送短信前必须申请审核至少一个短信签名和一个短信正文模板,审核通过方可使用。 以验证码短信为例,短信格式如下:
拷贝
【七牛云服务】您正在申请绑定手机,验证码为:${code},5分钟内有效!
2
其中:
- 短信签名:【七牛云服务】
- 短信模板:您正在申请绑定手机,验证码为:${code},5分钟内有效!
- 模板变量:${code}
**短信签名:**发送短信必备,是附加在短信内容前面的标识,用于标识公司或业务;申请时企业用户需要上传资质证明,个人用户需要上传线上平台截图证明(包含个人信息);短信签名需要审核通过后才可使用。 **短信模板:**即具体发送的短信正文内容;支持验证码、短信通知、推广短信三种模式,短信内容可以通过模板参数实现个性化定制。
# 使用流程
云短信的基本使用流程,包含以下几个步骤:
- 01 开通短信服务 (opens new window)
- 02 申请短信签名 (opens new window)
- 03 申请短信模板 (opens new window)
- 04 购买短信资源包 (opens new window)
- 05 发送短信 (opens new window)
- 06 查看发送状态 (opens new window)
# 01 开通短信服务
您需要一个七牛云账号才能使用云短信服务:
- 如果还没有账号注册七牛云账号 (opens new window),并按照要求完成[实名认证]。(https://developer.qiniu.com/af/manual/4057/the-identity-authentication)。
- 如果您已有实名认证的七牛云账号,请直接进行下一步操作。
访问云短信控制台 (opens new window),如果是首次使用云短信服务,需要进行服务开通操作,开通好后即可进入云短信 dashboard 界面。
(opens new window)
备注:
- 实名认证后可享受共 300 条的免费测试短信(验证码短信 100 条、通知短信 100 条和推广短信 100 条)。激活当月的1号生效,12月内有效。
# 02 申请短信签名
短信服务发送的短信中包括短信签名和短信模板,所以您需要至少申请一个短信签名并通过审核方可正常发送短信。
短信签名可直接在云短信控制台 (opens new window)申请,选择【签名】->【新建】。
(opens new window)
在新建签名时,您可根据实际情况填写以下参数:
- 短信签名:填写全称或者简称,无须添加【】、()、[]符号,签名发送会自带【】符号。
- 用途:企业、网站、App、公众号或小程序、电商店铺名、商标名或者其他。
- 签名归属:自用或者代理他人,如选择“代理他人”,即签名归属与七牛账号归属主体不一致时需上传授权委托书 (opens new window)。
- 上传证明:根据实际用途上传相关证明文件。
- 申请说明:根据实际情况填写相关说明。
备注:
- 海外短信签名需符合该地区语言支持 (opens new window),如七牛海外短信签名为[Qiniu],只需要提交签名内容“Qiniu”。
- 审核时间为工作日2小时以内,如需加急请提交工单 (opens new window)或者联系对应商务经理。
# 03 申请短信模板
短信模板是具体发送的短信正文内容;国内短信模板可直接在云短信控制台 (opens new window)申请,选择【模板】->【新建】。
(opens new window)
在新建模板时,您可根据实际情况填写以下参数:
- 名称:自定义模板名,用于标识。
- 类型:验证码、通知、推广和语音类,根据实际需要选择。
- 短信签名:短信模板必须关联对应短信签名。
- 内容:参考短信模板审核标准 (opens new window)。
- 申请说明:根据实际情况填写相关说明。
备注:
- 海外短信模板需符合该地区语言支持 (opens new window),并提交提交工单 (opens new window)或者联系对应商务经理加急。
# 04 购买短信资源包
完成申请短信签名和短信模板后,可在资源包 (opens new window)界面购买套餐包。
# 05 发送短信
确认短信签名和短信正文模板均已通过审核后,您可通过云短信控制台批量发送 (opens new window)或 API 方式 (opens new window)发送短信,本文以使用控制台为例,选择【发送群发】->【批量发送】。
(opens new window)
新建群发短信任务时,您可根据实际情况填写以下参数:
- 任务名称:自定义群发短信任务名,用于标识。
- 短信模板:批量发送只支持推广、通知短信模板,其他类型请提交提交工单 (opens new window)或者联系对应商务经理。
- 定时发送(可选):选择群发短信任务发送时间。
- 号码输入:支持文件导入和文本框填写,文本框输入时号码间以英文逗号“,”分隔。
备注:
- 群发功能需要企业用户认证,且保证您的账号有10万条资源包余量或5000元余额。
- 个人用户发送短信可利用API方式 (opens new window)。
# 06 查看发送状态
无论是通过控制台或API方式发送短信,都会在控制台显示。
七牛云提供“发送量统计”和“发送记录查询”功能,待发送短信步骤完成后,可直接在云短信控制台左侧导航栏打开。
(opens new window)
若短信发送失败,请参考错误定义 (opens new window)排除故障,再重新发送短信。
# 开发步骤
(1)创建工程,引入依赖
<!--阿里云短信服务SDK-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.9</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.1.0</version>
</dependency>
2
3
4
5
6
7
8
9
10
11
(2)创建测试类
注意:将其中的 accessKeyId、accessKeySecret 、phone(手机号)、signName(签名)、templateCode(模板)、templateParam(模板参数)、outId(额外参数) 替换成自己的配置后,就可以运行代码了。
package com.devclub.crays.module.sms.util;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.*;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 短信API产品的DEMO程序,执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可)
* <br>
* <br>
* 备注:当前Demo工程编码采用UTF-8,国际短信发送请勿参照此DEMO
*
* @author: RyuZheng
* @date: 2020.01.14
*/
public class AliSmsDemo {
/** 产品名称:短信API产品名称,开发者无需替换 */
static final String product = "Dysmsapi";
/** 产品域名:开发者无需替换 */
static final String domain = "dysmsapi.aliyuncs.com";
// TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
/** accessKeyId */
static final String accessKeyId = "your_accessKeyId";
/** accessKeySecret */
static final String accessKeySecret = "your_accessKeySecret";
/**
* 初始化acsClient实例
*
* @return
* @throws ClientException
*/
public static IAcsClient aliSmsClient() throws ClientException {
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", product, domain);
//可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
return new DefaultAcsClient(profile);
}
/**
* 发送短信。详情https://help.aliyun.com/document_detail/55284.html?spm=a2c4g.11186623.6.647.71163520UlAX5d
*
* @param phone 待发送手机号
* @param signName 短信签名-可在短信控制台中找到
* @param templateCode 短信模板-可在短信控制台中找到
* @param templateParam 模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时
* @param outId outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
* @return SendSmsResponse
* @throws ClientException
*/
public static SendSmsResponse sendSms(String phone, String signName, String templateCode, String templateParam, String outId) throws ClientException {
//初始化acsClient,暂不支持region化
IAcsClient acsClient = aliSmsClient();
//组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
//必填:待发送手机号
request.setPhoneNumbers(phone);
//必填:短信签名-可在短信控制台中找到
request.setSignName(signName);
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(templateCode);
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam(templateParam);
//选填-上行短信扩展码(无特殊需求用户请忽略此字段)
//request.setSmsUpExtendCode("90997");
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.setOutId(outId);
//hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
return sendSmsResponse;
}
/**
* 批量发送。详情https://help.aliyun.com/document_detail/66041.html
*
* @param phoneNumberJson 短信接收号码,JSON格式,批量上限为100个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
* @param signNameJson 短信签名,JSON格式
* @param templateCode 短信模板ID
* @param templateParamJson 短信模板变量替换JSON串,友情提示:如果JSON中需要带换行符,请参照标准的JSON协议。
* @return SendBatchSmsResponse
* @throws ClientException
*/
public static SendBatchSmsResponse sendBatchSms(String phoneNumberJson, String signNameJson, String templateCode, String templateParamJson) throws ClientException {
SendBatchSmsRequest request = new SendBatchSmsRequest();
request.setPhoneNumberJson(phoneNumberJson);
request.setSignNameJson(signNameJson);
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(templateCode);
request.setTemplateParamJson(templateParamJson);
IAcsClient acsClient = aliSmsClient();
return acsClient.getAcsResponse(request);
}
/**
* 查询发送的短信。https://help.aliyun.com/document_detail/55289.html?spm=a2c4g.11186623.6.648.72a53144NTp88y
*
* @param bizId 可选-流水号
* @param phone 必填-号码
* @param sendDate 短信发送日期格式yyyyMMdd,支持最近30天记录查询
* @param pageSize 必填-页大小
* @param currentPage 必填-当前页码从1开始计数
* @return QuerySendDetailsResponse
* @throws ClientException
*/
public static QuerySendDetailsResponse querySendDetails(String bizId, String phone, String sendDate, long pageSize, long currentPage) throws ClientException {
IAcsClient acsClient = aliSmsClient();
//组装请求对象
QuerySendDetailsRequest request = new QuerySendDetailsRequest();
//必填-号码
request.setPhoneNumber(phone);
//可选-流水号
request.setBizId(bizId);
//必填-发送日期 支持30天内记录查询,格式yyyyMMdd
request.setSendDate(sendDate);
//必填-页大小
request.setPageSize(pageSize);
//必填-当前页码从1开始计数
request.setCurrentPage(currentPage);
//hint 此处可能会抛出异常,注意catch
QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
return querySendDetailsResponse;
}
public static void main(String[] args) throws InterruptedException, ClientException {
//===========================
//准备参数
//===========================
String phone = "1853825****";
String signName = "极简之家";
String templateCode = "SMS_186941157";
String templateParam = "{\"code\":\"123456\"}";
String outId = "yourOutId";
SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
String sendDate = ft.format(new Date());
long pageSize = 10L;
long currentPage = 1L;
//===========================
//发送短信
//===========================
SendSmsResponse response = sendSms(phone, signName, templateCode, templateParam, outId);
System.out.println("短信接口返回的数据----------------");
System.out.println("Code=" + response.getCode());
System.out.println("Message=" + response.getMessage());
System.out.println("RequestId=" + response.getRequestId());
System.out.println("BizId=" + response.getBizId());
Thread.sleep(3000L);
//===========================
//查询明细
//===========================
if(response.getCode() != null && response.getCode().equals("OK")) {
QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(response.getBizId(), phone, sendDate, pageSize, currentPage);
System.out.println("短信明细查询接口返回数据----------------");
System.out.println("Code=" + querySendDetailsResponse.getCode());
System.out.println("Message=" + querySendDetailsResponse.getMessage());
int i = 0;
for(QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs())
{
System.out.println("SmsSendDetailDTO["+i+"]:");
System.out.println("Content=" + smsSendDetailDTO.getContent());
System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode());
System.out.println("OutId=" + smsSendDetailDTO.getOutId());
System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum());
System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());
System.out.println("SendDate=" + smsSendDetailDTO.getSendDate());
System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus());
System.out.println("Template=" + smsSendDetailDTO.getTemplateCode());
}
System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount());
System.out.println("RequestId=" + querySendDetailsResponse.getRequestId());
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201