SpringBoot实现短信发送功能(阿里云短信服务)

SpringBoot短信发送功能

这里我采用的是阿里云提供的短信服务,且无需我们写几行代码,阿里云自动帮我们写好了代码,只需要拿来用即可

一、购买短信套餐

因为做测试用所以我是直接在官网上领的免费试用100条,公司有大需求的话也可以搜索短信服务购买短信套餐即可,一条短信也就几分钱。

在这里插入图片描述

二、创建用户组

创建用户组后会得到一个组,随后可以添加权限
在这里插入图片描述
点进用户组后我们进去权限管理搜索sms就会出现短信服务的权限,添加即可。

在这里插入图片描述

三、添加用户

添加了用户组之后我们还需添加用户,填写好名称(自定义),我们重点是需要勾选上编程访问,
这是我们能够通过编写代码发送短信的前提。
随后我们就会生成一个AccessKey的账号密码,这个一定到记住(拿小本本记下来,关闭后就不会再显示密码了),程序中需要用到。

在这里插入图片描述
随后我们可以将用户添加到用户组里,他会继承用户组的权限,我们也可以自己添加权限。

在这里插入图片描述
在这里插入图片描述

四、开通短信服务

用户测试完后我们就进入到短信模板阶段了,需要添加好签名(短信开头的名称部分)和模板(短信模板),这两个都是需要阿里云审核的所以理由要正当,一般几分钟就审核好了。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

五、查看帮助文档生成代码

短信设置好后我们就可以开始编码环节了,首先我们需要查看一下帮组文档如何使用阿里云的短信服务。点进帮助文档选择SDK参考

在这里插入图片描述
里面就有每门编程语言的使用方法,我们选择java查看一下
在这里插入图片描述

这里面告诉我们需要有java环境并导入依赖就可使用了,如何使用的代码,阿里云也帮我们写好了我们只需要点进OpenAPI Explorer查看代码即可

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>4.5.3</version>
</dependency>

OpenAPI Explorer是一个在线调试工具,可以真实测试发送短信功能,我们可以复制代码到idea中进行开发
在这里插入图片描述

六、编写发送短信的代码

我们在SpringBoot项目的测试方法中进行测试
首先我们需要导入阿里云的发送短信服务的依赖和json转换的依赖
(代码中密码和手机号涉及带个人隐私就没展示,可用你自己的)

   <!--依赖安装阿里云Java SDK核心库。发送短信用-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.3</version>
        </dependency>
        <!--阿里云提供的json转换依赖 转换为json字符串-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.74</version>
        </dependency>
#开启redis服务
spring.redis.host=39.99.247.62
spring.redis.port=6379
 //阿里云发送短信服务 代码由阿里云短信服务平台生成,拿来用即可 配置相关个人信息
    @Test
    void smsMessage(){  //AccessKey ID 账号 AccessKey secret密码
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4G16F251gw8zRaePUPQo", "你自己的密码");
        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("PhoneNumbers", "156161123XX"); //发送给哪个手机号
        request.putQueryParameter("SignName", "清峰小栈");  //自己配置的短信签名
        request.putQueryParameter("TemplateCode", "SMS_205128031"); //自己配置的模板 模版CODE

        //构建一个短信验证码
        HashMap<String, Object> map = new HashMap<>();
        map.put("code",8456);
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));   //转换成json字符串
        try {
            CommonResponse response = client.getCommonResponse(request); //发送至客户端
            System.out.println(response.getData());
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }

运行代码即可收到验证码信息
在这里插入图片描述

七,真实业务开发

在真实业务开发中,我们的验证码是随机生成(可使用UUID生成),并且验证码需要保存并且过一会就要过期(存储到redis中设置过期时间)
1、导入依赖

<!--依赖安装阿里云Java SDK核心库。发送短信用-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.3</version>
        </dependency>
        <!--阿里云提供的json转换依赖 转换为json字符串-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.74</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>

2、编写业务层代码

//接口 传入参数为电话号码,模板编号,验证码
public interface SendSms {

    boolean addSendSms(String PhoneNumbers, String TemplateCode, Map code);

}
@Service
public class SendSmsImpl implements SendSms {

