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

话不多说, 直接开始

目录

腾讯云短信服务注册相关

发送短信 API 开发

配置相关

接口


腾讯云短信服务注册相关

① 在腾讯云首页搜索短信

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

搜索出来后点击免费试用就可以使用腾讯云实现发送短信验证码登录的后端实现_第1张图片

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

② 新手配置指引

使用腾讯云实现发送短信验证码登录的后端实现_第2张图片

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

③ 创建短信签名

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

使用腾讯云实现发送短信验证码登录的后端实现_第3张图片

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

④ 之后就按流程走

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

个人比较喜欢这一套模板使用腾讯云实现发送短信验证码登录的后端实现_第4张图片

 ⑤ 测试发送短信

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

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

发送短信 API 开发

配置相关

① 引入 pom 依赖


    com.tencentcloudapi
    tencentcloud-sdk-java
    3.1.460

        这里的版本因为我现在做的时候调用 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 hashMap = new HashMap();
        // 生成随机数字并存入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 文档-文档中心-腾讯云使用腾讯云实现发送短信验证码登录的后端实现_第5张图片

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 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 方法, 在其中修改一些比如手机号、验证码进行测试等

你可能感兴趣的:(java,腾讯云)