SpringBoot整合腾讯云短信服务实现发送短信功能(一篇就够了)

废话不多说 直接开始

首先我们加入依赖

   <dependency>
            <groupId>com.tencentcloudapi</groupId>
            <artifactId>tencentcloud-sdk-java</artifactId>
            <version>3.1.62</version>
  </dependency>

我把它封装在一个util类里面了 大家可以直接拿着用

package cn.kgc.qh.util;

import com.netflix.client.ClientException;
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.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
import org.springframework.stereotype.Component;


/**
 * @Description: TODO
 * @author: 小孟
 * @date: 2021年12月20日 13:23
 */
@Component
public class TengXunSMSUtils {
    public static final String VALIDATE_CODE = "866988";

    public  boolean sendShortMessage(String templateCode, String phoneNum, String param) throws ClientException {
        try {
            /*
             * CAM 密钥查询:https://console.cloud.tencent.com/cam/capi
             */
            Credential cred = new Credential("secretId", "secretKey");
            // 无特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
           

            httpProfile.setReqMethod("POST");

            httpProfile.setConnTimeout(60);

            httpProfile.setEndpoint("sms.tencentcloudapi.com");

            ClientProfile clientProfile = new ClientProfile();

            clientProfile.setSignMethod("HmacSHA256");
            clientProfile.setHttpProfile(httpProfile);
            /* 实例化 SMS 的 client 对象
             * 第二个参数是地域信息,可以直接填写字符串 ap-guangzhou,或者引用预设的常量 */
            SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
            /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数
             * 您可以直接查询 SDK 源码确定接口有哪些属性可以设置
             * 属性可能是基本类型,也可能引用了另一个数据结构
             * 推荐使用 IDE 进行开发,可以方便地跳转查阅各个接口和数据结构的文档说明 */
            com.tencentcloudapi.sms.v20190711.models.SendSmsRequest req = new SendSmsRequest();
            /* 填充请求参数,这里 request 对象的成员变量即对应接口的入参
             * 您可以通过官网接口文档或跳转到 request 对象的定义处查看请求参数的定义
             * 基本类型的设置:
             * 帮助链接:
             * 短信控制台:https://console.cloud.tencent.com/smsv2
             * sms helper:https://cloud.tencent.com/document/product/382/3773 */
            /* 短信应用 ID: 在 [短信控制台] 添加应用后生成的实际 SDKAppID,例如1400006666 */
            String SdkAppid = "这里必填";
            req.setSmsSdkAppid(SdkAppid);
            /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,可登录 [短信控制台] 查看签名信息 */
            String sign = "自己签名";
            req.setSign(sign);
            /* 国际/港澳台短信 senderid: 国内短信填空,默认未开通,如需开通请联系 [sms helper] */
            String senderid = "";
            req.setSenderId(senderid);
            /* 模板 ID: 必须填写已审核通过的模板 ID,可登录 [短信控制台] 查看模板 ID */
            req.setTemplateID(templateCode);
            /* 下发手机号码,采用 e.164 标准,+[国家或地区码][手机号]
             * 例如+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号*/
            String[] phoneNumber = {"+86" + phoneNum + ""};
            req.setPhoneNumberSet(phoneNumber);
            /* 模板参数: 若无模板参数,则设置为空*/
            String[] templateParams = {param};
            req.setTemplateParamSet(templateParams);
            /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
             * 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 */
            SendSmsResponse res = client.SendSms(req);
            // 输出 JSON 格式的字符串回包
            System.out.println(SendSmsResponse.toJsonString(res));
            // 可以取出单个值,您可以通过官网接口文档或跳转到 response 对象的定义处查看返回字段的定义
            System.out.println(res.getRequestId());
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
        }
        return true;
    }
}

这里写个控制器测试一下:

  • 第一个参数 模板ID 
  • 第二个参数 手机号
  • 第三个参数 验证码 这里我没有用随机数产生
package cn.kgc.qh.controller;

import cn.kgc.qh.util.TengXunSMSUtils;
import com.netflix.client.ClientException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @Description: TODO
 * @author: 小孟
 * @date: 2021年12月20日 13:34
 */
@RestController
@RequestMapping("/TXController")
public class TXController {
    @Resource
    private TengXunSMSUtils tengXunSMSUtils;

