当前位置:   article > 正文

实现在SpringBoot项目中使用腾讯云发送短信_tencentcloudapi.sms

tencentcloudapi.sms

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


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

首先进入腾讯云的短信服务界面传送门https://console.cloud.tencent.com/smsv2

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


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

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

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

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


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

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

 

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

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


 第三步、安装java的SDK

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

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

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


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

以下是一些必要步骤

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

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

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

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

  1. import com.tencentcloudapi.common.Credential;
  2. import com.tencentcloudapi.common.exception.TencentCloudSDKException;
  3. import com.tencentcloudapi.common.profile.ClientProfile;
  4. import com.tencentcloudapi.common.profile.HttpProfile;
  5. import com.tencentcloudapi.sms.v20210111.SmsClient;
  6. import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
  7. import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
  8. import lombok.Data;
  9. import lombok.ToString;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.springframework.beans.factory.annotation.Value;
  12. import org.springframework.stereotype.Component;
  13. @ToString
  14. @Data
  15. @Component
  16. @Slf4j
  17. public class SmsComponent {
  18. @Value("${sms.sdkAppId}") // 注入参数值
  19. private String sdkAppId;
  20. @Value("${sms.secretId}")
  21. private String secretId;
  22. @Value("${sms.secretKey}")
  23. private String secretKey;
  24. @Value("${sms.signName}")
  25. private String signName;
  26. @Value("${sms.templateCodeId}")
  27. private String templateCodeId;
  28. @Value("${sms.timeout}")
  29. private Integer timeout;
  30. /**
  31. * 获取SmsClient客户端
  32. * @return
  33. */
  34. public SmsClient getClient() {
  35. // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
  36. // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
  37. Credential cred = new Credential(secretId, secretKey);
  38. // 实例化一个http选项,可选的,没有特殊需求可以跳过
  39. HttpProfile httpProfile = new HttpProfile();
  40. //这个setEndpoint可以省略的
  41. httpProfile.setEndpoint("sms.tencentcloudapi.com");
  42. // 实例化一个client选项,可选的,没有特殊需求可以跳过
  43. ClientProfile clientProfile = new ClientProfile();
  44. clientProfile.setHttpProfile(httpProfile);
  45. // 实例化要请求产品的client对象,clientProfile是可选的
  46. return new SmsClient(cred, "ap-beijing", clientProfile);
  47. }
  48. /**
  49. * 获取req请求 2个参数,就是短息模板是两个参数,根据具体情况改变
  50. *
  51. * @param phone
  52. * @param code 参数1,这里是验证码,param2为参数2这里为分钟
  53. * @param templateId 短息模板id
  54. * @return
  55. */
  56. public SendSmsRequest getReqTwo(String phone, String code, String param2, String templateId) {
  57. SendSmsRequest req = new SendSmsRequest();
  58. String[] phoneNumberSet = {"+86" + phone};
  59. req.setSmsSdkAppId(sdkAppId); // 设置参数
  60. req.setPhoneNumberSet(phoneNumberSet);
  61. req.setSignName(signName);
  62. req.setTemplateId(templateId);
  63. //模板内容的参数有几个就设置几个,我这里是两个
  64. String[] templateParamSet = {code,param2};
  65. req.setTemplateParamSet(templateParamSet);
  66. return req; // 返回请求参数内容
  67. }
  68. /**
  69. * 发送验证码
  70. *
  71. * @param phone
  72. * @param code
  73. * @param
  74. * @return
  75. */
  76. public void sendCode(String phone, String code, String param2) {
  77. // 返回的resp是一个SendSmsResponse的实例,与请求对象对应
  78. SendSmsResponse resp;
  79. try {
  80. resp = getClient().SendSms(getReqTwo(phone, code,param2 ,templateCodeId)); // 模板id是自己设置好的
  81. log.info(SendSmsResponse.toJsonString(resp)); // 把返回信息输入到日志中
  82. } catch (TencentCloudSDKException e) {
  83. e.printStackTrace();
  84. }
  85. }
  86. }

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

  1. public interface ISmsService {
  2. /**
  3. * @param phone 给手机号发送验证码
  4. * @param leastTime 短信有效时间
  5. * @return
  6. */
  7. public String sendCode( String phone,int leastTime);
  8. /**
  9. * 校验验证码
  10. */
  11. boolean checkCode(String phone, String code);
  12. }

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

  1. import java.util.Random;
  2. import java.util.concurrent.TimeUnit;
  3. @Service
  4. public class ISmsServiceImpl implements ISmsService {
  5. @Autowired
  6. SmsComponent smsComponent;
  7. @Autowired
  8. RedisCache redisCache;
  9. /**
  10. * @param phone 给手机号发送验证码
  11. * @param leastTime 短信有效时间
  12. * @return
  13. */
  14. public String sendCode(String phone, int leastTime) {
  15. if (phone == null || phone.length() == 0) {
  16. throw new ServiceException("手机号为空");
  17. }
  18. // 判断是否已经发送过
  19. String redisCode = redisCache.getCacheObject(Constants.HEAD + phone);
  20. if (!StringUtils.isEmpty(redisCode)) {
  21. long time = Long.parseLong(redisCode.split("_")[1]);
  22. if (System.currentTimeMillis() - time < leastTime) {
  23. throw new ServiceException("发送频率过高");
  24. }
  25. }
  26. String code = getSixBitCode(); // 生成新的验证码
  27. //存储 phone->code
  28. redisCache.setCacheObject(Constants.HEAD + phone, code + "_" + System.currentTimeMillis(), smsComponent.getTimeout(), TimeUnit.MINUTES);
  29. Integer minute = leastTime / 60 / 1000; //分钟
  30. smsComponent.sendCode(phone, code, minute.toString());
  31. return "已发送验证码 " + phone;
  32. }
  33. /**
  34. * 获取6位验证码
  35. */
  36. private String getSixBitCode() {
  37. //随机数
  38. StringBuilder sb = new StringBuilder();
  39. Random rand = new Random();
  40. for (int i = 0; i < 6; i++) {
  41. sb.append(rand.nextInt(10));
  42. }
  43. return sb.toString();
  44. }
  45. /**
  46. * 校验验证码
  47. */
  48. @Override
  49. public boolean checkCode(String phone, String code) {
  50. String redisCode = redisCache.getCacheObject(Constants.HEAD + phone);
  51. if (StringUtils.isEmpty(redisCode)) {
  52. throw new ServiceException("验证码失效");
  53. }
  54. if (!StringUtils.equals(redisCode.split("_")[0], code)) {
  55. throw new ServiceException("验证码错误");
  56. } else {
  57. redisCache.deleteObject(Constants.HEAD + phone);
  58. return true;
  59. }
  60. }
  61. }

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

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

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

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

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

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


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/340096
推荐阅读
相关标签
  

闽ICP备14008679号