一、使用RAM子用户

1、进入子用户管理页面

2、添加用户

3、获取子用户key

AccessKeyId, AccessKeySecret

4、设置用户权限

授权:AliyunDysmsFullAccess

二、开通短信服务

1、开通

2、添加签名

3、添加模板

4、套餐

http://free.aliyun.com

5、快速学习

三、测试短信发送

1、查找使用示例

2、测试短信发送


3、查看发送结果

短信服务->业务统计->发送记录查询

四、创建项目

需求

1、创建service-sms模块

2、配置 pom.xml

 <dependencies><dependency><groupId>com.indi</groupId><artifactId>service-base</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--lombok用来简化实体类:需要安装lombok插件--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--阿里云短信--><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId></dependency></dependencies>

3、application.yml

resources目录下创建文件

server:port: 8120 # 服务端口spring:profiles:active: dev # 环境设置application:name: service-sms # 服务名#spring:redis:host: 192.168.2.190port: 6379database: 0password: 123456 #没有密码,则去掉此选项timeout: 3000ms #最大等待时间,超时则抛出异常,否则请求一直等待lettuce:pool:max-active: 20  #最大连接数,负值表示没有限制,默认8max-wait: -1    #最大阻塞等待时间,负值表示没限制,默认-1max-idle: 8     #最大空闲连接,默认8min-idle: 0     #最小空闲连接,默认0#阿里云短信
aliyun:sms:region-id: cn-hangzhoukey-id: 你的keyidkey-secret: 你的keysecrettemplate-code: 你的短信模板codesign-name: 你的短信模板签名

4、logback-spring.xml

复制之前sms-core模块的,只需要修改日志输出目录即可

5、创建SpringBoot启动类

ServiceSmsApplication.java

package com.indi.srb.sms;@SpringBootApplication
@ComponentScan({"com.indi.srb","com.indi.common"})
public class ServiceSmsApplication {public static void main(String[] args) {SpringApplication.run(ServiceSmsApplication.class, args);}
}

五、自定义配置

1、从配置文件读取常量

com.indi.srb.sms.util包下
创建常量读取工具类:SmsProperties.java

package com.indi.srb.sms.util;@Data
@Component
@ConfigurationProperties(prefix = "aliyun.sms")
public class SmsProperties implements InitializingBean {private String regionId;private String keyId;private String keySecret;private String templateCode;private String signName;public static String REGION_Id;public static String KEY_ID;public static String KEY_SECRET;public static String TEMPLATE_CODE;public static String SIGN_NAME;//当私有成员被赋值后,此方法自动被调用,从而初始化常量@Overridepublic void afterPropertiesSet() throws Exception {REGION_Id = regionId;KEY_ID = keyId;KEY_SECRET = keySecret;TEMPLATE_CODE = templateCode;SIGN_NAME = signName;}
}

Idea报告如下错误信息(不影响程序的编译和运行):

解决步骤:

  1. pom添加依赖

         <!--  配置文件处理器  --><!--让自定义的配置在application.yaml进行自动提示--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>
    
  2. 启用processor

  3. 重新编译模块

  4. 这样在yml文件中写阿里云的配置时,就有提示了

2、测试工具类

test模块下创建UtilsTests.java

package com.indi.srb.sms;
@SpringBootTest
@RunWith(SpringRunner.class)public class UtilsTests {@Testpublic void testProperties(){System.out.println(SmsProperties.KEY_ID);System.out.println(SmsProperties.KEY_SECRET);System.out.println(SmsProperties.REGION_Id);}
}

六、发送短信

1、短信发送业务

SmsService.java

package com.indi.srb.sms.service;public interface SmsService {void send(String mobile, String templateCode, Map<String,Object> param);
}

SmsServiceImpl.java

