使用腾讯云实现发送短信验证码登录的后端实现

本文详细介绍了如何在腾讯云注册短信服务,包括创建短信签名和模板,配置SDK依赖,以及通过Spring Boot实现短信发送API。重点展示了如何在代码中接入和测试Tencent Cloud SMS API。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说, 直接开始

目录

腾讯云短信服务注册相关

发送短信 API 开发

配置相关

接口


腾讯云短信服务注册相关

① 在腾讯云首页搜索短信

 腾讯云地址: 腾讯云 - 产业智变 云启未来

搜索出来后点击免费试用就可以

之后就按流程走最后进入控制台

② 新手配置指引

按照步骤做即可, 值得一提的是第一步, 创建短信签名

③ 创建短信签名

这里比较推荐使用公众号进行创建短信签名, 其他的相对于个人而言可能比较麻烦

 公众号注册地址: 微信公众平台

④ 之后就按流程走

创建模板后等待审核, 等审核好了之后可以进行下一步

个人比较喜欢这一套模板

 ⑤ 测试发送短信

这个可以先选择用控制台方式测试, 若使用了带参数的模板, 比如我上文推荐的那套模板, 需要下载标准模板格式, 然后在里面声明内容后再上传回去, 进行测试.

这一步测不测试都可以. 我当时是用控制台测试的, 等待审核等了十来分钟, 所以要是测试没立刻发送短信很正常

发送短信 API 开发

配置相关

① 引入 pom 依赖

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

        这里的版本因为我现在做的时候调用 API Explorer 生成的代码, 就随便找了个适合的版本使用, 根据自己实际需求进行选择

② 修改 yml 配置文件

这里没什么好说的, 就是指定端口, 服务名等. 记得配置Redis, 主要是用来进行过期校验, 此处设置过期时间为30分钟. 还有要配置关于一会儿要连接你腾讯云所需的参数

spring:
  redis:
    host: 自己的Redisip地址
    port: 6379
    database: 0
    password: 123456
    timeout: 1800000
    lettuce:
      pool:
        max-active: 20
        #    最大阻塞等待时间
        max-wait: -1
        max-idle: 5
        min-idle: 0
tencent:
  msm:
    id: 填入自己的访问秘钥,位置在右上角点击个人头像->选择访问管理->新建秘钥
    secret: 同上, 这个是secretkey
    appId: 短信控制台页面->左侧应用管理->应用列表的 SDKAppId
    signName: 短信控制台页面->左侧国内短信->签名管理 签名内容
    templateId: 短信控制台页面->左侧国内短信->正文模板管理 Id

上述的 腾讯云属性配置也可配置在一会儿的实现类中, 直接明文的方式写


接口

  • code 生成工具类

看自己需要可以酌情改动

public class RandomUtils {
    private static final Random random = new Random();
    private static final DecimalFormat fourdf = new DecimalFormat("0000");
    private static final DecimalFormat sixdf = new DecimalFormat("000000");

    //      生成四位验证码
    public static String getFourBitRandom() {
        return fourdf.format(random.nextInt(10000));
    }

    //     生成六位验证码
    public static String getSixBitRandom() {
        return sixdf.format(random.nextInt(1000000));
    }

    //      给定数组,抽取n个数据
    public static ArrayList getRandom(List list, int n) {
        Random random = new Random();
        HashMap<Object, Object> hashMap = new HashMap<Object, Object>();
        // 生成随机数字并存入HashMap
        for (int i = 0; i < list.size(); i++) {
            int number = random.nextInt(100) + 1;
            hashMap.put(number, i);
        }
        // 从HashMap导入数组
        Object[] robjs = hashMap.values().toArray();
        ArrayList r = new ArrayList();
        // 遍历数组并打印数据
        for (int i = 0; i < n; i++) {
            r.add(list.get((int) robjs[i]));
            System.out.print(list.get((int) robjs[i]) + "\t");
        }
        System.out.print("\n");
        return r;
    }
}
  • 调用配置文件中腾讯云参数的工具类

这个如果打算在实现类中明文的方式写参数不需要配置

//实现InitializingBean接口,当spring进行初始化bean时,会执行afterPropertiesSet方法
@Component
public class MsmConstantUtils implements InitializingBean {
    @Value("${tencent.msm.id}")
    private String secretID ;

    @Value("${tencent.msm.secret}")
    private String secretKey ;

    @Value("${tencent.msm.appId}")
    private String appId;

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

    @Value("${tencent.msm.templateId}")
    private String templateId;
    //六个相关的参数
    public static String SECRET_ID;
    public static String SECRET_KEY;
    public static String APP_ID;
    public static String SIGN_NAME;
    public static String TEMPLATE_ID;

    @Override
    public void afterPropertiesSet() throws Exception {
        SECRET_ID = secretID;
        SECRET_KEY = secretKey;
        APP_ID = appId;
        SIGN_NAME = signName;
        TEMPLATE_ID = templateId;
    }
}
  • ServiceImpl

这里提一个小建议, 如果只是自用选择使用明文方式填充可以直接使用 API Explorer 进行生成

