使用阿里云短信服务有两种方式
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