SpringBoot集成阿里云短信服务----实现发送验证码/通知短信功能

一、阿里云账号准备

1、注册阿里云账号:支付宝/淘宝/手机号等方式登录即可;
2、登录成功后,
① 在首页搜索短信服务
在这里插入图片描述
② 打开第一个搜索结果
在这里插入图片描述
③ 免费开通
在这里插入图片描述
③ 可以根据提示立即更新个人/公司信息(即新增资质),也可以点击取消(根据个人需求选择,如果是自己玩,跳过即可。如果是项目集成,请立即补充,因为实际项目发短信必须要资质)

注:资质名称即短信 开头【】中的名称 :

【阿里云】您正在登录阿里云账号,请您....!

在这里插入图片描述
④ 新增资质:根据图中红框标识,查看申请说明(建议了解规则,避免新增资质失败)

在这里插入图片描述

二、短信服务控制台

1、打开快速学习和测试

注:红框标识中的步骤必须完成!后两个步骤属于实际项目中的防护操作!
在这里插入图片描述

2、测试

① api测试:绑定手机号,选择测试模板(如果已申请短信模板,选择相应的模板测试即可),点击调用API发送短信,测试手机号收到短信!
在这里插入图片描述

② 控制台测试(此种方式优先推荐测试):选择测试模板,模板选择验证码(通知类型经测试也是默认验证码短信内容,要想实现自定义效果,需要先申请模板),自行输入接收短信的手机号
在这里插入图片描述

③ api调用测试:控制台测试中,有查看API demo 按钮,点击即可跳转

注:此种方式调用,需要准备好签名、短信模板才可以!
在这里插入图片描述
④ 代码测试:选择sdk示例,根据需求选择相应开发语言代码的示例到本地,写个测试方法

注:此种方式调用,需要准备好签名、短信模板、秘钥才可以!
在这里插入图片描述

三、秘钥准备

1、点击头像,选择AccessKey 管理
在这里插入图片描述
2、如果没有账号,选择开始使用子用户(细化权限,互不影响使用)
在这里插入图片描述
① 使用AccessKey 管理
在这里插入图片描述

② 选择开始使用子用户

1》选择创建用户
在这里插入图片描述
2》创建用户

注意:名称格式为英文字母、数字、.、_或-。
在这里插入图片描述
3》 下载文件/获取秘钥信息

注:可以从下载的CSV文件中获取,也可以直接复制AccessKey ID / AccessKey Secret

在这里插入图片描述
4》子用户管理
在这里插入图片描述
添加用户组:
用户组可能以项目为维度,比如用户组1为电商项目,用户组2为教培项目。
也可能以用户权限维度,比如用户组1,只能读,用户组2只能写。

添加用户权限:
具体到该用户有哪些权限:

在这里插入图片描述
总之按需选择,比如我们只需要短信,查找sms相关的选择即可:
在这里插入图片描述

四、短信服务相关准备

在这里插入图片描述
1、资质管理
需要新增
2、签名管理:资质通过后,会有赠送的签名,如果不满足需求,可以新增签名!
在这里插入图片描述
3、模板管理

注:只要开通短信服务,会赠送一个短信验证码模板

① 验证码模板申请:
在这里插入图片描述

② 通知模板申请:

注意点:变量命名,以及变量类型选择!

在这里插入图片描述

项目集成

1、引入依赖

官方文档-集成阿里云短信服务

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>dysmsapi20170525</artifactId>
  <version>3.0.0</version>
</dependency>

2、测试类:引入官方代码示例测试

package com.aliyun.sample;

import com.aliyun.teaopenapi.models.Config;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import static com.aliyun.teautil.Common.toJSONString;

public class Sample {
    public static Client createClient() throws Exception {
        Config config = new Config()
                // 配置 AccessKey ID
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // 配置 AccessKey Secret
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        
        // 配置 Endpoint
        config.endpoint = "dysmsapi.aliyuncs.com";

        return new Client(config);
    }

