目录



  • java实现发短信功能
  • 前言
  • 开发环境
  • 腾讯云 ---短信
  • 代码
  • 效果
  • 结束语



java实现发短信功能

前言

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

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

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

java 发送短信 需要钱吗 java免费发送短信功能_java 发送短信 需要钱吗

开发环境

请参照: 基于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>
  1. 发送短信工具类
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("系统参数异常");
        }
    }
}
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("系统参数异常");
        }
    }
}
  1. 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;
   }
   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;
   }
  1. 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();
   }
   @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();
   }
  1. Controller
@PostMapping("/message/sendMessage")
   public ResponseBean sendMessage(MessageForm messageForm) {
       return messageService.sendMessage(messageForm);
   }
   @PostMapping("/message/sendMessage")
   public ResponseBean sendMessage(MessageForm messageForm) {
       return messageService.sendMessage(messageForm);
   }

效果

  1. 一号短信模板
  2. java 发送短信 需要钱吗 java免费发送短信功能_发送短信_02

  3. 二号短信模板
  4. 设置短信配置信息