    @Override
    public boolean addSendSms(String PhoneNumbers, String TemplateCode, Map code) {
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4G16F251gw8zRaePUPQo", "你自己的密码");
        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("PhoneNumbers", PhoneNumbers); //发送至手机号
        request.putQueryParameter("SignName", "清峰小栈");  //自己配置的短信签名
        request.putQueryParameter("TemplateCode", TemplateCode); //自己配置的模板 模版CODE

        //构建一个短信验证码

        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));   //转换成json字符串
        try {
            CommonResponse response = client.getCommonResponse(request); //发送至客户端
            System.out.println(response.getData());
            return response.getHttpResponse().isSuccess();//返回是否发送成功
        } catch (ClientException e) {
            e.printStackTrace();
        }

        return false;
    }
}

3、编写控制器代码

@RestController
@CrossOrigin    //跨域请求
public class SendSmsController {

    @Autowired
    SendSms sendSms;

    @Autowired
    RedisTemplate<String,String> redisTemplate;

    @GetMapping("/sms/{phone}")
    public String sendSms(@PathVariable("phone") String phone){
        System.out.println(phone);
        //得到电话,先看查一下redis中有无存放验证码
        String code = redisTemplate.opsForValue().get(phone);
        //有则返回已存在
        if (!StringUtils.isEmpty(code)){
            return phone+":"+code+"已存在,还没有过期!";
        }else {
            //没有则生成验证码,uuid随机生成四位数验证码
            code = UUID.randomUUID().toString().substring(0,4);   //随机生成四个数形成验证码
            HashMap<String, Object> map = new HashMap<>();
            map.put("code",code);
            //调用方法发送信息 传入电话,模板,验证码
            boolean send = sendSms.addSendSms(phone, "SMS_205128031", map);


            //返回ture则发送成功
            if (send){
                //存入redis中并设置过期时间
                redisTemplate.opsForValue().set("phone",code,5, TimeUnit.SECONDS);
                return phone+":"+code+"发送成功!";
            }else {
                //返回false则发送失败
                return "发送失败";
            }
        }
    }
}

代码编写完成,接收前端传来的电话号码即可实现发送验证码到指定电话用户。

  • 7
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先,你需要在阿里云短信控制台中创建签名和模板,并获取到 AccessKeyId 和 AccessKeySecret。 接下来,在Spring Boot项目中添加阿里云 Java SDK的依赖: ``` <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-dysmsapi</artifactId> <version>1.0.0</version> </dependency> ``` 然后,在项目的 application.properties 文件中添加阿里云短信服务的相关配置: ``` aliyun.sms.accessKeyId=yourAccessKeyId aliyun.sms.accessKeySecret=yourAccessKeySecret aliyun.sms.signName=yourSignName aliyun.sms.templateCode=yourTemplateCode ``` 在代码中,你可以使用以下示例代码发送国际短信: ```java import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import com.aliyuncs.sms.model.v20170628.SendSmsRequest; import com.aliyuncs.sms.model.v20170628.SendSmsResponse; import java.util.Arrays; public class SmsUtil { private String accessKeyId; private String accessKeySecret; private String signName; private String templateCode; public SmsUtil(String accessKeyId, String accessKeySecret, String signName, String templateCode) { this.accessKeyId = accessKeyId; this.accessKeySecret = accessKeySecret; this.signName = signName; this.templateCode = templateCode; } public boolean sendSms(String phoneNumber, String message) { IClientProfile profile = DefaultProfile.getProfile("default", accessKeyId, accessKeySecret); DefaultProfile.addEndpoint("default", "default", "Dysmsapi", "dysmsapi.aliyuncs.com"); IAcsClient client = new DefaultAcsClient(profile); SendSmsRequest request = new SendSmsRequest(); request.setPhoneNumbers(phoneNumber); request.setSignName(signName); request.setTemplateCode(templateCode); request.setTemplateParam("{\"code\":\"" + message + "\"}"); try { SendSmsResponse response = client.getAcsResponse(request); if (response.getCode() != null && response.getCode().equals("OK")) { return true; } } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } return false; } public static void main(String[] args) { // 使用示例 SmsUtil smsUtil = new SmsUtil( "yourAccessKeyId", "yourAccessKeySecret", "yourSignName", "yourTemplateCode" ); boolean result = smsUtil.sendSms("+86xxxxxxxxxxx", "yourMessage"); System.out.println(result); } } ``` 其中,phoneNumber 是接收短信的手机号码,message 是短信内容,可以根据模板中定义的变量替换。调用 sendSms 方法即可发送短信

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值