微服务架构实战篇(六):Spring boot2.x 集成阿里大鱼短信接口详解与Demo

今日编程 2019-03-18 17:44:39 ⋅ 860 阅读

简介

该项目主要利用Spring boot2.x 集成阿里大鱼短信接口,发送短信验证码及短信接口详解,使用前需要在阿里大于管理中心添加短信签名与短信模板。

  • 阿里大鱼短信:alibaba.aliqin.fc.sms.num.send (短信发送) 向指定手机号码发送模板短信,模板内可设置部分变量。

  • 联盟公众号:IT实战联盟

  • 我们社区:https://100boot.cn

小工具一枚,欢迎使用和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.QuerySendDetailsRequest;
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 templateCode
* 短信模板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 String API接口名称。
app_key String TOP分配给应用的AppKey。
target_app_key String 被调用的目标AppKey,仅当被调用的API为第三方ISV提供时有效。
sign_method String 签名的摘要算法,可选值为:hmac,md5。
sign String API输入参数签名结果,签名算法介绍请点击这里。
session String 用户登录授权成功后,TOP颁发给应用的授权信息,详细介绍请点击这里。当此API的标签上注明:“需要授权”,则此参数必传;“不需要授权”,则此参数不需要传;“可选授权”,则此参数为可选。
timestamp String 时间戳,格式为yyyy-MM-dd HH:mm:ss,时区为GMT+8,例如:2015-01-01 12:00:00。淘宝API服务端允许客户端请求最大时间误差为10分钟。
format String 响应格式。默认为xml格式,可选值:xml,json。
v String API协议版本,可选值:2.0。
partner_id String 合作伙伴身份标识。
simplify Boolean 是否采用精简JSON返回格式,仅当format=json时有效,默认值为:false。

请求参数:

名称 类型 是否必须 示例值 更多限制 描述
extend String 可选 123456 公共回传参数,在“消息返回”中会透传回该参数;举例:用户可以传入自己下级的会员ID,在消息返回时,该会员ID会包含在内,用户可以根据该会员ID识别是哪位会员使用了你的应用
sms_type String 必须 normal 短信类型,传入值请填写normal
sms_free_sign_name String 必须 阿里大于 短信签名,传入的短信签名必须是在阿里大于“管理中心-验证码/短信通知/推广短信-配置短信签名”中的可用签名。如“阿里大于”已在短信签名管理中通过审核,则可传入”阿里大于“(传参时去掉引号)作为短信签名。短信效果示例:【阿里大于】欢迎使用阿里大于服务。
sms_param Json 可选 {"code":"1234","product":"alidayu"} 短信模板变量,传参规则{"key":"value"},key的名字须和申请模板中的变量名一致,多个变量之间以逗号隔开。示例:针对模板“验证码
rec_num String 必须 13000000000 短信接收号码。支持单个或多个手机号码,传入号码为11位手机号码,不能加0或+86。群发短信需传入多个号码,以英文逗号分隔,一次调用最多传入200个号码。示例:18600000000,13911111111,13322222222
sms_template_code String 必须 SMS_585014 短信模板ID,传入的模板必须是在阿里大于“管理中心-短信模板管理”中的可用模板。示例:SMS_585014

响应参数:

名称 类型 示例值 描述
result BizResult 0 返回值
err_code String 0 错误码
model String 134523^4351232 返回结果
success Boolean false true表示成功,false表示失败
msg String 成功 返回信息描述

贡献者

  • IT实战联盟-Line

  • IT实战联盟-咖啡

往期回顾

微服务架构实战篇(五):Spring boot2.x + Guava 并使用RateLimiter实现秒杀限流demo
微服务架构实战篇(四):Spring boot2.x + Mybatis +Druid监控数据库访问性能
微服务架构实战篇(三):Spring boot2.x + Mybatis + PageHelper实现增删改查和分页查询功能
微服务架构实战篇(二):Spring boot2.x + Swagger2 让你的API可视化
微服务架构实战篇(一):使用start.spring.io 构建SpringBoot2.x项目
Google guava工具类快速入门指南

---------------END----------------

后续的内容同样精彩

长按关注“IT实战联盟”哦




全部评论: 0

    我有话说:

    架构实战(十):Spring Boot Assembly服务化打包

    使用assembly来打包springboot服务项目,让发布更简单

    架构实战(九):Spring Boot 集成 RocketMQ

    快速集成阿里开源消息队列 RocketMQ

    架构实战):Spring Boot RestTemplate的使用

    RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

    架构实战(十):Spring Boot 集成 Dubbo

    Dubbo是阿里巴巴SOA服务化治理方案的核心框架,一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案。

    码云推荐:一个优秀的分布式spring boot/Spring Cloud API限流框架,特别适合服务架构

    一个优秀的分布式spring boot/Spring Cloud API限流框架,特别适合服务架构.

    架构实战(三)-Spring Boot架构搭建RESTful API案例

    之前分享了Spring Boot 整合Swagger 让API可视化和前后端分离架构 受到了大家一致好评 ,本节就接着上节的代码做了详细的查询代码的补充和完善并搭建RESTful API架构案例。

    服务架构学习笔记:gRPC Spring Boot Starter 2.2.0 发布,及使用步骤

    gRPC Spring Boot Starter 项目是一个 gRPC 的 Spring Boot 模块。内嵌一个 gRPC Server 对外提供服务,并支持 Spring Cloud 的服务发现

    架构实战(十一):Spring Boot 集成企业级搜索引擎 SolrCloud

    Solr是以Lucene为基础实现的文本检索应用服务。Solr部署方式有单机方式、多机Master-Slaver方式、Cloud方式。

    架构实战(十七):Spring Boot Assembly 整合 thymeleaf

    如何让服务器上的 sprig boot 项目升级变的方便快捷

    架构实战(七):Spring Boot Data JPA 快速入门

    Spring Data JPA 是Spring Data 的一个子项目,它通过提供基于JPA的Repository极大了减少了操作JPA的代码。

    服务架构实战:快速入手SpringBoot 2.0,欢迎入坑哦~~~

    SpringBoot 2.0 基本要求Java最低要求8以上,不再支持Java 6 和 7等低版本。

    架构实战(二)-Spring Boot整合Swagger,让你的API可视化

    你还在跟前端对接上花费很多的时间而没有效果吗?你还在为写接口文档而烦恼吗?今天就教大家一个接口对接神器...

    架构实战(一)-Spring Boot+MyBatis基础架构搭建

    Spring的追求一定是简单点简单点,让java的开发变得更加简单、容易。瞧瞧的告诉你们直接copy就能用哦~~~

    架构实战:认识一下服务架构

    服务是一个新兴的软件架构,就是把一个大型的单个应用程序和服务拆分为数十个的支持服务

    架构实战(十五):Spring Boot 解耦之事件驱动

    通过使用spring 事件来解决业务代码的耦合

    架构实战(五):Spring Boot 表单验证和异常处理

    为了让API 能够更好的提供服务,表单数据验证和异常的处理是必不可少的,让我们来看看怎么处理......

    SpringBoot+zk+dubbo架构实践(二):SpringBoot 集成 zookeeper

    不啰嗦,本完成两件事:1、搭建SpringBoot 框架;2、基于spring boot框架访问zookeeper。