java实现发短信功能

前言

如今发短信功能已经成为互联网公司的标配,本篇文章将一步步实现java发送短信

考察了许多提供短信服务的三方,几乎所有都需要企业认证才可以使用,这对于个人学习非常不方便。多方比较之后,选择了腾讯云(此处并非做广告),原因有两点:

  1. 支持微信公众号认证(门槛低)
  2. 每月赠送100条免费短信(适合个人学习)(这一点请矿家子弟自行忽略)

免费短信

开发环境

请参照: 基于SpringBoot构建分模块项目

腾讯云 —短信

  1. 找到短信服务

    短信服务

  2. 开通之后,点击添加应用

    添加应用

  3. 设置短信签名(以公众号为例),签名类型选择公众号或小程序,其余按照要求填写即可

    设置签名

  4. 签名完成之后,创建短信模板

    创建模板

  5. 等待以上信息审核完成之后,便可以开始使用了,腾讯短信服务需要用到SDK AppID 和App Key ,在这里:

    公钥私钥

代码

  1. pom.xml引入依赖

    <properties>
        <java.version>1.8</java.version>
        <!-- 你的其他依赖。。。 -->
        <tencent.qcloudsms.version>1.0.6</tencent.qcloudsms.version>
    </properties>
    
    <dependencies>
        <!-- 你的其他依赖。。。 -->
        <!-- 腾讯短信 -->
        <dependency>
            <groupId>com.github.qcloudsms</groupId>
            <artifactId>qcloudsms</artifactId>
            <version>${tencent.qcloudsms.version}</version>
        </dependency>
    </dependencies>
    
  2. 发送短信工具类

    package com.wayne.common.utils;
    
    import com.github.qcloudsms.*;
    import com.github.qcloudsms.httpclient.HTTPException;
    import com.wayne.common.entity.CmsMessageConfig;
    import com.wayne.common.exception.CustomException;
    import com.wayne.common.form.MessageForm;
    import org.json.JSONException;
    
    import java.io.IOException;
    
    /**
     * 发送短信工具类
     * @author Wayne
     * @date 2019/6/26
     */
    public class MessageUtils {
    
        /**
         * 按模板发送短信 支持单发和群发
         * @param isSingle 是否单发 true: 单发,false: 群发
         * @param form 需要发送的短信内容及收信人手机号
         * @param config 短信配置
         * @throws CustomException 发送失败时捕获的异常信息
         */
        public static void sendMessage(Boolean isSingle, MessageForm form, CmsMessageConfig config) throws CustomException {
            validateMessage(form, config);
            String regex = ";";
            String[] params = {form.getCaptcha()};
            String[] phoneNumbers = form.getMobiles().split(regex);
    
            SmsResultBase result;
    
            try {
                // 是否单发
                if (isSingle) {
                    SmsSingleSender ssender = new SmsSingleSender(config.getAppId(), config.getAppKey());
                    result = ssender.sendWithParam("86", phoneNumbers[0], config.getTemplateId(), params, config.getSmsSign(), "", "");
                } else {
                    SmsMultiSender msender = new SmsMultiSender(config.getAppId(), config.getAppKey());
                    result =  msender.sendWithParam("86", phoneNumbers, config.getTemplateId(), params, config.getSmsSign(), "", "");
                }
                System.out.println(result);
            } catch (HTTPException e) {
                e.printStackTrace();
                throw new CustomException("HTTP响应码错误");
            } catch (JSONException e) {
                e.printStackTrace();
                throw new CustomException("json解析错误");
            } catch (IOException e) {
                e.printStackTrace();
                throw new CustomException("网络IO错误");
            }
        }
    
        /**
         * 校验参数
         */
        private static void validateMessage(MessageForm messageForm, CmsMessageConfig messageConfig) throws CustomException {
            ValidatorUtils.validateEntity(messageForm);
            if (null == messageConfig) {
                throw new CustomException("系统参数异常");
            }
        }
    }
    
  3. CmsMessageConfig配置类

       package com.wayne.common.entity;
       
       import lombok.Data;
       
       import javax.persistence.*;
       
       @Data
       @Table(name = "cms_message_config")
       public class CmsMessageConfig {
           /**
            * 主键
            */
           @Id
           @Column(name = "ID")
           private Integer id;
       
           /**
            * AppID
            */
           @Column(name = "APP_ID")
           private Integer appId;
       
           /**
            * AppKey
            */
           @Column(name = "APP_KEY")
           private String appKey;
       
           /**
            * 短信模板ID
            */
           @Column(name = "TEMPLATE_ID")
           private Integer templateId;
       
           /**
            * 签名内容
            */
           @Column(name = "SMS_SIGN")
           private String smsSign;
       
           /**
            * 是否删除,0:否,1:是
            */
           @Column(name = "IS_DELETE")
           private String isDelete;
       
           /**
            * 状态,0:使用,1:未使用 (同一时间应最多只有一条数据处于使用状态)
            */
           @Column(name = "IS_USE")
           private String isUse;
       
           /**
            * 创建者ID
            */
           @Column(name = "CREATE_ADMIN_ID")
           private Integer createAdminId;
       
           @Column(name = "EXTEND1")
           private String extend1;
       
           @Column(name = "EXTEND2")
           private String extend2;
       
           @Column(name = "EXTEND3")
           private String extend3;
       
           @Column(name = "EXTEND4")
           private String extend4;
       
           @Column(name = "EXTEND5")
           private String extend5;
       
           @Column(name = "EXTEND6")
           private String extend6;
       }
    
  4. Service

       @Override
       public ResponseBean sendMessage(MessageForm messageForm) {
           ValidatorUtils.validateEntity(messageForm);
       
           // 获取正在使用的短信配置: 此处为 从数据库中查询
           CmsMessageConfig messageConfig = getCurrUseMessageConfig();
       
           try {
               // 发送短信
               MessageUtils.sendMessage(Boolean.FALSE, messageForm, messageConfig);
           } catch (CustomException e) {
               e.printStackTrace();
               return ResponseBean.createInstance(Boolean.FALSE, 401, e.getMessage());
           }
       
           return ResponseBean.createInstance();
       }
    
  5. Controller

       @PostMapping("/message/sendMessage")
       public ResponseBean sendMessage(MessageForm messageForm) {
           return messageService.sendMessage(messageForm);
       }
    

效果

  1. 一号短信模板模板一

  2. 二号短信模板

    模板二

  3. 设置短信配置信息

    配置

结束语

最后,本人已开通公众号,欢迎大家前来灌水

公众号

版权声明:本文为L-Wirepuller原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/L-Wirepuller/p/11337086.html