1. 阿里云新增签名和模版,过程需要审核
短信服务 (aliyun.com)https://dysms.console.aliyun.com/domestic/text
2.以下代码,直接使用
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
package com.sms.config;
import com.alibaba.fastjson.JSON;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
/**
* 阿里云通信
*/
public class SmsConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(SmsConfig.class);
/**
* 验证码短信
* 您的验证码为:${code},请勿泄露于他人!
*/
public static final String code_msg_verify_code = "*********";
// 使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符
public static final String VERIFY_CODES = "123456789ABCDEFGHJKLMNPQRSTUVWXYZ";
// 验证码数字字符源
public static final String NUM_VERIFY_CODES = "1234567890";
/**
* 发送短信
*/
public static SendSmsResponse sendSms(SendSmsRequest req, String accessKeyId, String accessKeySecret, String signName) {
try {
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// 初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
IAcsClient acsClient = new DefaultAcsClient(profile);
// 组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
// 必填:待发送手机号
request.setPhoneNumbers(req.getPhoneNumbers());
// 必填:短信签名-可在短信控制台中找到
request.setSignName(signName);
// 必填:短信模板-可在短信控制台中找到
request.setTemplateCode(req.getTemplateCode());
// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam(req.getTemplateParam());
//hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
return sendSmsResponse;
} else {
LOGGER.error("调用阿里云通信发送短信失败{}", sendSmsResponse.getMessage());
//throw new ClientException(sendSmsResponse.getCode(), sendSmsResponse.getMessage());
}
} catch (Exception e) {
LOGGER.error("发送短信验证码异常 {}", e.getMessage());
//throw new CustomException("发送短信验证码异常");
}
return null;
}
public static void main(String[] args) {
String numVerifyCode = generateNumVerifyCode(6);
Map<String, String> templateParam = new HashMap<>();
templateParam.put("code", numVerifyCode);
SendSmsRequest req = new SendSmsRequest();
// 必填:短信签名-可在短信控制台中找到
req.setTemplateCode(SmsConfig.code_msg_verify_code);
req.setTemplateParam(JSON.toJSONString(templateParam));
// 手机号码
req.setPhoneNumbers("*********");
// 发送
SendSmsResponse sendSmsResponse = sendSms(req, "***", "*****", "******");
System.out.println(JSON.toJSONString(sendSmsResponse));
}
public static String generateNumVerifyCode(int verifySize) {
return generateVerifyCode(verifySize, NUM_VERIFY_CODES);
}
/**
* 使用指定源生成验证码
* @param verifySize 验证码长度
* @param sources 验证码字符源
*/
public static String generateVerifyCode(int verifySize, String sources) {
if (sources == null || sources.length() == 0) {
sources = VERIFY_CODES;
}
int codesLen = sources.length();
Random rand = new Random(System.currentTimeMillis());
StringBuilder verifyCode = new StringBuilder(verifySize);
for (int i = 0; i < verifySize; i++) {
verifyCode.append(sources.charAt(rand.nextInt(codesLen - 1)));
}
return verifyCode.toString();
}
}
注意: (1)accessKeyId和accessKeySecret从阿里云账号AccessKey获取
(2)signName 获取方式
(3)code_msg_verify_code 获取方式