@Service
@Slf4j
public class SmsServiceImpl implements SmsService {@Overridepublic void send(String mobile, String templateCode, Map<String,Object> param) {//创建远程连接客户端对象DefaultProfile profile = DefaultProfile.getProfile(SmsProperties.REGION_Id,SmsProperties.KEY_ID,SmsProperties.KEY_SECRET);IAcsClient client = new DefaultAcsClient(profile);//创建远程连接的请求参数CommonRequest request = new CommonRequest();request.setSysMethod(MethodType.POST);request.setSysDomain("dysmsapi.aliyuncs.com");request.setSysVersion("2017-05-25");request.setSysAction("SendSms");request.putQueryParameter("RegionId", SmsProperties.REGION_Id);request.putQueryParameter("PhoneNumbers", mobile);request.putQueryParameter("SignName", SmsProperties.SIGN_NAME);request.putQueryParameter("TemplateCode", templateCode);Gson gson = new Gson();String json = gson.toJson(param);request.putQueryParameter("TemplateParam", json);try {// 使用客户端对象携带请求参数向远程阿里云服务器发起远程调用,并得到响应结果CommonResponse response = client.getCommonResponse(request);// 通信失败的处理boolean success = response.getHttpResponse().isSuccess();// ALIYUN_RESPONSE_FAIL(-501, "阿里云响应失败"),Assert.isTrue(success, ResponseEnum.ALIYUN_RESPONSE_FAIL);// 获取响应结果String data = response.getData();HashMap<String, String> resultMap = gson.fromJson(data, HashMap.class);String code = resultMap.get("Code");String message = resultMap.get("Message");log.info("阿里云短信发送响应结果:");log.info("code:" + code);log.info("message:" + message);// 业务失败的处理Assert.notEquals("isv.BUSINESS_LIMIT_CONTROL", code, ResponseEnum.ALIYUN_SMS_LIMIT_CONTROL_ERROR);Assert.equals("OK", code, ResponseEnum.ALIYUN_SMS_ERROR);} catch (ServerException e) {log.error("阿里云短信发送SDK调用失败:");log.error("ErrorCode=" + e.getErrCode());log.error("ErrorMessage=" + e.getErrMsg());throw new BusinessException(ResponseEnum.ALIYUN_SMS_ERROR , e);} catch (ClientException e) {log.error("阿里云短信发送SDK调用失败:");log.error("ErrorCode=" + e.getErrCode());log.error("ErrorMessage=" + e.getErrMsg());throw new BusinessException(ResponseEnum.ALIYUN_SMS_ERROR , e);}}
}

2、引入工具类

indi-common模块中创建util包,存放工具类
RandomUtils.java:生成四位或六位的验证码

package com.indi.common.util;import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;/*** 生成四位和六位的随机数字*/
public class RandomUtils {private static final Random random = new Random();private static final DecimalFormat fourdf = new DecimalFormat("0000");private static final DecimalFormat sixdf = new DecimalFormat("000000");public static String getFourBitRandom() {return fourdf.format(random.nextInt(10000));}public static String getSixBitRandom() {return sixdf.format(random.nextInt(1000000));}/*** 给定数组,抽取n个数据* @param list* @param n* @return*/public static ArrayList getRandom(List list, int n) {Random random = new Random();HashMap<Object, Object> hashMap = new HashMap<Object, Object>();// 生成随机数字并存入HashMapfor (int i = 0; i < list.size(); i++) {int number = random.nextInt(100) + 1;hashMap.put(number, i);}// 从HashMap导入数组Object[] robjs = hashMap.values().toArray();ArrayList r = new ArrayList();// 遍历数组并打印数据for (int i = 0; i < n; i++) {r.add(list.get((int) robjs[i]));System.out.print(list.get((int) robjs[i]) + "\t");}System.out.print("\n");return r;}
}

RegexValidateUtils.java:常用正则表达式验证,这里提供了手机号码验证

package com.indi.common.util;import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** 使用正则表达式进行表单验证*/
public class RegexValidateUtils {static boolean flag = false;static String regex = "";public static boolean check(String str, String regex) {try {Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(str);flag = matcher.matches();} catch (Exception e) {flag = false;}return flag;}/*** 验证邮箱** @param email* @return*/public static boolean checkEmail(String email) {String regex = "^\\w+[-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$ ";return check(email, regex);}/*** 验证手机号码** 移动号码段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147* 联通号码段:130、131、132、136、185、186、145* 电信号码段:133、153、180、189** @param cellphone* @return*/public static boolean checkCellphone(String cellphone) {String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$";return check(cellphone, regex);}/*** 验证固话号码** @param telephone* @return*/public static boolean checkTelephone(String telephone) {String regex = "^(0\\d{2}-\\d{8}(-\\d{1,4})?)|(0\\d{3}-\\d{7,8}(-\\d{1,4})?)$";return  check(telephone, regex);}/*** 验证传真号码** @param fax* @return*/public static boolean checkFax(String fax) {String regex = "^(0\\d{2}-\\d{8}(-\\d{1,4})?)|(0\\d{3}-\\d{7,8}(-\\d{1,4})?)$";return check(fax, regex);}/*** 验证QQ号码** @param QQ* @return*/public static boolean checkQQ(String QQ) {String regex = "^[1-9][0-9]{4,} $";return check(QQ, regex);}
}

3、创建controller

创建controller.api包,创建类ApiSmsController.java

package com.indi.srb.sms.controller.api;@RestController
@Slf4j
@Api(tags = "短信管理")
@CrossOrigin
@RequestMapping("/api/sms")
public class ApiSmsController {@Resourceprivate SmsService smsService;@Resourceprivate RedisTemplate redisTemplate;@ApiOperation("获取验证码")@GetMapping("/send/{mobile}")public R send(@ApiParam(value = "手机号", required = true)@PathVariable String mobile) {// 校验手机号不能为空Assert.notEmpty(mobile, ResponseEnum.MOBILE_NULL_ERROR);// 校验手机号是否合法Assert.isTrue(RegexValidateUtils.checkCellphone(mobile), ResponseEnum.MOBILE_ERROR);String code = RandomUtils.getFourBitRandom();HashMap<String, Object> map = new HashMap<>();map.put("code", code);smsService.send(mobile, SmsProperties.TEMPLATE_CODE, map);// 将验证码存入redisredisTemplate.opsForValue().set("srb:sms:code:" + mobile, code, 5, TimeUnit.MINUTES);return R.ok().setMessage("短信发送成功");}
}

七、测试

http://localhost:8120/swagger-ui.html

测试正确发送

测试手机号码不正确

测试业务限流:连续发送两次短信

17. 尚融宝引入阿里云短信服务相关推荐

