SpringBoot项目中使用腾讯云发送短信的实现

目录
  • 第一步、申请腾讯云的短信服务并配置基本信息
  • 第二步、我们可以在API Explore中进行一下测试
  • 第三步、安装java的SDK
  • 第四步、在项目中编写代码,调用接口

在一些项目中总会不可避免的要用到短信服务,比如发送验证码等,那么如何进行短信的发送呢,我们这就来捋一捋,我这里采用的是腾讯云的短信服务。其他的云服务也大致一样。

第一步、申请腾讯云的短信服务并配置基本信息

首先进入腾讯云的短信服务界面传送门

https://console.cloud.tencent.com/smsv2

如上图所示,我们会看到要我们申请开通短信服务,开通后它会免费送我们100条国内短信。

接下来我们就要进行相关的配置,首先进行创建签名,按照要求填写就行。

这步之后创建短信正文的模板

创建正文模板我们可以选择使用标准模板。

配置完毕后就等待审核,审核完成后我们就可以使用接口发送短信了。

第二步、我们可以在API Explore中进行一下测试

测试前我们要首先找一下短信应用的APPID,如下图

填写完信息后点击发起调用即可将短信发送到对应的手机上。

之后在程序代码中进行调用,我们进行配置的参数和表单中的参数是一样的,只是多了secretID,secretKey。

第三步、安装java的SDK

在项目添加 Maven 依赖项,只需在 pom.xml 中找到<dependencies>标签,在里面添加以下依赖项即可。

<dependency>
     <groupId>com.tencentcloudapi</groupId>
     <artifactId>tencentcloud-sdk-java</artifactId>
     <!-- go to https://search.maven.org/search?q=tencentcloud-sdk-java and get the latest version. -->
     <!-- 请到https://search.maven.org/search?q=tencentcloud-sdk-java查询所有版本,最新版本如下 -->
     <version>3.1.322</version>
</dependency>

若是用其他语言进行配置,可进入网站查看详细说明:传送

第四步、在项目中编写代码,调用接口

以下是一些必要步骤

首先在项目yml文件中配置一些必要的参数信息,避免硬编码,便于维护。

sms:
  sdkAppId: 这里输入短信应用id
  secretId: 这里输入secretID
  secretKey: 这里输入key
  signName: 这里输入短信签名
  templateCodeId: 验证码模板id,有多个模板可以配置多个参数
  timeout: 配置RedisCache过期时间

配置好参数后,我们就要在程序中编写代码进行操作。

首先可以编写一个发送短息的组件代码SmsComponent,在里面完成获取SmsClient客户端,以及对表单参数进行设置内容和发送短信代码的封装。

import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@ToString
@Data
@Component
@Slf4j
public class SmsComponent {

    @Value("${sms.sdkAppId}")   // 注入参数值
    private String sdkAppId;

    @Value("${sms.secretId}")
    private String secretId;

    @Value("${sms.secretKey}")
    private String secretKey;

    @Value("${sms.signName}")
    private String signName;

    @Value("${sms.templateCodeId}")
    private String templateCodeId;

    @Value("${sms.timeout}")
    private Integer timeout;

    /**
     * 获取SmsClient客户端
     * @return
     */
    public SmsClient getClient() {

        // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
        // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
        Credential cred = new Credential(secretId, secretKey);
        // 实例化一个http选项,可选的,没有特殊需求可以跳过
        HttpProfile httpProfile = new HttpProfile();
        //这个setEndpoint可以省略的
        httpProfile.setEndpoint("sms.tencentcloudapi.com");
        // 实例化一个client选项,可选的,没有特殊需求可以跳过
        ClientProfile clientProfile = new ClientProfile();
        clientProfile.setHttpProfile(httpProfile);
        // 实例化要请求产品的client对象,clientProfile是可选的
        return new SmsClient(cred, "ap-beijing", clientProfile);
    }

