zoukankan      html  css  js  c++  java
  • java实现发短信功能---腾讯云短信

    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. 设置短信配置信息

      配置

    结束语

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

    公众号

  • 相关阅读:
    python 数据结构与算法之排序(冒泡,选择,插入)
    python 面向对象基础和高级复习
    python numpy模块
    高精度算法
    数论
    位运算和时间复杂度的分析
    C++ OI图论 学习笔记(初步完结)
    C++语言入门知识点(详细版)【持续更新每周三更】,小舒舒戳这里!!!
    C++基础语言知识大汇总(不断更新!!!)
    二分
  • 原文地址:https://www.cnblogs.com/L-Wirepuller/p/11337086.html
Copyright © 2011-2022 走看看