Java 实现阿里云短信

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82788132 ...
版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82788132

Java 实现阿里云短信

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

更多精彩

官网

短信发送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);
}
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
Java 关系型数据库 应用服务中间件
阿里云RDS购买Linux完整过程——安装java环境并跑起来tomcat
阿里云RDS购买Linux完整过程——安装java环境并跑起来tomcat
45 0
|
3月前
sms4j对接阿里云短信
sms4j对接阿里云短信
146 0
|
5月前
|
Java 云计算
阿里云国际站代理商:Java计算当前时间处于某段时间内的第几周、第几个月
@luotuoemo飞机@TG阿里云国际站代理商:Java计算当前时间处于某段时间内的第几周、第几个月,以上就是使用Java代码计算当前时间处于某段时间内的第几周和第几个月的全部内容。通过该篇文章,我们可以了解到如何使用Java的Calendar类以及日期函数来计算时间段内的周数和月数,掌握相应的计算方法和实践技巧。在开发过程中,合理运用这些方法,可以方便地获取时间相关的信息,满足业务需求,提高开发效率。希望本文能对读者在使用阿里云国际站代理商开发Java应用时计算时间段的周数和月数提供一些帮助与启示。
|
1月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
|
6月前
|
Java Linux Docker
阿里云云效流水线自动化构建Java项目并发布到docker环境
阿里云云效流水线自动化构建Java项目并发布到docker环境
338 0
|
2月前
|
监控 Java 测试技术
阿里云推出 3.x Java 探针,解锁应用观测与治理的全新姿势
阿里云推出 3.x Java 探针,解锁应用观测与治理的全新姿势
174249 4
|
30天前
调用阿里云接口实现短信消息的发送源码——CSDN博客
调用阿里云接口实现短信消息的发送源码——CSDN博客
45 0
|
4月前
|
Java Maven
(短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码
(短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码
629 0
|
5月前
|
监控 Java 调度
阿里云 ARMS 应用监控重磅支持 Java 21
阿里云 ARMS 应用监控重磅支持 Java 21
48406 33
|
5月前
|
Java
java阿里云企业邮箱发送邮件
java阿里云企业邮箱发送邮件
3602 0