Spring Boot(十三) 优雅的使用短信服务

338 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情

大家好! 我是慕歌,一只想教你学习 Spring Boot的野生coder! 欢迎来到慕歌的 Sping boot系列教程,希望通过这个教程带大家搭建基础的 Spring Boot项目,该教程所有知识点均来源于本人的真实开发!

前言

在上一节的学习中,慕歌教大家搭建基础的华为云短信服务的线上申请,由于如今短信服务的限制,导致使用第三方的短信服务时需要我们提供辅助材料才能使用服务。并且使用短信服务的时候,对我们的短信内容进行审核,需要满足审核要求才能使用短信服务。上一节中介绍了华为云短信中的三个概念,应用,签名,模板在后续 的使用中都会有体现,下面开始这一节的服务使用。

引入

这里依旧使用基础的spring boot 环境,以及web 服务,通过接口使用华为云的短信服务

		<!--   web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
		<!-- io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

        <!--       华为 -->
        <dependency>
            <groupId>com.huawei.wienerchain</groupId>
            <artifactId>wienerchain-java-sdk</artifactId>
            <version>2.1.0.6.41</version>
        </dependency>

        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-tcnative-boringssl-static</artifactId>
        </dependency>

引入以上依赖后,还需要使用华为云的镜像库,部分api 的使用需要借助华为云镜像,使用镜像库的依赖包

	 <repositories>
        <repository>
            <id>huaweicloud</id>
            <name>*</name>
            <url>https://mirrors.huaweicloud.com/repository/maven</url>
        </repository>
        <repository>
            <id>maven-proxy</id>
            <url>https://repo.huaweicloud.com/repository/maven/huaweicloudsdk</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
                <checksumPolicy>fail</checksumPolicy>
            </snapshots>
        </repository>
    </repositories>

开发:

引入基本环境后再依赖线上开通的华为云服务就可以使用华为云短信服务:

//无需修改,用于格式化鉴权头域,给"X-WSSE"参数赋值
private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"";
//无需修改,用于格式化鉴权头域,给"Authorization"参数赋值
private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\"";
private static String receiver = "";//短信接收人号码
private static final String url = "https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1";
private static final String appKey = "***********";//APP_Key
private static final String appSecret = "***********";//APP_Secret
private static final String sender = "***********";//国内短信签名通道号或国际/港澳台短信通道号
private static String templateId = "";//模板ID
private static final String signature = "********";//签名名称
private static final String statusCallBack = "";//选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告
private static String templateParas = "";//模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。

这里的配置参考线上华为云配置,需要与服务一致才能使用,这里需要使用到上一节中线上配置的应用与签名。
后续需要使用华为云的短信模板,根据模板内容接入方法,传入的参数就是我们的变量,变量的内容需要与申请的模板变量内容一致。

/**
     * 发送短信验证码
     * @param mobile 短信接收号码
     * @param code   六位随机数
     * @return
     */
    public boolean sendCode(String mobile, Integer code) {
        receiver = mobile;
        templateParas = "[\""+code+"\"]";
        templateId = "******************";
        try{
            return send();
        }catch (Exception e){
            return false;
        }
    }

    /**
     * 发送短信通知
     * @param mobile 短信接收号码
     * @param time   时间(yyyy-MM-dd、yyyy年mm月dd日)
     * @return
     */
    public boolean sendMsg(String mobile, String time) {
        receiver = mobile;
        templateParas = "[\""+time+"\"]";
        templateId = "*****************";
        try{
            return send();
        }catch (Exception e){
            return false;
        }
    }

模板方法对应申请的模板,模板号与我们申请的模板号对应,模板变量根据我们的业务内容进行填充,这里的三个示例可供大家进行参考,分别是短信服务,通知服务,这两种服务是我们日常使用最多的服务,大家如有兴趣,可参考使用。
真实接口使用的示例:

	@Autowired
    RedisUtils redis;
	/**
     * 发送短信验证码并存入缓存
     */
    @Override
    public boolean sendCode(String mobile, String type){
        int code = (int)((Math.random()*9+1)*100000);
        SendSms send = new SendSms();
        try {
            if (!send.sendCode(mobile,code)){
                return false;
            }
            boolean data = redis.set("{type:"+type+",k:"+mobile+"}",code, 180);
            if (data){
//                if (UserConstant.USER_ID != null){
//                    userLogService.log("发送短信验证","手机号码:"+mobile+",验证码:"+code);
//                }
                return true;
            }
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

结语

这一章的分享到这里就结束了,下一节中还将带来项目maven 操作的分享!
如果您觉得本文不错,欢迎点赞支持,您的关注是我坚持的动力!