    /**
     * 获取req请求 2个参数,就是短息模板是两个参数,根据具体情况改变
     *
     * @param phone
     * @param code  参数1,这里是验证码,param2为参数2这里为分钟
     * @param templateId  短息模板id
     * @return
     */
    public SendSmsRequest getReqTwo(String phone, String code, String param2, String templateId) {
        SendSmsRequest req = new SendSmsRequest();
        String[] phoneNumberSet = {"+86" + phone};
        req.setSmsSdkAppId(sdkAppId);     // 设置参数
        req.setPhoneNumberSet(phoneNumberSet);
        req.setSignName(signName);
        req.setTemplateId(templateId);
        //模板内容的参数有几个就设置几个,我这里是两个
        String[] templateParamSet = {code,param2};
        req.setTemplateParamSet(templateParamSet);
        return req;     // 返回请求参数内容
    }

    /**
     * 发送验证码
     *
     * @param phone
     * @param code
     * @param
     * @return
     */
    public void sendCode(String phone, String code, String param2) {

        // 返回的resp是一个SendSmsResponse的实例,与请求对象对应
        SendSmsResponse resp;
        try {
            resp = getClient().SendSms(getReqTwo(phone, code,param2 ,templateCodeId));  // 模板id是自己设置好的
            log.info(SendSmsResponse.toJsonString(resp));   // 把返回信息输入到日志中
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
        }
    }
}

然后可以在service层创建发送短信的接口

 public interface ISmsService {
    /**
     * @param phone  给手机号发送验证码
     * @param leastTime 短信有效时间
     * @return
     */
    public String sendCode( String phone,int leastTime);

    /**
     * 校验验证码
     */
    boolean checkCode(String phone, String code);
}

然后实现发送短信的接口,同时我们要自己写生成验证码的函数来确保每次发送的6位数字是随机的,并且实现校验验证码的函数,如果只是发送信息,那么只需要完成发送信息的那部分代码就行。

import java.util.Random;
import java.util.concurrent.TimeUnit;

@Service
public class ISmsServiceImpl implements ISmsService {
    @Autowired
    SmsComponent smsComponent;
    @Autowired
    RedisCache redisCache;

    /**
     * @param phone  给手机号发送验证码
     * @param leastTime 短信有效时间
     * @return
     */
    public String sendCode(String phone, int leastTime) {
        if (phone == null || phone.length() == 0) {
            throw new ServiceException("手机号为空");
        }

        // 判断是否已经发送过
        String redisCode = redisCache.getCacheObject(Constants.HEAD + phone);
        if (!StringUtils.isEmpty(redisCode)) {
            long time = Long.parseLong(redisCode.split("_")[1]);
            if (System.currentTimeMillis() - time < leastTime) {
                throw new ServiceException("发送频率过高");
            }
        }
        String code = getSixBitCode();  // 生成新的验证码
        //存储 phone->code
        redisCache.setCacheObject(Constants.HEAD + phone, code + "_" + System.currentTimeMillis(), smsComponent.getTimeout(), TimeUnit.MINUTES);
        Integer minute = leastTime / 60 / 1000; //分钟
        smsComponent.sendCode(phone, code, minute.toString());
        return "已发送验证码 " + phone;
    }

    /**
     * 获取6位验证码
     */
    private String getSixBitCode() {
        //随机数
        StringBuilder sb = new StringBuilder();
        Random rand = new Random();
        for (int i = 0; i < 6; i++) {
            sb.append(rand.nextInt(10));
        }
        return sb.toString();
    }

    /**
     * 校验验证码
     */
    @Override
    public boolean checkCode(String phone, String code) {
        String redisCode = redisCache.getCacheObject(Constants.HEAD + phone);
        if (StringUtils.isEmpty(redisCode)) {
            throw new ServiceException("验证码失效");
        }
        if (!StringUtils.equals(redisCode.split("_")[0], code)) {
            throw new ServiceException("验证码错误");
        } else {
            redisCache.deleteObject(Constants.HEAD + phone);
            return true;
        }
    }
}

其中Constant.HEAD为自己定义的前缀,便于进行区分,自行设置

public static final String HEAD = "sms:code:";

最后根据具体情况编写编写Controller层代码实现调用。

调用时,我们只需要获取用户输入的电话参数即可,模板中的第二个参数时间范围,我们自己设置好就行。

// 获取用户电话,调用发送短信接口
String msg = smsService.sendCode(sysUser.getPhonenumber(), 5 * 60 * 1000);

