开发者社区> asing1elife> 正文

Java 实现阿里云短信

简介: 版权声明:本文首发 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);
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java实现单词计数MapReduce
本文分享实现单词计数MapReduce的方法
94 0
JAVA 实现上传图片添加水印(详细版)(上)
JAVA 实现上传图片添加水印(详细版)
176 0
Java 实现汉字按照首字母分组排序
Java 实现汉字按照首字母分组排序
123 0
Java实现图书管理系统
本篇文章是对目前Java专栏已有内容的一个总结练习,希望各位小主们在学习完面向对象的知识后,可以阅览本篇文章后,自己也动手实现一个这样的demo来加深总结应用已经学到知识并进行巩固。
143 0
java实现spring boot项目启动时,重启Windows进程
java实现spring boot项目启动时,重启Windows进程
169 0
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
如果要在某一个界面里面添加功能的话,都在一个类中,会显得代码难以阅读,而且修改起来也会很困难,所以我们将游戏主界面、登录界面、以及注册界面都单独编成一个类,每一个类都继承JFrame父类,并且在类中创建方法来来实现页面
112 0
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
ip地址的分类: 1、ipv4、ipv6 127.0.0.1:4个字节组成,0-255,42亿;30亿都在北美,亚洲就只有4亿 2011年就用尽了。
104 0
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现
注意由于我们计步功能的步数要在重写方法中用到,所以不能将初始化语句写在方法体内,而是要写在成员位置。在其名字的时候也要做到“见名知意”,所以我们给它起名字为step
73 0
Java实现拼图小游戏(7)—— 作弊码和判断胜利
当我们好不容易把拼图复原了,但是一点提示也没有,完全看不出来是成功了,那么我们就需要有判断胜利的功能去弹出“成功”类的图片,以便于玩家选择是重新开始还是退出小游戏
72 0
Java实现拼图小游戏(7)——查看完整图片(键盘监听实例2)
由于在移动和图片中我们已经添加了键盘监听,也继承了键盘监听的接口,那么我们只需要在重写方法内输入我们的代码即可
46 0
+关注
asing1elife
life is simple , just coding ...
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Java工程师必读手册
立即下载
Java应用提速(速度与激情)
立即下载
Java单元测试实战
立即下载