当前位置: 首页 > news >正文

Java 实现阿里云短信

版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82788132

Java 实现阿里云短信

阿里云提供一套短信发送的服务可通过 Java 进行对接

更多精彩

  • 更多技术博客,请移步 asing1elife’s blog

官网

短信发送API(SendSms)—阿里云

准备步骤

  1. 创建 阿里云账号
  2. 根据 流程 完成实名认证,以确保可以使用阿里云相应服务
  3. 在密钥管理页面获取阿里云访问密钥,AccessKeyId 和 AccessKeySecret
  4. 想要成功发送一条短信需要获取 短信签名 和 短信模版

在项目 pom 中引入对接所需要的 jar 包

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>3.2.2</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
    <version>1.0.0</version>
</dependency>
</dependencies>

获取对接需要的数据

  1. 将 AccessKeyId 、AccessKeySecret 、SignName 、TemplateCode 进行相应存储

新建 MessageServiceImpl 类用于和阿里云短信接口对接

@Service
public class MessageServiceImpl extends AbstractBaseService {	
	...
}

在上述类中生成一个静态块用于在初始化对接信息

  1. Constants.ALI_ACCESS_KEY_IDConstants.ALI_ACCESS_SECRET 是密钥,成对生成和使用
  2. 其他参数信息按照阿里云开发手册说明,均不需要改变
// 用于从阿里云获取数据的权限客户端
private static IAcsClient iAcsClient;

static {
    // 超时时间
    System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
    System.setProperty("sun.net.client.defaultReadTimeout", "10000");

    // 初始化配置
    String regionId = "cn-hangzhou";
    DefaultProfile profile = DefaultProfile.getProfile(regionId, Constants.ALI_ACCESS_KEY_ID, Constants.ALI_ACCESS_SECRET);

    try {
        String productId = "Dysmsapi";
        String domain = "dysmsapi.aliyuncs.com";

        DefaultProfile.addEndpoint(regionId, regionId, productId, domain);
    } catch (ClientException e) {
        throw new TSharkException("初始化短信接口配置失败!", e);
    }

    // 初始化权限客户端
    iAcsClient = new DefaultAcsClient(profile);
}

创建用于发送短信的 sendMessage 方法

  1. 发送短信之前通常需要验证短信是否已发送,防止重复发送
  2. 为了验证短信是否发送可将通过短信发送的验证码存放于 Redis 中
  3. Constants.ALI_MESSAGE_SIGN_NAME 是从阿里云获取的短信签名
  4. 为提高公用性,发送短信的方法支持从外部调用时传入具体模版编号
  5. 短信接口调用时如果出现异常反馈,请参照 短信接口调用错误码
@Autowired
private RedisHelper redisHelper;

public Boolean sendMessage(String mobile, String template) {
    // 有效性验证
    if (checkMobile(mobile)) {
        throw new TSharkException("验证码已发送,请稍后再试!");
    }

    SendSmsRequest request = new SendSmsRequest();
    SendSmsResponse response = null;

    // 生成随机数
    String random = String.valueOf(new Random().nextInt(999999));

    request.setMethod(MethodType.POST);
    request.setPhoneNumbers(mobile);
    request.setSignName(Constants.ALI_MESSAGE_SIGN_NAME);
    request.setTemplateCode(template);
    request.setTemplateParam("{\"name\":\"" + mobile + "\", \"code\":\"" + random + "\"}");

    try {
        response = iAcsClient.getAcsResponse(request);
    } catch (ClientException e) {
        throw new TSharkException("接收短信回执失败!", e);
    }

    boolean result = response.getCode() != null && response.getCode().equals("OK");

    if (result) {
        // 保存随机数
        saveRandom(mobile, random);
    }

    return result;
}

通过 Redis 验证短信是否发送

private Boolean checkMobile(String mobile) {
    String randomKey = "random:" + mobile;

    return redisHelper.get(randomKey) != null;
}

短信发送成功后需要将手机号和验证码成对存储于 Redis 中,以供之后使用

private void saveRandom(String mobile, String random) {
    String randomKey = "random:" + mobile;

    if (checkMobile(mobile)) {
        return;
    }

    redisHelper.set(randomKey, random);

    // 5分钟失效
    redisHelper.expire(randomKey, 5, TimeUnit.MINUTES);
}

相关文章:

  • Slog80_打包ArthurSlogMarkdownEditor编辑器至mac平台dmg安装包GET!
  • 一个网站同时监听两个端口
  • DataSet数据转换string字符串
  • Android 各种路径详细说明
  • 【SQL Server DBA】日常巡检1:数据库空间、状态、使用的监控
  • Java并发编程之Java CAS操作
  • jvm对类的加载顺序测试
  • Python正则表达式初识(二)
  • public protected private与this用法
  • 笠翁对韵(全卷,珍藏版附注释)
  • 独领风骚的开源接口管理平台 YApi v1.3.23 发布
  • SQL Server页类型汇总+疑问
  • 实验报告二
  • JS页面跳转并及时刷新
  • WinServer2008安装MySql
  • Angular 响应式表单之下拉框
  • CentOS7 安装JDK
  • Git同步原始仓库到Fork仓库中
  • Java的Interrupt与线程中断
  • Java新版本的开发已正式进入轨道,版本号18.3
  • laravel5.5 视图共享数据
  • learning koa2.x
  • Promise面试题,控制异步流程
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • 浮现式设计
  • 简单实现一个textarea自适应高度
  • 聊聊hikari连接池的leakDetectionThreshold
  • 目录与文件属性:编写ls
  • 前端面试题总结
  • 如何解决微信端直接跳WAP端
  • 十年未变!安全,谁之责?(下)
  • 微信公众号开发小记——5.python微信红包
  • postgresql行列转换函数
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • #HarmonyOS:Web组件的使用
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (搬运以学习)flask 上下文的实现
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)Linux——Linux常用指令
  • (分布式缓存)Redis持久化
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (十三)Maven插件解析运行机制
  • (五)c52学习之旅-静态数码管
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)fock函数详解
  • (转)shell中括号的特殊用法 linux if多条件判断
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .Net各种迷惑命名解释
  • .net图片验证码生成、点击刷新及验证输入是否正确