    @PostMapping("/TX")
    public boolean TX(@RequestParam String templateCode, @RequestParam String phoneNum, @RequestParam String param) 
            throws ClientException {
        
        return tengXunSMSUtils.sendShortMessage(templateCode, phoneNum, param);
    }
}

下面是短信发送成功后 1分钟之内不能发送短信,redis中可以保存短信3分钟

    @PostMapping("/codeTX")
    public CommonsResponse getCodeTX(@RequestParam String phone) {
        //判断存入的验证码是否在1分钟以内 如果在就不能在获取
        String TempCodeTx = (String) redisUtil.get("TX" + CacheConstants.CACHE_PREFIX_CODE + phone);
        if (!StringUtils.isBlank(TempCodeTx)) {
            long times1 = Long.parseLong(TempCodeTx.split("_")[1]);
            long times2 = new Date().getTime();
            if (times2 - times1 <= 60000) {
                return CommonsResponse.builder().code(200).data("-1")
                        .message("验证码没到1分钟不能获取").build();
            }
        }
        //产生随机数
        String sendCode = String.valueOf(RandomValueUtil.getNum(1000, 9999));
        String code = sendCode + "_" + new Date().getTime();
        redisUtil.set("TX" + CacheConstants.CACHE_PREFIX_CODE + phone, code, 180);
        tengXunYunSendMsgFeignClient.TX("自己模板的ID", phone, sendCode);
        return CommonsResponse.builder().code(200).data("1")
                .message("发送成功!!!").build();
    }

一个非常简单的注册

从刚刚保存的redis 拿出code 来和用户输入的code 做对比 在通过MD5+盐的方式保存用户的密码

 @PostMapping("/insert")
    public CommonsResponse insert(@RequestBody UmsMemberDTO umsMemberDTO) {
        String redisUms = (String) redisUtil.get("TX" + CacheConstants.CACHE_PREFIX_CODE + umsMemberDTO.getMobile());
        String dd = redisUms.split("_")[0];
        if (redisUms == null || !dd.equals(umsMemberDTO.getCode())) {
            return CommonsResponse.builder().code(200).data(false).message("失败").build();
        }

        
        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
        String tempPassword = bCryptPasswordEncoder.encode(umsMemberDTO.getPassword());
        umsMemberDTO.setPassword(tempPassword);
        umsClink.insert(umsMemberDTO);
        return CommonsResponse.builder().code(200).data(true).message("成功!").build();
    }

结果是成功的!短信发出!

如果没有签名可以去我的博客里看我的另一篇文章 百分百注册腾讯云签名!

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是Springboot整合腾讯云短信服务的示例代码: 1. 首先在腾讯云短信服务控制台中创建 SMS 应用,并获取 APP ID、APP KEY 和 APP SECRET。 2. 接下来,添加依赖: ```xml <dependency> <groupId>com.github.qcloudsms</groupId> <artifactId>qcloudsms</artifactId> <version>1.0.6</version> </dependency> ``` 3. 在 Springboot 配置文件中添加腾讯云短信服务的配置: ```yaml tencent: sms: app-id: <your app id> app-key: <your app key> app-secret: <your app secret> sign-name: <your sign name> ``` 4. 创建短信发送工具类 SmsUtils: ```java import com.github.qcloudsms.SmsSingleSender; import com.github.qcloudsms.SmsSingleSenderResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class SmsUtils { @Value("${tencent.sms.app-id}") private int appId; @Value("${tencent.sms.app-key}") private String appKey; @Value("${tencent.sms.sign-name}") private String signName; @Autowired private SmsSingleSender sender; public void send(String phoneNumber, String templateId, String[] params) throws Exception { SmsSingleSenderResult result = sender.sendWithParam("86", phoneNumber, templateId, params, signName, "", ""); if (result.result != 0) { throw new RuntimeException(result.errMsg); } } public SmsSingleSender getSender() { return new SmsSingleSender(appId, appKey); } } ``` 5. 在 Controller 中调用短信发送工具类: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class SmsController { @Autowired private SmsUtils sms; @PostMapping("/sendSms") public void sendSms(@RequestBody SmsPayload smsPayload) throws Exception { String phoneNumber = smsPayload.getPhoneNumber(); String templateId = smsPayload.getTemplateId(); String[] params = smsPayload.getParams(); sms.send(phoneNumber, templateId, params); } } ``` 以上就是 Springboot 整合腾讯云短信服务的示例代码,希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值