    public static void main(String[] args) throws Exception {
        // 初始化请求客户端
        Client client = Sample.createClient();

        // 构造请求对象,请填入请求参数值
        SendSmsRequest sendSmsRequest = new SendSmsRequest()
                .setPhoneNumbers("<YOUR_VALUE>")
                .setSignName("<YOUR_VALUE>")
                .setTemplateCode("<YOUR_VALUE>")
                .setTemplateParam("<YOUR_VALUE>");

        // 获取响应对象
        SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest);

        // 响应包含服务端响应的 body 和 headers
        System.out.println(toJSONString(sendSmsResponse));
    }
}

我们进行修改:

    private static final String accessKeyId = "输入你的accessKeyId ";
    private static final String accessKeySecret = "输入你的accessKeySecret ";
    // 一般默认Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
    private static final String endpoint = "dysmsapi.aliyuncs.com";
    // 签名名称(申请签名后,加需要测试的签名名称即可))
    private static final String signName = "阿里云短信测试";
    public static com.aliyun.dysmsapi20170525.Client createClient() throws Exception {
     
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                .setAccessKeyId(accessKeyId)
                .setAccessKeySecret(accessKeySecret);
        config.endpoint = endpoint;
        return new com.aliyun.dysmsapi20170525.Client(config);
    }

    public static void main(String[] args_) throws Exception {
        com.aliyun.dysmsapi20170525.Client client =  createClient();
        com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()          
                .setTemplateCode("你的测试模板code")
                .setPhoneNumbers("你的测试手机号")
                .setSignName(signName)
                // 短信验证码只能是数字,随机数/自定义数字即可
                .setTemplateParam("{\"code\":\"6688\"}");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            System.out.println("发送短信请求参数:\n" + JSONUtil.toJsonPrettyStr(sendSmsRequest));
            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);
            System.out.println("发送短信响应参数:\n" + JSONUtil.toJsonPrettyStr(sendSmsResponse));
        } catch (TeaException error) {
            System.out.println(error.getMessage());
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            System.out.println(error.getMessage());
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

正式项目集成:

官方sdk文档说明

1、配置文件

# 命名规则可以是小驼峰,也可以是小写+下划线
aliyun:
  sms:
    # 从你的阿里云accessKey管理中获取
    accessKeyId:
    accessKeySecret:
      # 域名(一般默认) Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
    endpoint: dysmsapi.aliyuncs.com
      # 签名名称
    signName: 阿里云短信测试
      # 验证码短信模板code
    smsCodeTemplateCode:

2、配置类(获取秘钥等信息创建客户端)

备注:可以优化配置类,读取配置参数,比如读取统一前缀优化等!

@Component
public class SmsClientConfig {

    //阿里云账号的accessKeyId
    @Value("${aliyun.sms.accessKeyId}")
    private String accessKeyId;
    //阿里云账号的accessKeySecret
    @Value("${aliyun.sms.accessKeySecret}")
    private String accessKeySecret;
    //短信服务访问的域名
    @Value("${aliyun.sms.endpoint}")
    private String endpoint;

    @Bean("smsClient")
    public Client createClient() throws Exception {
        Config config = new Config().setAccessKeyId(accessKeyId).setAccessKeySecret(accessKeySecret);
        config.endpoint = endpoint;
        return new Client(config);
    }
}

3、集成代码

① 创建接口

public interface SendCodeService {
  /**
     * 发送短信验证码
     * @param phoneNumbers
     */
    void  sendSmsCode(String phoneNumbers);

    /**
     * 发送短信通知
     * @param phoneNumbers
     * @param notifyTypeCode
     */
    void  sendSmsNotify(String phoneNumbers,Integer notifyTypeCode);
    
}

② 创建接口实现类


@Service
@Slf4j
public class SendCodeServiceImpl implements SendCodeService {
    
    @Autowired
    private Client smsClient;

    @Value("${aliyun.sms.signName}")
    private String signName;


    @Value("${aliyun.sms.smsCodeTemplateCode}")
    private String smsCodeTemplateCode;
    
    @Override
    public void sendSmsCode(String phoneNumbers) {
        String randomCode = String.valueOf(RandomUtil.randomInt(100000, 999999));
        HashMap<Object, Object> templateParamMap = Maps.newHashMap();
        templateParamMap.put("code",randomCode);
        /**
         * 必输字段
         */
        SendSmsRequest sendSmsRequest = new SendSmsRequest();
        sendSmsRequest.setPhoneNumbers(phoneNumbers);
        sendSmsRequest.setSignName(signName);
        sendSmsRequest.setTemplateCode(smsCodeTemplateCode);
        sendSmsRequest.setTemplateParam(JSONUtil.toJsonStr(templateParamMap));
        try {
            SendSmsResponse sendSmsResponse = smsClient.sendSmsWithOptions(sendSmsRequest, new RuntimeOptions());
            // 200为成功
            SendSmsResponseBody body = sendSmsResponse.getBody();
            // code和message为OK成功
            String code = body.getCode();
            String message = body.getMessage();
            if (StrUtil.equals("OK", code) && StrUtil.equals("OK", message)) {
                log.info("向 手机号:{} 用户发送短信验证码成功!", phoneNumbers);
            } else {
                log.warn("向 手机号:{} 用户发送短信验证码失败!", phoneNumbers);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


 @Override
    public void sendSmsNotify(String phoneNumbers,Integer notifyTypeCode) {
        // 通知短信模板code(多个通知模板时,此处建议创建通知模板枚举类,根据notifyTypeCode来获取枚举信息)
        String templateCode = "你申请的通知短信模板code";
        // 根据短信模板中的变量,传入对应的参数值,以下为示例:模板内容:亲爱的${name},您的订单${orderId}已发货,快递公司${company},快递单号${number},收货地址${location}。
        HashMap<Object, Object> templateParamMap = Maps.newHashMap();
        templateParamMap.put("name","淘宝昵称(变量)");
        templateParamMap.put("orderId","订单(变量)");
        templateParamMap.put("company","快递公司(变量)");
        templateParamMap.put("number","快递单号(变量)");
        templateParamMap.put("location","收货地址(变量)");
        /**
         * 必输字段
         */
        SendSmsRequest sendSmsRequest = new SendSmsRequest();
        sendSmsRequest.setPhoneNumbers(phoneNumbers);
        sendSmsRequest.setSignName(signName);
        sendSmsRequest.setTemplateCode(templateCode);
        sendSmsRequest.setTemplateParam(JSONUtil.toJsonStr(templateParamMap));
        try {
            SendSmsResponse sendSmsResponse = smsClient.sendSmsWithOptions(sendSmsRequest, new RuntimeOptions());
            // 200为成功
            SendSmsResponseBody body = sendSmsResponse.getBody();
            // code和message为OK成功
            String code = body.getCode();
            String message = body.getMessage();
            if (StrUtil.equals("OK", code) && StrUtil.equals("OK", message)) {
                log.info("向 手机号:{} 用户发送短信通知成功!", phoneNumbers);
            } else {
                log.warn("向 手机号:{} 用户发送短信通知失败!", phoneNumbers);
            }
        } catch (Exception error) {
            log.error("发送短信验证码异常:{}",error);
            // 注意点:此处是否需要异常处理,需要根据实际情况进行修改
            TeaException teaError = new TeaException(error.getMessage(), error);
            com.aliyun.teautil.Common.assertAsString(teaError.message);
        }
    }

}

四、高级配置

1、短信发送回执设置

在这里插入图片描述

2、国内消息设置(发送频率、联系人设置等)
在这里插入图片描述

五、短信服务注意点

1、发送频率:每分钟/每小时/每日 防刷
2、发送条数限制:同一模板下,同一手机号每日50条!(特殊场景会涉及)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值