Spring Boot 系列:整合腾讯云短信验证码

短信业务在我们日常使用的软件或者网站,应该算是无处不在的功能模块,比如注册、验证码功能。国内有很多互联网公司都提供短信业务,比如阿里、腾讯、七牛。本篇文章提及的是腾讯提供的短信服务。

一、腾讯短信服务

腾讯提供的短信业务,提供每个月100 的免费额度(已下线),用来测试足够了。打开https://console.cloud.tencent.com/sms/smslist,在腾讯短信服务的页面,进行简单的注册以及简单的配置:创建签名和模板等,然后采用官方提供的SDK,调用接口即可。详细配置参见文章:https://mp.weixin.qq.com/s/kWR-awfOutRZNAmpxvNzQA

二、SpringBoot 发送短信验证码

2.1 项目配置文件

  • pom.xml
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-testartifactId>
    <scope>testscope>
    <exclusions>
        <exclusion>
            <groupId>com.vaadin.external.googlegroupId>
            <artifactId>android-jsonartifactId>
        exclusion>
    exclusions>
dependency>

<dependency>
    <groupId>com.github.qcloudsmsgroupId>
    <artifactId>qcloudsmsartifactId>
    <version>1.0.6version>
dependency>

<dependency>
    <groupId>org.projectlombokgroupId>
    <artifactId>lombokartifactId>
    <optional>trueoptional>
dependency>

<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>fastjsonartifactId>
    <version>1.2.32version>
dependency>
  • application.yml

该配置在注册腾讯云以及配置后,可以在控制台拿到这些数据。

tx:
  sms:
    appId: appId
    appKey: appKey
    templateId: 1
    smsSign: 风尘博客
    smsEffectiveTime: 5

2.2 封装一个验证码实体类SmsParams

这里为了简单,我只保留了必备的两个字断手机号和验证码,实际项目中还包括验证码类型、项目名称等等,请根据实际需要扩展。

@Data
@Accessors(chain = true)
public class SmsParams {

    /**
     * 验证码
     */
    private String verifyCode;

    /**
     * 手机号码
     */
    private String phone;


    public SmsParams(String phone, String verifyCode) {
       this.phone = phone;
       this.verifyCode = verifyCode;
    }
}

2.3 封装发送验证码的工具类TxCloudSmsUtil

官网SDK 有:单发短信、指定模板 ID 单发短信、群发短信、指定模板群发短信以及拉取短信回执和短信回复状态(个人用户无法体验)等方式发送验证码,我这里只演示最常用的"指定模板 ID 单发短信"。

@Component
public class TxCloudSmsUtil {

    // 短信应用 SDK AppID
    @Value("${tx.sms.appId}")
    int appId; // 1400开头

    // 短信应用SDK AppKey
    @Value("${tx.sms.appKey}")
    String appKey;

    // 短信模板ID,需要在短信应用中申请
    @Value("${tx.sms.templateId}")
    int templateId ; // NOTE: 真实的模板ID需要在短信控制台中申请
    //我这里 templateId 对应的内容是"您的验证码是: {1}"
    // 签名
    @Value("${tx.sms.smsSign}")
    String smsSign ; // NOTE: 签名参数使用的是`签名内容`,而不是`签名ID`。这里的签名"腾讯云"只是一个示例,真实的签名需要在短信控制台申请

    @Value("${tx.sms.smsEffectiveTime}")
    String smsEffectiveTime ;

    /**
     * 指定模板 ID 单发短信
     * @param smsParams
     */
    public String sendSms(SmsParams smsParams) {
        String rep = "error";
        try {
            String verifyCode = smsParams.getVerifyCode();
            // 数组具体的元素个数和模板中变量个数必须一致,例如示例中templateId:5678对应一个变量,参数数组中元素个数也必须是一个
            String[] params = {verifyCode,smsEffectiveTime};
            SmsSingleSender smsSingleSender = new SmsSingleSender(appId, appKey);
            // 签名参数未提供或者为空时,会使用默认签名发送短信
            SmsSingleSenderResult smsSingleSenderResult = smsSingleSender.sendWithParam("86", smsParams.getPhone(),
                    templateId, params, smsSign, "", "");
            System.out.println(smsSingleSenderResult);
            // 如果返回码不是0,说明配置有错,返回错误信息
            if (smsSingleSenderResult.result == 0) {
                rep = "success";
            } else {
                rep = smsSingleSenderResult.errMsg;
            }
        } catch (HTTPException e) {
            // HTTP响应码错误
            e.printStackTrace();
        } catch (JSONException e) {
            // json解析错误
            e.printStackTrace();
        } catch (IOException e) {
            // 网络IO错误
            e.printStackTrace();
        }catch (Exception e) {
            // 网络IO错误
            e.printStackTrace();
        }
        return rep;
    }

}

简单解释下,我这里封装的方法,如果短信发送成功,返回success,失败会返回smsSingleSenderResult.errMsg的详细原因(判断依据是:成功发送到返回码是:0)。实际运用中,可以在调用的地方对返回结果进行处理。

2.4 测试发送验证码

@SpringBootTest
@RunWith(SpringRunner.class)
public class SmsTest {

    @Resource
    TxCloudSmsUtil txCloudSmsUtil;
    @Test
    public void testSms() {
        // 生成随机的六位数验证码
        Random random = new Random(4);
        Integer verifyCode = random.nextInt(1000000);
        SmsParams smsParams = new SmsParams("17098705205",verifyCode.toString());
        System.out.println("生成的验证码为:" + verifyCode);
        // smsParams.setPhone("17098705205").setVerifyCode();
        String str = txCloudSmsUtil.sendSms(smsParams);
        System.out.println(str);
    }

}

手机上接收到消息如下:

【风尘博客】你的验证码为971862,该验证码5分钟内有效,请保护好您的验证码,如非本人操作,请忽略本短信。

说明发送成功!

三、总结

Github 示例代码

Java SDK文档

3.1 日常求赞

博主祖传秘籍 Spring Boot 葵花宝典 开源中,欢迎前来吐槽,提供线索,告诉博主接下来更新哪方面文章,共同进步!

3.2 文化交流

  1. 风尘博客
  2. 风尘博客-掘金
  3. 风尘博客-博客园
  4. 风尘博客-CSDN
  5. Github

最新文章,欢迎关注:公众号-风尘博客;交流观点,欢迎添加:个人微信

Spring Boot 系列:整合腾讯云短信验证码_第1张图片Spring Boot 系列:整合腾讯云短信验证码_第2张图片

你可能感兴趣的:(Spring,Boot)