SpringBoot 阿里云发送短信的小例子

SpringBoot 发送短信验证码

阿里云账户要有一点钱

1.创建用户信息

1.申请一个阿里云的账号

2. 打开控制台 ,点击个人头像,找到AccessKey 管理,点击打开

3.点击进入之后会看到这个,一定要保管好这个accesskey 不要泄露,选择使用子用户的

image-20200809183339864.png

4.新建一个用户组

微信截图_20200809183332.png

点击创建用户组,然后根据提示填写即可

微信截图_20200809183552.png

创建完成之后点击新建的用户组进去

微信截图_20200809183740.png

5. 给用户组添加权限

找到权限管理,添加权限

微信截图_20200809184056.png

输入SMS点击管理短信服务,跳到有边,点击确定即可

6.创建用户

微信截图_20200809184350.png
微信截图_20200809184504.png

根据提示填写就可以

编程访问一定要勾选上,因为我们是通过代码操作的

点击确定即可

创建用户之后点击进入会看到这个用户的所有信息

微信截图_20200809185002.png

这里的accesskeyid accessSecret 一定要妥善保管,因为一旦创建了用户之后就看不到密码了,如果泄露,要即使禁用或者删除

然后点击加入的组,将刚才创建好的用户组添加进去即可

该子用户会继承用户组的权限

2. 开通短信服务

1. 在控制台首页直接搜索短信服务 即可 ,点击进入

2.第一次进入他会让开通短信服务,直接同意开通即可,可以自己查看计费规则及其他的信息

3.添加短信的模板

微信截图_20200809190251.png
微信截图_20200809191056.png

根据提示填写就可以,一定不要乱写,填写正当理由,审核未通过接着审核就行

${code}这个一定要有,不要修改他,要通过这个将验证码的变量传进去

4. 添加签名

image-20200809191419460.png

第一次进去的时候验证码是可以选用的,选用验证码就行,因为我申请过了,所以不能在选择了

一定要等审核通过了才可以使用

5. 找到帮助文档 打开找到SDK参考选择java的,正常公司的开发都是使用SDK方式的,这里也是使用这个方式

这个帮助文档有api参考,可以自行了解

image-20200809212454730.png

进入官方的demo中

3.代码阶段

pom.xml 在pom.xml中导入以下依赖

<!--导入依赖sms  发送短信的核心依赖-->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.3</version>
</dependency>
<!--FastJson 对于数据的处理的依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.73</version>
</dependency>
<!--redis  因为短信验证码都是几分钟后无法使用,所以放在redis中-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.3.2.RELEASE</version>
</dependency>

先测试一下能不能使用,直接将官方的demo代码复制放到测试类中测试一下

/**
* <accessKeyId> 你自己的 accessKeyId      相当于账号
* accessSecret  在创建用户时的 accessSecret 相当于密码
*/
@Test
void contextLoads() {
    DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
   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", "接受短信的手机号");
        //签名名称
        request.putQueryParameter("SignName", "刚才定义好的签名名称");
        //模板code
        request.putQueryParameter("TemplateCode", "自定义短信模板的模板CODE编码");
        //构建一个短信验证码
        Map<String,Object> map  = new HashMap<>();
        map.put("code","1234");
        //将定义好的验证码放入进去
        //短信验证码
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));
    try {
        CommonResponse response = client.getCommonResponse(request);
        //控制台打印返回的信息
        System.out.println(response.getData());
    } catch (ServerException e) {
        e.printStackTrace();
    } catch (ClientException e) {
        e.printStackTrace();
    }
}

在导包的时候一定不要导错了,导阿里云的,有些包是重名的

测试发送短信

{"Message":"OK","RequestId":"D12E6D53-3A2B-4342-87CE-8B78C9A5A8FC","BizId":"174403396982142436^0","Code":"OK"}

在控制台看到这句话就证明短信发送成功了

是不是已经收到短信了!

发送短信的正式代码

controller

package com.mango.controller;

import com.mango.Service.SendSmsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;


/**
 * @Author:  
 * @Date:     2020/8/9 22:11
 * @CrossOrigin//跨域支持
 */
@RestController
@CrossOrigin
public class SendSmsApiController {

    @Autowired
    private SendSmsService sendSmsService;
    /**
     * 使用redis的模板
     */
    @Autowired
    private RedisTemplate<String,String> redisTemplate;
    @GetMapping("/send/{phone}")
    public String sendSms(@PathVariable("phone")String phone){
        //调用发送短信的方法(使用redis)
        //获取redis中的手机号
        String code = redisTemplate.opsForValue().get(phone);
        //判断当前的code的不为空
        if(!StringUtils.isEmpty(code)){
            return phone+":"+code +"已存在,还没有过期";
        }
        //否则就是没有验证码,生成验证码并且存储到redis中,设置他的过期时间
        //生成随机验证码
        code = UUID.randomUUID().toString().substring(0, 4);
        HashMap<String, Object> map = new HashMap<>();
        map.put("code",code);
        //发送短信
        boolean isSend = sendSmsService.sendSms(phone, "自定义短信模板的模板CODE编码", map);

        if(isSend){
            //如果短信发送成功就放入到redis中,设置5分钟之后过期
            redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
            return phone+":"+code +"发送成功";
        }else {
            return "发送成功";
        }
    }
}

service

package com.mango.Service;

import java.util.Map;

/**
 * @Author:  
 * @Date:     2020/8/9 22:12
 */
public interface SendSmsService {

    /**
     * @param phoneNum  发送的手机号
     * @param TemplateCode  短信模板的code
     * @param code          验证码
     * @return
     */
    public boolean sendSms(String phoneNum, String TemplateCode , Map<String,Object> code);
}

servcieImpl

package com.mango.Service.impl;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.mango.Service.SendSmsService;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * @Author:  
 * @Date:     2020/8/9 22:12
 */
@Service
public class SendSmsImpl implements SendSmsService {

    /**
     * @param phoneNum     发送的手机号
     * @param TemplateCode 短信模板的code
     * @param code         验证码
     * @return
     */
    @Override
    public boolean sendSms(String phoneNum, String TemplateCode, Map<String, Object> code) {
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
        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", phoneNum);
        //签名名称
        request.putQueryParameter("SignName", "刚才定义好的签名名称");
        //模板code
        request.putQueryParameter("TemplateCode", TemplateCode);
        //短信验证码
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));
        try {
            CommonResponse response = client.getCommonResponse(request);
            //这个是他自带的判断他发送的是否成功,成功就直接返回
            return response.getHttpResponse().isSuccess();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return false;
    }
}

application.yml

server:
  port: 8090

# redis  我这里使用的是本地的redis
spring:
  redis:
    host: 127.0.0.1  
    port: 6379

现在看下是不是已经发送成功了!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355