地址: 短信 发送短信-API 文档-文档中心-腾讯云

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 com.msm.service.MsmService;
import com.msm.utils.MsmConstantUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

@Service
public class MsmServiceImpl implements MsmService {
    @Override
    public boolean send(String phone, String code) {
        //判断手机是否为null
        if (StringUtils.isEmpty(phone)){
            return false;
        }
        try {
            /* 必要步骤:
             * 实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId 和 secretKey
             * 本示例采用从环境变量读取的方式,需要预先在环境变量中设置这两个值
             * 您也可以直接在代码中写入密钥对,但需谨防泄露,不要将代码复制、上传或者分享给他人
             * CAM 密钥查询:https://console.cloud.tencent.com/cam/capi
             */
            Credential cred = new Credential(MsmConstantUtils.SECRET_ID, MsmConstantUtils.SECRET_KEY);


            // 实例化一个http选项,可选的,没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("sms.tencentcloudapi.com");
            // 实例化一个client选项,可选的,没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            SendSmsRequest req = new SendSmsRequest();
            String[] phoneNumberSet1 = {phone};
            req.setPhoneNumberSet(phoneNumberSet1);

            req.setSmsSdkAppId(MsmConstantUtils.APP_ID);
            req.setSignName(MsmConstantUtils.SIGN_NAME);
            req.setTemplateId(MsmConstantUtils.TEMPLATE_ID);

            String[] templateParamSet1 = {code, "30"};
            req.setTemplateParamSet(templateParamSet1);

            // 返回的resp是一个SendSmsResponse的实例,与请求对象对应
            SendSmsResponse resp = client.SendSms(req);

            // 输出 JSON 格式的字符串回包
            System.out.println(SendSmsResponse.toJsonString(resp));

            return true;
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
        }
        return false;
    }
}
  • Controller:
@RestController
@RequestMapping("/api/msm")
public class MsmController {
    @Autowired
    private MsmService msmService;
    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @ApiOperation(value = "发送手机验证码")
    @GetMapping("/send/{phone}")
    public Result sendCode(@PathVariable String phone){
        String code = redisTemplate.opsForValue().get(phone);
        if(StringUtils.hasText(code)) {
            return Result.ok();
        }
        //如果从redis获取不到
        //生成验证码
        code = RandomUtils.getSixBitRandom();

        //整合腾讯云短信服务进行发送
        boolean flag = msmService.send(phone, code);
        if (flag) {
            //生成验证码放到redis里面,设置有效时间
            redisTemplate.opsForValue().set(phone, code, 30, TimeUnit.MINUTES);
            return Result.ok();
        }
        return Result.fail().message("发送短信失败");
    }
}

到此关于短信的后端部分已经全部实现, 若希望测试的话有很多种方法, 比如使用 API Explorer, 或者将 serviceImpl 中的 send() 方法抽取出来建立 main 方法, 在其中修改一些比如手机号、验证码进行测试等

使用腾讯云短信验证码服务时,前端通常需要创建一个表单提交用户输入的手机号码,然后触发后端发送验证码。以下是简化的示例: **前端(HTML+JavaScript)验证码获取代码**: ```html <form id="smsForm"> <input type="tel" id="mobile" placeholder="请输入手机号" required> <button onclick="sendSms()">获取验证码</button> <div id="captcha"></div> <!-- 存储验证码 --> <input type="hidden" name="captcha" id="captchaInput"> </form> <script> function sendSms() { var mobile = document.getElementById('mobile').value; fetch('/api/send_sms', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ phone: mobile }) }) .then(response => response.text()) .then(data => { // 将接收到的验证码显示在前端 document.getElementById('captcha').innerText = data.captcha; document.getElementById('captchaInput').value = data.captcha; }); } </script> ``` **后端(PHP)发送验证码并验证代码**: ```php // 引入腾讯云的SDK require 'path/to/QcloudSDK.php'; class SMSValidator { private $secretId, $secretKey; public function __construct($secretId, $secretKey) { // 初始化腾讯云短信服务 $this->client = new \TencentCloud\Sms\V20190711\SmsClient([ 'secretId' => $secretId, 'secretKey' => $secretKey, 'region' => '你要使用的区域' // 根据实际地域填写 ]); } public function sendSms($phone) { $request = new \TencentCloud\Sms\Models\SendSmsRequest(); $request->SetPhoneNumbers($phone); // 可能需要设置模板ID或其他参数,具体查看官方文档 $request->SetTemplateId('your_template_id'); $response = $this->client->SendSms($request); return json_encode($response); } public function verifySms($phone, $code) { // 在接收前端发来的请求时,检查验证码是否匹配 if ($code === $receivedCodeFromFrontend) { return true; // 验证通过 } else { return false; // 验证失败 } } } $secretId = '你的SecretId'; $secretKey = '你的SecretKey'; $smsValidator = new SMSValidator($secretId, $secretKey); // ... 在前端请求后调用相应的验证方法 ``` 请注意,上述代码示例是简化版,实际应用中可能需要处理错误、设置超时限制以及考虑安全性等问题。同时,具体的秘钥、模板ID和验证逻辑应妥善保管。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值