至此就可以在前端界面的表单中填写数据,或者在微信小程序里面发送短信了 ,在微信小程序中使用短信服务的话,要在后端代码中把微信小程序的appid,Secret等参数配置好才能正常调用。

到此这篇关于SpringBoot项目中使用腾讯云发送短信的实现的文章就介绍到这了,更多相关SpringBoot 腾讯云发送短信内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot2.x 集成腾讯云短信的详细流程

    一.腾讯云短信简介 腾讯云短信(Short Message Service,SMS)沉淀腾讯十多年短信服务技术和经验,为QQ.微信等亿级平台和10万+客户提供快速灵活接入的高质量的国内短信与国际/港澳台短信服务. 国内短信验证秒级触达,99%到达率. 国际/港澳台短信覆盖全球200+国家/地区,稳定可靠. 单次短信的业务请求流程如下所示: 短信由签名和正文内容组成,发送短信前需要申请短信签名和正文内容模板.短信签名是位于短信正文前[]中的署名,用于标识公司或业务.短信签名需要审核通过后才可使用.

  • springboot整合腾讯云短信开箱即用的示例代码

    引入腾讯云依赖 <!--腾讯云核心API--> <dependency> <groupId>com.tencentcloudapi</groupId> <artifactId>tencentcloud-sdk-java</artifactId> <version>3.1.111</version> </dependency> <dependency> <groupId>com

  • SpringBoot整合腾讯云COS对象存储实现文件上传的示例代码

    目录 1.开通腾讯云对象存储服务 2.创建存储桶 3.密钥管理,新建密钥 4.yml配置密钥.COS信息 5.COSConfig配置类 6.COS文件上传工具类 7.Controller测试上传接口: 8.PostMan接口调用 9.浏览器预览效果 企业级项目开发中都会有文件.图片.视频等文件上传并能够访问的场景,对于初学者Demo可能会直接存储在应用服务器上:对于传统项目可能会单独搭建FastDFS.MinIO等文件服务来实现存储,这种方案可能对于企业成本较小,但缺点也是很多,例如:1.增加技

  • Docker部署springboot项目到腾讯云的实现步骤

    目录 服务器的配置 安装MySql 将springboot项目打成jar包 编写Dockfile文件 访问 删除重做(更新)镜像 服务器的配置 服务器配置总结为三个,防火墙,端口,和安全组 1.防火墙 查看防火墙状态 firewall-cmd --state 没有开启则开启防火墙 systemctl start firewalld.service 2.端口 添加对外开放的端口 firewall-cmd --zone=public --add-port=端口号/tcp --permanent fi

  • SpringBoot项目部署到腾讯云的实现步骤

    目录 将SpringBoot项目部署到腾讯云 1.下载MySql 2.导入sql文件 3.下载JDK 4.将本地程序打包成jar 5.腾讯云部署jar 将SpringBoot项目部署到腾讯云 注意: 1.如果已经下载好MySql和JDK,可以直接跳过1.3步骤.但是不要忘记步骤2哦. 2.如果已经有Mysql但是想要换版本号,切记不要直接下载,要先把旧版本的Mysql删除干净再重新下载. 1.下载MySql 这里,我们将mysql下载到我们的/usr/local/目录下. cd /usr/loc

  • Spring中使用腾讯云发送短信验证码的实现示例

    目录 1.所需依赖 2.腾讯云配置 (1).获取短信签名 (2).创建正文模板 (3).创建密钥 (4).获取SdkAppId 3.代码 1. 所需依赖 <dependency> <groupId>com.tencentcloudapi</groupId> <artifactId>tencentcloud-sdk-java</artifactId> <version>3.1.313</version> </depen

  • python如何使用腾讯云发送短信

    腾讯云方面的申请和流程都比较简单,基本都是可视化操作的,这里就不在赘述了.这篇文章着重讲解怎么用python实现调用. 我假设你已经满足了以下几个前提 + 已经开通了腾讯云短信业务 + 创建好了短信签名 + 也已经审核过了短信正文模板 + 并且已经知道自己的SDK AppID.签名ID.短信模板ID Python 相关需要安装腾讯云提供的模块或SDK 我们以qcloudsms_py模块为准,首先 pip install qcloudsms_py 发送短信我们需要用到的模块有下面2个 from q

  • vue如何在项目中调用腾讯云的滑动验证码

    在项目中使用滑动验证,可以调用腾讯云的组件和接口(付费项目) 导言 首先看看官方的步骤教学: https://cloud.tencent.com/document/product/1110/36839 其中,前端涉及到的是"步骤3:客户端接入",里面介绍了两种接入方法:"快速接入"和"定制接入". 项目是原生HTML 或者 jQuery 开发,那么可以使用"快速接入". 项目使用 vue.react 等框架开发,则需要使用&q

  • Django中如何使用celery异步发送短信验证码详解

    目录 1.celery介绍 1.1 celery应用举例 1.2 Celery有以下优点 1.3 Celery 特性 2.工作原理 2.1 Celery 扮演生产者和消费者的角色 3.异步发短信 总结 1.celery介绍 1.1 celery应用举例 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,如果你的业务场景中需要用到异步任务,就可以考虑使用celery 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着

  • Vue3+Vue-cli4项目中使用腾讯滑块验证码的方法

    简介: 滑块验证码相比于传统的图片验证码具有以下优点: 验证码的具体验证不需要服务端去验证,服务端只需要核验验证结果即可. 验证码的实现不需要我们去了解,也不需要我们去具体实现. 滑块验证码的安全程度相比于传统验证码高不少. ... 由于网络上和腾讯api文档中缺少关于vue3中组合式api怎么应用腾讯的滑块验证码,所以出此教程.本人也非vue大佬,对vue的理解也不过停留在初级使用的程度上,有错误之处,敬请指出. 开始: 首先,我们需要去腾讯云申请一个图形验证的api,使用场景中选择自己的使用

  • Springboot实现阿里云通信短信服务有关短信验证码的发送功能

    前言 短信验证码是通过发送验证码到手机的一种有效的验证码系统.主要用于验证用户手机的合法性及敏感操作的身份验证. 现在市面上的短信服务平台有很多.大家在选择的时候未免会有些不好抉择.本人建议选择短信服务商应遵循以下几点: 服务商知名度高,业务流量大.(这样的平台可信度高) 服务稳定,不能经常宕机.(保证自身业务的流畅运行) 文档全面详细.(没文档怎么玩?) 最近的一个项目中,注册和修改密码时需要用到短信验证码校验手机号的功能.本人也是对比几家后,直接选择阿里云通信的短信服务.(本身项目服务器也是

  • 在Vue项目中引入腾讯验证码服务的教程

    什么是腾讯验证码?它长这个样子--:point_down: 最近公司项目要求引入腾讯云验证,要求是这样的: 为了防止别人恶意刷短信验证码,当用户短时间内多次获取验证码的时候,需要调用腾讯验证码,验证成功后会继续自动发送验证码 ,刚开始的我听的一脸蒙蔽,网上搜索也没有多少相关的文章,然而现在我接通啦,发现是很简单点事(或许就是因为太简单了所以没有人写2333-) 不多BB,开始吧! 先看文档的接口调用流程: (文档地址: cloud.tencent.com/document/pr- ) 总共分成几

  • python3.7实现云之讯、聚合短信平台的短信发送功能

    1.云之讯平台数据返回Json格式: {'reason': '操作成功', 'result': {'sid': '17209241456456455454', 'fee': 1, 'count': 1}, 'error_code': 0} 2.聚合平台数据返回Json格式: {"code":"000000","count":"1","create_date":"2019-09-24 16:16:3

  • SpringBoot项目中如何实现MySQL读写分离详解

    目录 1.MySQL主从复制 1.1.介绍 二进制日志: MySQL复制过程分成三步: 1.2.主从库搭建 1.2.1.主库配置 1.2.2.从库配置 1.3.坑位介绍 1.3.1.UUID报错 1.3.2.server_id报错 1.3.3.同步异常解决 操作不规范,亲人两行泪…… 2.项目中实现 2.1.ShardingJDBC 2.2.依赖导入 2.3.配置文件 2.4.测试跑路 总结 1.MySQL主从复制 但我们仔细观察我们会发现,当我们的项目都是用的单体数据库时,那么就可能会存在如下

随机推荐