简介
该项目主要利用Spring boot2.x 集成阿里大鱼短信接口,发送短信验证码及短信接口详解,使用前需要在阿里大于管理中心添加短信签名与短信模板。
- 阿里大鱼短信:alibaba.aliqin.fc.sms.num.send (短信发送) 向指定手机号码发送模板短信,模板内可设置部分变量。
- 联盟公众号:IT实战联盟
- 我们社区:
小工具一枚,欢迎使用和Star支持,如使用过程中碰到问题,可以提出Issue,我会尽力完善该Starter
版本基础
- Spring Boot:2.0.4
- aliyun-java-sdk-dysmsapi:1.1.0
操作步骤
第一步:添加maven依赖
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-dysmsapi</artifactId> <version>1.1.0</version> <scope>compile</scope> </dependency>
第二步:增加SMSService 服务
SMSService.java
import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetails request ; import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse; import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse.SmsSendDetailDTO; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * * @desc : 阿里云 短信大鱼服务 * @author : IT实战联盟Lin * * @date : 2019年03月18日16:53:01 */ @Service public class SMSService { /** * 获取IAcsClient对象 * * @return * @throws Exception */ private static IAcsClient initClient() throws Exception { System.setProperty(" sun .net.client.defaultConnectTimeout", "10000"); System.setProperty("sun.net.client.defaultReadTimeout", "10000"); // 初始化ascClient需要的几个参数 final String product = "Dysmsapi";// 短信API产品名称 final String domain = "dysmsapi.aliyuncs.com";// 短信API产品域名 //阿里云测试 final String appkey = "LTAIdY0gZtSfmI9I"; final String appSecret = "ogofxIPdDicESfuuN6NoVqbNP3SSrF"; // 初始化ascClient,暂时不支持多region IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", appkey, appSecret); DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); IAcsClient acsClient = new DefaultAcsClient(profile); return acsClient; } /** * @param template code * 短信模板code * @throws Exception * */ public static void sendMessage(String templateCode,String phones,String code) throws Exception { // 初始化client对象 IAcsClient client = initClient(); // 短信模板请求对象 SendSmsRequest request = null; // 根据短信模板code来获取不同的短信模板请求对象 switch (templateCode) { case "SMS_100960098": request = getSMS_SMS_100960098Message(phones,code); break; } // 发送短信 SendSmsResponse response = client.getAcsResponse(request); // 打印短信的消息 System.out.println("_____________发送SMS_100960098短信收到的响应信息_______________"); System.out.println("请求的ID:" + response.getRequestId()); System.out.println("请求的状态码:" + response.getCode()); System.out.println("请求的状态码描述:" + response. getMessage ()); System.out.println("请求的回执ID:" + response.getBizId()); } /** * 获取SMS_72780019短信模板对应的请求 * * @return */ private static SendSmsRequest getSMS_SMS_100960098Message(String phones,String code) { // 组装请求对象 SendSmsRequest request = new SendSmsRequest(); // 必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为20个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式 // request.setPhoneNumbers("1515288****"); request.setPhoneNumbers(phones); // 必填:短信签名 request.setSignName("阿里云短信测试专用"); // 必填:短信模板 request.setTemplateCode("SMS_100960098"); // 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 request.setTemplateParam("{"customer":"+code+","time":"5201314"}"); // 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 // request.setOutId("yourOutId"); return request; } }
备注:SMS_100960098 模板为阿里大鱼测试模板,生产上需要修改为自己公司申请阿里大鱼的模板;
第三步:编写Main测试
SMSService.java
public static void main(String[] args) throws Exception { sendMessage("SMS_100960098","186****3762","1234"); }
备注:填写正确的手机号码,验证码生产时要动态生成。
第四步:发送短信结果
控制台
如上图所示控制台和手机都收到了成功信息,用大鱼测试模板好像是1小时内只能手机号码发送5条,做测试用已经够了。
第五步:查询发送短信历史记录
SMSService.java
/** * @desc 短信发送记录查询 * @throws Exception */ public static void querySendDetails() throws Exception { // 初始化client对象 IAcsClient client = initClient(); QuerySendDetailsResponse response = client.getAcsResponse(getQueryRequest()); // 打印短信的消息 System.out.println("_____________querySendDetails()_______________"); System.out.println("请求的ID:" + response.getRequestId()); System.out.println("请求的状态码:" + response.getCode()); System.out.println("请求的状态码描述:" + response.getMessage()); System.out.println("发送总条数:" + response.getTotalCount()); List<SmsSendDetailDTO> smsSendDetailDTOs = response.getSmsSendDetailDTOs(); if (smsSendDetailDTOs != null && smsSendDetailDTOs.size() > 0) { for (SmsSendDetailDTO smsSendDetailDTO : smsSendDetailDTOs) { System.out.println("发送的详细信息 -- 内容: " + smsSendDetailDTO.getContent() + " ,手机号: " + smsSendDetailDTO.getPhoneNum() + " ,接收时间: " + smsSendDetailDTO.getReceiveDate() + " ,状态:" + smsSendDetailDTO.getSendStatus()); } } } /** * 获取短信发送记录查询的请求 * * @return */ public static QuerySendDetailsRequest getQueryRequest() { // 组装请求对象 QuerySendDetailsRequest request = new QuerySendDetailsRequest(); // 必填-号码 request.setPhoneNumber("186****3762"); // 必填-短信发送的日期 支持30天内记录查询(可查其中一天的发送数据),格式yyyyMMdd request.setSendDate("20190318"); // 必填-页大小 (一页一条记录) request.setPageSize(3L); // 必填-当前页码从1开始计数 request.setCurrentPage(1L); return request; }
备注:只支持30天内的记录查询,日期格式为yyyyMMdd不要填写错误。
第六步:编写Main测试
SMSService.java
public static void main(String[] args) throws Exception { querySendDetails(); }
第七步:发送短信结果
控制台
_____________querySendDetails()_______________ 请求的ID:7D6C4B1B-2929-451A-B8C2-FB9DD95F7E1E 请求的状态码:OK 请求的状态码描述:OK 发送总条数:1 发送的详细信息 -- 内容: 【阿里云短信测试专用】尊敬的1234,欢迎您使用阿里云通信服务! ,手机号: 186****3762 ,接收时间: 2019-03-18 16:51:11 ,状态:3
结果没问题,和实际收到的一样。
第八步:参数详情
公共请求参数:
- method:API接口名称。
- app_key:TOP分配给应用的AppKey。
- target_app_key:被调用的目标AppKey,仅当被调用的API为第三方ISV提供时有效。
- sign_method:签名的摘要算法,可选值为:hmac,md5。signString是API输入参数签名结果,签名算法介绍请点击这里。
- session:用户登录授权成功后,TOP颁发给应用的授权信息,详细介绍请点击这里。当此API的标签上注明:“需要授权”,则此参数必传;“不需要授权”,则此参数不需要传;“可选授权”,则此参数为可选。
- timestamp:时间戳,格式为yyyy-MM-dd HH:mm:ss,时区为GMT+8,例如:2015-01-01 12:00:00。淘宝API服务端允许客户端请求最大时间误差为10分钟。
- format:响应格式。默认为xml格式,可选值:xml,json。
- v:API协议版本,可选值:2.0。
- partner_id:合作伙伴身份标识。
- simplify:是否采用精简JSON返回格式,仅当format=json时有效,默认值为:false。
请求参数:
- extend:123456公共回传参数,在“消息返回”中会透传回该参数;举例:用户可以传入自己下级的会员ID,在消息返回时,该会员ID会包含在内,用户可以根据该会员ID识别是哪位会员使用了你的应用。
- sms_type:必须normal短信类型,传入值请填写normal。
- sms_free_sign_name:必须阿里大于短信签名,传入的短信签名必须是在阿里大于“管理中心-验证码/短信通知/推广短信-配置短信签名”中的可用签名。如“阿里大于”已在短信签名管理中通过审核,则可传入”阿里大于“(传参时去掉引号)作为短信签名。短信效果示例:【阿里大于】欢迎使用阿里大于服务。
- sms_paramJson:{“code”:”1234″,”product”:”alidayu”}短信模板变量,传参规则{“key”:”value”},key的名字须和申请模板中的变量名一致,多个变量之间以逗号隔开。示例:针对模板“验证码。
- rec_num:13000000000短信接收号码。支持单个或多个手机号码,传入号码为11位手机号码,不能加0或+86。群发短信需传入多个号码,以英文逗号分隔,一次调用最多传入200个号码。示例:18600000000,13911111111,13322222222
- sms_template_code:SMS_585014短信模板ID,传入的模板必须是在阿里大于“管理中心-短信模板管理”中的可用模板。示例:SMS_585014。
响应参数:
- resultBizResult:默认:0 ,返回值。
- err_code:默认0,错误码。
- model:默认134523^4351232返回结果。
- success: 默认 false, true表示成功,false表示失败。
- msg:默认成功,返回信息描述
贡献者
- IT实战联盟-Line
- IT实战联盟-咖啡
往期回顾
往期回顾