目前短信验证码应用场景就太多了,比如 : 用户注册、登录验证、找回密码、支付认证等,我们基本上都是通过第三方的短信服务完成对用户的验证,当然国内比较出名的就是阿里云 and 腾讯云,阿里云短信通讯是原名叫‘大于’,腾讯云没怎么了解过,阿里云的SDK和API官网都有,所以这里演示腾讯云,因为个人认证每个月有100条免费哦呢!!
腾讯云短信申请:https://cloud.tencent.com/product/sms
目前集成的项目是SpringBoot+rabbitmq,首先引入依赖包。
代码语言:javascript
复制
<!--腾讯云短信-->
<dependency>
<groupId>com.github.qcloudsms</groupId>
<artifactId>qcloudsms</artifactId>
<version>1.0.6</version>
</dependency>
编写配置文件,为了方便修改,我们直接写入在 application.yml
中
代码语言:javascript
复制
qloud:
sms:
appid: # 短信应用 SDK AppID
appkey: # 短信应用 SDK AppKey
templateId: #短信模板 ID,需要在短信应用中申请
smsSign: # 签名参数使用的是`签名内容`,而不是`签名ID`
time: #自定义验证码过期时间
新建工具类Smsutil,简单的从官方的代码中修改一下。
代码语言:javascript
复制
@Component
public class SmsUtil2 {
/**
* 指定ID模版进行发送短信
* @param phoneNumbers 手机号【可以发送多个】
* @param checkCode 自己生成的验证码
* @param time 过期时间
* @param appid 腾讯云申请查看
* @param appkey 腾讯云申请查看
* @param templateId 腾讯云申请查看
* @param smsSign 腾讯云申请查看
* @return
* @throws HTTPException
* @throws IOException
*/
public SmsSingleSenderResult SMS(String[] phoneNumbers, String checkCode, String time, int appid, String appkey, int templateId, String smsSign) throws HTTPException, IOException {
String[] params = {checkCode, time};
SmsSingleSender ssender = new SmsSingleSender(appid, appkey);
SmsSingleSenderResult result = ssender.sendWithParam("86", phoneNumbers[0],
templateId, params, smsSign, "", "");
return result;
}
}
最后在项目中使用即可。集成的mq,所以直接写个监听类即可。
代码语言:javascript
复制
@Component @RabbitListener(queues = "qcloudsms") public class SmsListener2 {
@Autowired private SmsUtil2 smsUtil2; @Value("${qloud.sms.appid}") private int appid; @Value("${qloud.sms.appkey}") private String appkey; @Value("${qloud.sms.templateId}") private int templateId; @Value("${qloud.sms.smsSign}") private String smsSign; @Value("${qloud.sms.time}") private String time; @RabbitHandler public void sendSms(Map<String, String> message) { System.out.println("mq中获取手机号:" + message.get("mobile")); System.out.println("mq中获取验证码:" + message.get("check_code")); String mobile = message.get("mobile"); String check_code = message.get("check_code"); String[] mobilearr = {mobile}; try { smsUtil2.SMS(mobilearr,check_code, time, appid, appkey, templateId, smsSign); } catch (HTTPException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
}
最后使用即可,我申请的模版格式是:
您的验证码为:{1},请于{2}分钟内填写,如非本人操作请忽略!
1是传入验证码,2是传入验证码过期时间。
最后测试结果如下: