若依集成短信宝平台实现短信验证登录功能
短信宝平台简单介绍:
一个可以发送短信验证码的平台,里面有各种语言的开发文档,这里我们以Java为例。虽没有阿里云,腾讯云短信平台规模大,但上手很快,当然肯定也是收费的
短信宝平台官网:http://smsbao.com/
以下结合若依代码进行介绍
1.这是若以脚手架进行短信登录验证的controller
/**
* 短信验证码
*
* @param phonenumber 用户手机号
*/
@GetMapping("/captchaSms")
public R<Void> smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber){
if (!smsProperties.getEnabled()) {
return R.fail("当前系统没有开启短信功能!");
}
String key = CacheConstants.CAPTCHA_CODE_KEY + phonenumber;
String code = RandomUtil.randomNumbers(6);
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
// 验证码模板id 自行处理 (查数据库或写死均可)
String templateId = "1";
Map<String, String> map = new HashMap<>(1);
map.put("code", code);
map.put("username","");
map.put("password","");
try {
SmsUtilsByLogin.send(phonenumber, templateId, map);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return R.fail("发送失败");
}
return R.ok("发送成功");
}
2.其中最为核心的部分就是send方法,这是短信发送的核心方法,而这个send方法被一个工具类调用,SmsUtilsByLogin,就是短信发送的工具类,是我自己封装的,代码来自于官网的开发文档,可以直接拿去使用
package com.ruoyi.sms.utils;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
/**
* @ClassName SmsUtilsByLogin
* @Description TODO
* @Author cmk123
* @Data 2023-09-13 18:54
* @Version 1.0
**/
public class SmsUtilsByLogin {
public static void sendCode(String phoneNumber, Map<String, String> param) throws NoSuchAlgorithmException {
String testContent = "【若依审批平台】您正在进行注册,您的验证码是"+param.get("code")+",2分钟内有效,如非本人操作,请谨慎操作";
String httpUrl = "http://api.smsbao.com/sms";
StringBuffer httpArg = new StringBuffer();
httpArg.append("u=").append(param.get("username")).append("&");
httpArg.append("p=").append(SmsUtilsByLogin.md5(param.get("password"))).append("&");
httpArg.append("m=").append(phoneNumber).append("&");
httpArg.append("c=").append(SmsUtilsByLogin.encodeUrlString(testContent, "UTF-8"));
SmsUtilsByLogin.request(httpUrl, httpArg.toString());
}
public static String request(String httpUrl, String httpArg) {
BufferedReader reader = null;
String result = null;
StringBuffer sbf = new StringBuffer();
httpUrl = httpUrl + "?" + httpArg;
try {
URL url = new URL(httpUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
InputStream is = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String strRead = reader.readLine();
if (strRead != null) {
sbf.append(strRead);
while ((strRead = reader.readLine()) != null) {
sbf.append("\n");
sbf.append(strRead);
}
}
reader.close();
result = sbf.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static String md5(String plainText) throws NoSuchAlgorithmException {
StringBuffer buf = null;
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest();
int i;
buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return buf.toString();
}
public static String encodeUrlString(String str, String charset) {
String strret = null;
if (str == null)
return str;
try {
strret = java.net.URLEncoder.encode(str, charset);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return strret;
}
public static void send(String phonenumber, String templateId, Map<String, String> map) throws NoSuchAlgorithmException {
SmsUtilsByLogin.sendCode(phonenumber,map);
}
}
3.想要发送短信,首先要去短信宝平台注册账号密码,短信1毛钱1条,自行购买就可以,然后将你的账号密码,粘贴到controller层的 smsCaptcha方法里面,具体位置如下,封装到一个map集合中,进行传递给send方法
Map<String, String> map = new HashMap<>(1);
map.put("code", code);
map.put("username","");
map.put("password","");
4.send方法又调用了本类sendCode方法,额。。。其实这才是短信发送的核心代码,send只不过做了一层调用,那我们就来看一下这个sendCode方法,testContent的内容就是短信发送的内容,其中code是6位随机码,httpUrl是短信宝网址,调用的它的接口,然后后面append()都是再添加name=value&name=value参数罢了,最核心的是SmsUtilsByLogin类的request方法,因为这个方法要真正发送调用短信宝的接口
public static void sendCode(String phoneNumber, Map<String, String> param) throws NoSuchAlgorithmException {
String testContent = "【若依审批平台】您正在进行注册,您的验证码是"+param.get("code")+",2分钟内有效,如非本人操作,请谨慎操作";
String httpUrl = "http://api.smsbao.com/sms";
StringBuffer httpArg = new StringBuffer();
httpArg.append("u=").append(param.get("username")).append("&");
httpArg.append("p=").append(SmsUtilsByLogin.md5(param.get("password"))).append("&");
httpArg.append("m=").append(phoneNumber).append("&");
httpArg.append("c=").append(SmsUtilsByLogin.encodeUrlString(testContent, "UTF-8"));
SmsUtilsByLogin.request(httpUrl, httpArg.toString());
}
5至于PhoneNumber是前端传过来的,code是用RandomUtil类直接生成的,代码如下:
String code = RandomUtil.randomNumbers(6);
全名cn.hutool.core.util.RandomUtil,不知道是谁写的,随便百度一下引一个依赖应该就可以,用起来还是很方便的.
浙公网安备 33010602011771号