  1. 尚医通-阿里云短信服务(二十九)

    目录: (1)前台用户系统-手机登录-阿里云短信服务介绍 (2)手机登录-整合短信服务 (3)整合短信发送服务测试 (1)前台用户系统-手机登录-阿里云短信服务介绍 现在使用阿里云完成短信服务:注册登 ...

  2. SpringBoot+阿里云短信服务实现发送短信验证码功能

    目录 一.登陆阿里云,开通短信服务(收费的,需要充值,1元能发20条左右),并获取AccessKeyId和AccessKeySecret 二.创建短信模板与签名 三.引入依赖 四.准备工作已完成,编码 ...

  3. 谷粒学院-阿里云短信服务

    新建短信微服务 1.在service模块下创建子模块service_msm 2.创建controller和service代码 3.配置application.properties # 服务端口 ser ...

  4. 如何使用阿里云短信服务实现登录页面,手机验证码登录?

    1:个人如何使用阿里云短信服务? 2022如何使用个人阿里云短信服务?_linxiMY的博客-CSDN博客添加完成之后,等待审核!一般2个小时就会出来审核结果了,这里我因为注册申请时填写规则有误,足足 ...

  5. laravel5.4使用Laravel Sms和阿里云短信服务实现短信验证码功能

    laravel 实现短信验证码功能,搜索资料发现比较流行的有两个包: 一个是laravel sms 地址  https://github.com/toplan/laravel-sms 一个是easy ...

  6. 阿里云短信服务(申请与代码)

    目前阿里云短信签名审核更加严格了,如果不通过请转至<腾讯云短信申请与代码>,腾讯云简单易通过 记录申请短信服务签名的坑 短信服务签名申请注意事项: 自2020年12月17日开始,阿里云短信 ...

  7. 单点登录常见解决方式和阿里云短信服务

    1 单点登录(SSO) 三种常见方式: 1.1 第一种:session广播机制实现(已淘汰) 概念:就是session复制,一个模块登录后,该模块session存放用户登录信息,再把该session复 ...

  8. 阿里云短信服务的使用方法

    本人个人博客地址https://www.lightingsui.com 介绍 最近由于项目的业务需要,想使用验证码登录系统,所以要找一个短信平台,第一目标就是阿里云的短信服务平台,说实话,之前在阿里云 ...

  9. 阿里云短信服务——短信发送验证码

    引言 短信服务现在在很多地方都用的到,我们最多接触到的可能就是验证码的发送了:现在很多大厂都提供由短信服务对应的api,直接调用就可以轻松实现短信发送:下面我以阿里云为例,演示一下如何短信发送验证码: ...

最新文章

  1. 索引超出了数组界限_还在用优先队列?来试试索引优先队列吧(优先队列amp;索引优先队列)...
  2. 一、稀疏数组的实际应用和代码实现
  3. CentOS 6.9/7通过yum安装指定版本的MySQL
  4. 【飞秋】Asp.net MVC2 model验证 看似美好,实则让人失望。
  5. liunx 命令手册 (chm)
  6. android中tools的含义及用法
  7. 关于Eclipse无法显示package Explorer 内容的解决方法
  8. 【数据结构笔记10】二叉树的先序、中序、后序遍历,中序遍历的堆栈/非递归遍历算法,层序遍历,确定一个二叉树,树的同构
  9. 2019年美赛C题思路详解
  10. 计算机设备招标书范文,计算机设备招标书
  11. canvas圆形、半圆形进度条
  12. APP Launch 优化
  13. 一元高次方程c语言实现,c语言实现一元二次方程求解
  14. 利用Python开发王者荣耀,一路直奔上王者
  15. ArcGIS API for JavaScript学习笔记(1)API本地部署
  16. 山西计算机一级考试试题,2014山西省计算机等级考试试题 二级C试题一点通科目一...
  17. html鼠标拖尾效果,JavaScript鼠标划过背景拖尾效果
  18. iOS-推送自定义提示音
  19. 别找了,最全数据可视化配色指南在这
  20. JS逆向:猿人学爬虫比赛第五题详细题解(下)

热门文章

  1. 大数据就业前景怎么样?
  2. 激活函数(Activation Function)及十大常见激活函数
  3. 帆软注册文件_报表组件FineReport加密狗注册机理及使用方法
  4. 交通灯管理系统视频学习
  5. 谷歌浏览器不安全的连接牵扯的系统缺陷
  6. Google Adsense西联汇款领取方式与流程,亲身实践,供参考
  7. xml文件解析(使用解析器)
  8. yandex注册验证码怎么填_注册163邮箱格式怎么填?163电子邮件注册格式
  9. Excel进度条设置百分比解决
  10. WIN10系统的Edge浏览器怎么能彻底删除掉