专栏首页建站教程java实现发短信功能---腾讯云短信
原创

java实现发短信功能---腾讯云短信

前言

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

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

开发环境

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

腾讯云 ---短信

  1. 找到腾讯云短信服务
  1. 开通之后,点击添加应用
  1. 设置短信签名(以公众号为例),签名类型选择公众号或小程序,其余按照要求填写即可
  1. 签名完成之后,创建短信模板
  1. 等待以上信息审核完成之后,便可以开始使用了,腾讯短信服务需要用到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("系统参数异常");
        }
    }
}
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. 一号短信模板
  1. 二号短信模板
  1. 设置短信配置信息

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

相关文章

  • 腾讯云短信服务的申请和验证使用详细流程

    项目中用到短信验证功能,看到腾讯云有短信服务,就直接使用了,当然其它公司也会停工短信服务,百度可以找到很多,使用的情况应该大同小异,这里就以腾讯云的短信服务为例...

    React架构设计
  • java对接腾讯云短信,通过api发送短信

    腾讯云短信(Short Message Service,SMS)沉淀腾讯十多年短信服务技术和经验,为 QQ、微信等亿级平台和10万+客户提供快速灵活接入的高质量...

    方志朋
  • Adobe Flash Player木马惊现新变种

    最近暗影安全实验室在日常监测中发现了一款新的木马病毒Ginp,虽然他和前两周发布的反间谍之旅004报告中描述的“Flash Player”木马病毒名称很相似都带...

    FB客服
  • 腾讯云短信接口服务

    做个小程序需要发送验证码,短信接口是腾讯云的。了解官方的sdk和demo发现对于我这种浅层次的人来说太麻烦了,然后就从网上找了一版。短信服务开通可以访问 腾讯...

    聚优云惠
  • [微服务架构]及联问题和断路器

    及联问题是一个很严重的问题,它的现象是多个业务共用一个资源池,如果其中一个业务访问外部系统,当外部系统响应缓慢,且访问量大的时候,这个业务会占用所有的资源池 ,...

    逝兮诚
  • Magicodes.Sms短信库的封装和集成

    如果使用Abp相关模块,则使用起来比较简单,具体您可以参考相关单元测试的编写。主要有以下步骤:

    雪雁-心莱科技
  • 借助云开发实现小程序短信验证码的发送

    是不是感觉实现起来特别简单,怎么说呢,我们代码调用其实就这么几行,就可以实现短信的发送,但是腾讯云短信模板的审核比较繁琐,还有我们先去申请短信模板,短信模板审核...

    编程小石头
  • SpringSecurity & OAuth2实现短信验证码方式获取AccessToken

    Spring提供的原生的OAuth2依赖内置了几种比较常用的授权方式:password、authorization-code、client_credential...

    恒宇少年
  • 苹果指控前芯片架构师窃取商业机密,员工反诉苹果侵犯隐私

    近日,苹果将曾担任苹果iPhone和iPad芯片的首席架构师杰拉德·威廉姆斯(Gerard Williams)告上法庭,该诉讼称,威廉姆斯仍在苹果工作期间创办了...

    镁客网

扫码关注云+社区

领取腾讯云代金券