SpringBoot实现发短信功能基于腾讯云短信

前言

如今发短信功能已经成为互联网公司的标配,本篇文章将一步步实现java发送短信
考察了许多提供短信服务的三方,几乎所有都需要企业认证才可以使用,这对于个人学习非常不方便。多方比较之后,选择了腾讯云(此处并非做广告),原因有两点:

  1. 支持微信公众号认证(门槛低)
  2. 每月赠送100条免费短信(适合个人学习)(这一点请矿家子弟自行忽略)。超过100条的时候,
    可以开通收费短信服务-腾讯云短信服务套餐
image

开发环境

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

腾讯云 ---短信

  1. 找到腾讯云短信服务
image
  1. 开通之后,点击添加应用
image
  1. 设置短信签名(以公众号为例),签名类型选择公众号或小程序,其余按照要求填写即可
image
  1. 签名完成之后,创建短信模板
image
  1. 等待以上信息审核完成之后,便可以开始使用了,腾讯短信服务需要用到SDK AppID 和App Key ,在这里:
image

代码

  1. pom.xml引入依赖

    1.8
    
    1.0.6



    
    
    
        com.github.qcloudsms
        qcloudsms
        ${tencent.qcloudsms.version}
    

  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("系统参数异常");
        }
    }
}
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;
   }
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();
   }
Controller

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

效果

  1. 一号短信模板
image
  1. 二号短信模板
image
  1. 设置短信配置信息
image

你可能感兴趣的:(SpringBoot实现发短信功能基于腾讯云短信)