使用阿里云短信服务有两种方式
API 发送和 控制台发送,控制台发送到话有太多限制,这里我们使用API 通过 调用服务端代码进行发送。
整体结构如下:
导入依赖
<!--阿里云短信发送-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>
外放接口
/**
* 发送手机验证码
*/
@ApiOperation(value = "发送手机验证码", notes = "发送手机验证码")
@PostMapping("/sendSMS")
public ApiResult sendSMS(@RequestParam("phone") String phone) {
//六位数随机数
long rand = (long)(Math.random()*900000+100000);
String mCode = String.valueOf(rand);
boolean mS = SengSmsUtils.sendSMS(phone,mCode);
//返回数据
SmsReturnVO smsReturnVO = new SmsReturnVO();
smsReturnVO.setSendSuccess(true);
smsReturnVO.setMCode(MD5Utils.toMD5(mCode));
if (!mS){
smsReturnVO.setSendSuccess(false);
}
return ApiResult.ok(smsReturnVO);
}
MD5加密
/**
* Md5加密,加密规则与客户端一致*/
public class MD5Utils {
public static String toMD5(String s){
String mStr = "头部特殊字符" + s + "尾部特殊字符";
try {
mStr = DigestUtils.md5DigestAsHex(mStr.getBytes(StandardCharsets.UTF_8));
} catch (Exception e) {
e.printStackTrace();
}
return mStr;
}
}
发送工具类
/**
* 发送短信通知
* 多发
*List<String> mobiles = new ArrayList<>();
*mobiles.add("15*******13");
*mobiles.add("13*******27");
*mobiles.add("17*******56");
*String s= getSplitString(mobiles);
*/
public class SengSmsUtils {
// 签名
private static final String signName = "签名管理-签名名称";
// 模板
private static final String templateCode = "模板管理-模板CODE";
// 阿里云短信配置信息
private static final String accessKeyId = "AccessKey管理-创建AccessKey";
private static final String accessKeySecret = "创建后会显示";
private static final String REGION_ID = "cn-hangzhou"; //固定不用改
private static final String PRODUCT = "Dysmsapi"; //固定不用改
private static final String DOMAIN = "dysmsapi.aliyuncs.com"; //固定不用改
public static boolean sendSMS(String mobile,String mCode) {
try {
IClientProfile profile = DefaultProfile.getProfile(REGION_ID, accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint(REGION_ID, REGION_ID, PRODUCT, DOMAIN);
IAcsClient acsClient = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
request.setMethod(MethodType.POST);
// 手机号可以单个也可以多个(多个用逗号隔开,如:15*******13,13*******27,17*******56)
request.setPhoneNumbers(mobile);
request.setSignName(signName);
request.setTemplateCode(templateCode);
request.setTemplateParam("{\"code\":"+"'"+mCode+"'"+"}");
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if ((sendSmsResponse.getCode() != null) && (sendSmsResponse.getCode().equals("OK"))) {
return true;
} else {
return false;
}
} catch (ClientException e) {
return false;
}
}
/**
* 获取逗号分隔的拼接字符串
*/
public static String getSplitString(List<String> str) {
StringBuilder newS = new StringBuilder();
if (str != null && str.size() > 0) {
for (String s : str) {
newS.append(s).append(",");
}
}
if (newS.length() > 0){
newS.deleteCharAt(newS.length() - 1);// 删除最后一个多余的逗号
}
return newS.toString();
}
}
接口返回数据
/**
* 发送验证码返回数据类*/
@Data
public class SmsReturnVO {
//是否发送成功
private Boolean sendSuccess;
//发送成功携带验证码
private String mCode;
}
此时,调用接口后,会将加密后的验证码返回给接口调用端,接口调用端 在输入框数据验证码后进行MD5 加密,与服务端给的对比即可 (加密规则要与服务端对应)
补充,在发送工具类中的参数在阿里云中如何查看
签名管理-签名名称
模板管理-模板CODE
AccessKey管理-创建AccessKey