1.先去阿里云开通短信服务:
2.添加模板及签名:
标准参照:https://help.aliyun.com/document_detail/55324.html?spm=5176.sms-sign.0.0.765c1cbeNhvWBZ
去申请模板及签名:
3.创建自己的访问秘钥(AccessKeyId 与 AccessKeySecret)
4.代码编写,引入jar包
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
相关配置代码:
.yml文件添加阿里云短信相关配置:
// TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
xx:
#阿里云短信
aliyunMessage:
accessKeyId: xxxxxxxxxxxxxxxxxxxx // TODO 改这里
secret: xxxxxxxxxxxxxxxxxxx // TODO 改这里
regionid: cn-hangzhou
signName: XXX // TODO 改这里 这里是短信签名
@Getter
@Configuration
public class AliyunMessageConfig {
@Value("$xx.aliyunMessage.secret}")
private String secret;
@Value("${xx.aliyunMessage.accessKeyId}")
private String accessKeyId;
@Value("${xx.aliyunMessage.regionid}")
private String regionid;
@Value("${xx.aliyunMessage.signName}")
private String signName;
@Bean
public IAcsClient aliyunClient() {
DefaultProfile profile = DefaultProfile.getProfile(regionid, accessKeyId, secret);
return new DefaultAcsClient(profile);
}
}
/**
* @description:
* @author: zhangt
* @create: 2021-4-14
**/
public enum MessageTemplateConstants {
/**
* 验证码(SMS_XXXXXX为模板id)
* 模板内容: 验证码为:${code},用于登录...
*/
VERFY_MESSAGE_ID("SMS_xxxxxxxxx", new String[]{"code"});
private String txt;
private String[] keys;
MessageTemplateConstants(String txt, String[] keys) {
this.txt = txt;
this.keys = keys;
}
public static MessageTemplateConstants search(String xx){
for(MessageTemplateConstants c:MessageTemplateConstants.values()){
if(c.txt.equals(xx)){
return c;
}
}
return null;
}
public String getTxt() {
return txt;
}
public String[] getKeys() {
return keys;
}
public void setKeys(String[] keys) {
this.keys = keys;
}
public void setTxt(String txt) {
this.txt = txt;
}
}
@Service
public class SendMessageService {
@Autowired
private AliyunSendMessageService sendMessageService;
/**
* 发送短信
*
* @param phone
* @param content
*/
@Async
public void sendAsync(String phone, String content) {
JSONArray array = new JSONArray();
array.add(content);
send(phone, MessageTemplateConstants.VERFY_MESSAGE_ID, array.toJSONString());
}
/**
* 发送短信验证码
*
* @param phone 手机号码
* @param content //短信内容
*/
@Transactional
public String send(String phone, MessageTemplateConstants templateId, String content) {
JSONArray array = JSONArray.parseArray(content);
String[] keys = templateId.getKeys();
JSONObject js = new JSONObject();
for (int i = 0; i < keys.length; i++) {
js.put(keys[i], array.get(i));
}
return sendMessageService.send(phone, templateId.getTxt(), js.toJSONString());
}
}
@Service
public class AliyunSendMessageService {
@Autowired
private IAcsClient client;
@Autowired
private AliyunMessageConfig config;
@Transactional
public String send(String phone, String templateId, String content) {
log.info("发送短信 phone={},templateId={},content={}",phone,templateId,content);
if (!PhoneCheck.valid(phone)) {
throw new HCException(CommonErrorCode.E100001, "手机号码不正确");
}
if (StringUtil.isBlank(templateId)) {
throw new HCException(CommonErrorCode.E100001, "短信模板为空");
}
if (StringUtil.isBlank(content)) {
throw new HCException(CommonErrorCode.E100001, "短信内容不在能为空");
}
CommonRequest request = new CommonRequest();
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
request.putQueryParameter("RegionId", "cn-hangzhou");
//必填:待发送手机号
request.putQueryParameter("PhoneNumbers", phone);
//必填:短信签名-可在短信控制台中找到
request.putQueryParameter("SignName", config.getSignName());
//必填:短信模板-可在短信控制台中找到
request.putQueryParameter("TemplateCode", templateId);
//可选
request.putQueryParameter("TemplateParam", content);
try {
CommonResponse response = client.getCommonResponse(request);
log.info("短信发送结果",response.getData());
return response.getData();
} catch (Exception e) {
log.error("短信发送失败", e);
return e.getMessage();
}
}
}
以下为测试代码:
@Autowired
private SendMessageService sendMessageService;
public static void main(String[] args) throws Exception {
//入参为手机号码及验证码
sendMessageService.sendAsync(mobile, verify);
}
完成!!