引言
使用腾讯云:与微信公众号进行对接,使短信的签名和模板审核能够通过
使用阿里云:需要有上线的网站或者app
前期准备
01、需要有一个个人公众号。如果没有,请去微信公众平台创建一个订阅号(个人只能创建订阅号)
02、打开腾讯云,搜索短信,找到应用管理下的应用列表,创建应用
03、备份创建完成的AppID和App Key(编写代码需要用)
04、打开国内短信,创建签名模板和短信模板
05、等待审核通过
06、集成好Redis,用作存储短信验证码。如果你还没有集成好Redis,请参考此篇文章:
Spring boot 项目(十)——集成 Redis
代码部分
01、导入maven依赖
<!--腾讯云短信服务SDK-->
<dependency>
<groupId>com.github.qcloudsms</groupId>
<artifactId>qcloudsms</artifactId>
<version>1.0.2</version>
</dependency>
02、创建用于储存信息的实体类
import lombok.Data;
@Data
public class SMSParameter {
// 应用里的 AppId
private int appId = xxxxx;
// 应用里的 App Key
private String appKey = "xxxxx";
// 可有可无
private String[] phoneNumbers;
// 正文模板里的 id
private int templateId = xxxx;
// 签名里的内容
private String smsSign = "xxxxx";
}
03、编写生成随机验证码的工具类
package com.demo.qcby.util;
import java.security.SecureRandom;
import java.util.Random;
public class VerCodeGenerateUtil {
private static final String SYMBOLS = "0123456789";//ABCDEFGHIGKLMNOPQRSTUVWXYZ
private static final Random RANDOM = new SecureRandom();
//生成 6 位数的随机数字
public static String generateVerCode() {
char[] numbers = new char[6];
for (int i = 0; i < numbers.length; i++) {
numbers[i] = SYMBOLS.charAt(RANDOM.nextInt(SYMBOLS.length()));
}
return new String(numbers);
}
}
04、编写发送信息的实现层代码
package com.information.controller;
import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import com.github.qcloudsms.httpclient.HTTPException;
import com.information.common.web.ResultJson;
import com.information.entity.SMSParameter;
import com.information.util.RedisUtil;
import com.information.util.VerCodeGenerateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.IOException;
/**
* 短信验证的控制层
*
* @author lx
* @since 2021-12-02 13:18:15
*/
@RestController
@RequestMapping
@Slf4j
public class TestController {
@Resource
private RedisUtil redisUtil;
/*
* @Description:发送短信验证码
* @param phone
*/
@RequestMapping("sendText")
public ResultJson sendText(String phone) throws HTTPException, IOException {
SMSParameter smsParameter=new SMSParameter();
// 生成 随机验证码
String ver = VerCodeGenerateUtil.generateVerCode();
// 这里对应你的短信模板,如果需要传递两个参数,那么字符串数组应该有两个值
String[] code = new String[]{ver,""+10};
//写入redis中缓存
redisUtil.setCacheObject(phone,ver);
redisUtil.expire(phone,10*60);
//获得 id 和 key
SmsSingleSender sender = new SmsSingleSender(smsParameter.getAppId(), smsParameter.getAppKey());
// SmsSingleSenderResult result = sender.sendWithParam("86", phone, smsParameter.getTemplateId(),
// code, smsParameter.getSmsSign(), "", "" );
//发送短信,86 指的是国内短信,第二个是模板的 id,第三个是传递的参数,第四个是签名内容,后面两个可以传递空
SmsSingleSenderResult result = sender.sendWithParam("86", phone, smsParameter.getTemplateId(),
code, smsParameter.getSmsSign(), "", "");
// 如果 result 的结果是 0,说明发送成功
if (result.result == 0) {
return ResultJson.success(code[0]);
} else {// 如果结果不是 0,说明出错了,打印错误信息以帮助修改
return ResultJson.failure(result.errMsg, result.sid);
}
}
/*
* @Description: 判断验证码是否一致
* @param phone
* @param code
*/
@RequestMapping("judge")
public String judge(String phone,String code){
Object var=redisUtil.getCacheObject(phone);
if (code.equals(var)){
/*用户登录*/
return "验证成功";
}else{
return "验证失败";
}
}
}
测试结果