本文欢迎转载,转载请注明出处,谢谢~(作者:喝酒不骑马 Colton_Null)
from CSDN
短信验证码是通过发送验证码到手机的一种有效的验证码系统。主要用于验证用户手机的合法性及敏感操作的身份验证。
现在市面上的短信服务平台有很多。大家在选择的时候未免会有些不好抉择。本人建议选择短信服务商应遵循以下几点:
最近的一个项目中,注册和修改密码时需要用到短信验证码校验手机号的功能。本人也是对比几家后,直接选择阿里云通信的短信服务。(本身项目服务器也是部署在阿里云上,但之前并不知道阿里云有短信服务,早知道阿里有的话就不会浪费时间找其他平台了)。废话不多说,下面直接开始短信验证服务教程。
<dependency>
<groupId>aliyun-message-sdk-coregroupId>
<artifactId>aliyun-message-sdk-coreartifactId>
<version>3.2.3version>
<scope>systemscope>
<systemPath>${project.basedir}/src/main/resources/lib/aliyun-java-sdk-core-3.2.2.jarsystemPath>
dependency>
<dependency>
<groupId>aliyun-message-sdk-mnsgroupId>
<artifactId>aliyun-message-sdk-mnsartifactId>
<version>1.1.8version>
<scope>systemscope>
<systemPath>${project.basedir}/src/main/resources/lib/aliyun-sdk-mns-1.1.8.jarsystemPath>
dependency>
<dependency>
<groupId>aliyun-java-sdk-dysmsapigroupId>
<artifactId>aliyun-java-sdk-dysmsapiartifactId>
<version>1.0.0version>
<scope>systemscope>
<systemPath>${project.basedir}/src/main/resources/lib/aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jarsystemPath>
dependency>
注意,
、
、
随意填写。
必须要加,这表示导入本地的jar包。
${project.basedir}
为项目的根路径。
public class AliyunMessageUtil {
private static final String product = "Dysmsapi";
//产品域名,开发者无需替换
private static final String domain = "dysmsapi.aliyuncs.com";
// 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
private static final String accessKeyId = "这里替换你的accessKeyId";
private static final String accessKeySecret = "这里替换你的accessKeySecret";
public static SendSmsResponse sendSms(Map paramMap) throws com.aliyuncs.exceptions.ClientException {
//可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
//必填:待发送手机号
request.setPhoneNumbers(paramMap.get("phoneNumber"));
//必填:短信签名-可在短信控制台中找到
request.setSignName(paramMap.get("msgSign"));
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(paramMap.get("templateCode"));
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam(paramMap.get("jsonContent"));
//选填-上行短信扩展码(无特殊需求用户请忽略此字段)
// request.setSmsUpExtendCode(paramMap.get("extendCode"));
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
// request.setOutId(paramMap.get("outId"));
//hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
return sendSmsResponse;
}
}
sendSms(Map
方法是我封装的方法。传入的参数是paramMap,其中包含以下属性:
phoneNumber
:接受者手机号
msgSign
:短信签名名称。在控制台的短信签名里能找到。
templateCode
:短信模版的code。见控制台中的模版code。
jsonContent
:需要替换的变量的JSON字符串。对于验证码来说,String jsonContent = "{\"number\":\"" + randomNum + "\"}";
即可。其中randomNum是随机生成的6位验证码。
extendCode
:上行短信模板的验证码,不需要的话可以忽略
outId
:扩展字段,不需要则可以忽略
public String sendMsg() throws LgdServiceException, ClientException {
String phoneNumber = "18888888888";
String randomNum = createRandomNum(6);
String jsonContent = "{\"number\":\"" + randomNum + "\"}";
Map paramMap = new HashMap<>();
paramMap.put("phoneNumber", phoneNumber);
paramMap.put("msgSign", "喝酒不骑马");
paramMap.put("templateCode", "xxxxxxxx");
paramMap.put("jsonContent", jsonContent);
SendSmsResponse sendSmsResponse = AliyunMessageUtil.sendSms(paramMap);
if(!(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK"))) {
if(sendSmsResponse.getCode() == null) {
//这里可以抛出自定义异常
}
if(!sendSmsResponse.getCode().equals("OK")) {
//这里可以抛出自定义异常
}
}
}
/**
* 生成随机数
* @param num 位数
* @return
*/
public static String createRandomNum(int num){
String randomNumStr = "";
for(int i = 0; i < num;i ++){
int randomNum = (int)(Math.random() * 10);
randomNumStr += randomNum;
}
return randomNumStr;
}
短信效果如图所示
以上就是阿里云通信短信验证码发送的方法。对于验证码的校验,可参见我的另一篇博文SpringBoot实现短信验证码校验