前言

这个没什么难点就是复制示例代码用就行了,重点还是申请签名和模板比较麻烦,这部分在腾讯云控制台里操作

1.service层

  1. package com.guli.service.impl;
  2. import com.guli.service.SmsService;
  3. import com.guli.utils.SmsUtils;
  4. import com.tencentcloudapi.common.Credential;
  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 org.springframework.stereotype.Service;
  9. @Service
  10. public class SmsServiceImpl implements SmsService {
  11. /**
  12. * 发送短信,详细设置查看test类
  13. *
  14. * @param phone
  15. * @param sixBitRandom
  16. * @return
  17. */
  18. @Override
  19. public Boolean send(String phone, String sixBitRandom) {
  20. try {
  21. /* 必要步骤:
  22. * 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey*/
  23. Credential cred = new Credential(SmsUtils.SECRET_ID, SmsUtils.SECRET_KEY);
  24. /* 实例化要请求产品(以sms为例)的client对象,第二个参数是地域信息*/
  25. SmsClient client = new SmsClient(cred, SmsUtils.REGION);
  26. /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数*/
  27. SendSmsRequest req = new SendSmsRequest();
  28. /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */
  29. // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看
  30. String sdkAppId = "xxxxxx";
  31. req.setSmsSdkAppId(sdkAppId);
  32. /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */
  33. // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
  34. String signName = "xxxxx";
  35. req.setSignName(signName);
  36. /* 模板 ID: 必须填写已审核通过的模板 ID */
  37. // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
  38. String templateId = "xxxxx";
  39. req.setTemplateId(templateId);
  40. /* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */
  41. String[] templateParamSet = {sixBitRandom, "5"};
  42. req.setTemplateParamSet(templateParamSet);
  43. /* 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号]
  44. * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号 */
  45. phone = "+86" + phone;
  46. String[] phoneNumberSet = {phone};
  47. req.setPhoneNumberSet(phoneNumberSet);
  48. /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
  49. * 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 */
  50. SendSmsResponse res = client.SendSms(req);
  51. // 输出json格式的字符串回包
  52. System.out.println(SendSmsResponse.toJsonString(res));
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. return false;
  56. }
  57. return true;
  58. }
  59. }

2.controller

  1. package com.guli.controller;
  2. import com.guli.commonUtils.R;
  3. import com.guli.service.SmsService;
  4. import com.guli.utils.RandomUtil;
  5. import com.mysql.cj.util.StringUtils;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.data.redis.core.RedisTemplate;
  8. import org.springframework.web.bind.annotation.*;
  9. import java.util.concurrent.TimeUnit;
  10. @RestController
  11. @CrossOrigin
  12. @RequestMapping("/eduSms")
  13. public class SmsController {
  14. @Autowired
  15. private SmsService smsService;
  16. @Autowired
  17. private RedisTemplate<String, String> redisTemplate;
  18. /**
  19. * 向手机号发送短信
  20. *
  21. * @param phone
  22. * @return
  23. */
  24. @GetMapping("send/{phone}")
  25. public R sendSms(@PathVariable String phone) {
  26. //1.如果redis中存在,就直接返回
  27. String code = redisTemplate.opsForValue().get(phone);
  28. if (!StringUtils.isNullOrEmpty(code)) {
  29. return R.ok().message("验证码已存在");
  30. }
  31. //2.如果redis中不存在,就发送验证码
  32. //随机生成验证码,RandomUtil是自己写的工具类
  33. String sixBitRandom = RandomUtil.getSixBitRandom();
  34. Boolean isSend = smsService.send(phone, sixBitRandom);
  35. if (isSend) {
  36. //将验证码存入redis,并设置超时为5分钟
  37. redisTemplate.opsForValue().set(phone, sixBitRandom, 5, TimeUnit.MINUTES);
  38. return R.ok().message("验证码发送成功");
  39. } else {
  40. return R.error().message("验证码发送失败");
  41. }
  42. }
  43. }

3.随机数工具类

  1. package com.guli.utils;
  2. import java.text.DecimalFormat;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Random;
  7. /**
  8. * 获取随机数
  9. *
  10. * @author qianyi
  11. *
  12. */
  13. public class RandomUtil {
  14. private static final Random random = new Random();
  15. private static final DecimalFormat fourdf = new DecimalFormat("0000");
  16. private static final DecimalFormat sixdf = new DecimalFormat("000000");
  17. public static String getFourBitRandom() {
  18. return fourdf.format(random.nextInt(10000));
  19. }
  20. public static String getSixBitRandom() {
  21. return sixdf.format(random.nextInt(1000000));
  22. }
  23. /**
  24. * 给定数组,抽取n个数据
  25. * @param list
  26. * @param n
  27. * @return
  28. */
  29. public static ArrayList getRandom(List list, int n) {
  30. Random random = new Random();
  31. HashMap<Object, Object> hashMap = new HashMap<Object, Object>();
  32. // 生成随机数字并存入HashMap
  33. for (int i = 0; i < list.size(); i++) {
  34. int number = random.nextInt(100) + 1;
  35. hashMap.put(number, i);
  36. }
  37. // 从HashMap导入数组
  38. Object[] robjs = hashMap.values().toArray();
  39. ArrayList r = new ArrayList();
  40. // 遍历数组并打印数据
  41. for (int i = 0; i < n; i++) {
  42. r.add(list.get((int) robjs[i]));
  43. System.out.print(list.get((int) robjs[i]) + "\t");
  44. }
  45. System.out.print("\n");
  46. return r;
  47. }
  48. }

4.配置信息

  1. package com.guli.utils;
  2. import lombok.Data;
  3. import org.springframework.beans.factory.InitializingBean;
  4. import org.springframework.boot.context.properties.ConfigurationProperties;
  5. import org.springframework.stereotype.Component;
  6. /**
  7. * 常量类,注入配置文件属性
  8. * 用spring的 InitializingBean 的 afterPropertiesSet 来初始化配置信息(将私有的变量值给常量以供其他类使用),
  9. * 这个方法将在所有的属性被初始化后调用
  10. */
  11. @Component
  12. @ConfigurationProperties(prefix = "qclound.cos.file")
  13. @Data
  14. public class SmsUtils implements InitializingBean {
  15. private String secretId; //从配置文件中读取的腾讯云id
  16. private String secretKey;//从配置文件中读取的腾讯云密钥
  17. private String region;//从配置文件中读取的腾讯云地域信息
  18. public static String REGION;
  19. public static String SECRET_KEY;
  20. public static String SECRET_ID;
  21. @Override
  22. public void afterPropertiesSet() throws Exception {
  23. SECRET_ID = this.secretId;
  24. SECRET_KEY = this.secretKey;
  25. REGION = this.region;
  26. }
  27. }