1、先在阿里云购买短信服务,完了之后阿里云会给你AccessKeyId和 AccessKeySecret 字段的值,然后需要在阿里云设置短信签名和短信模板,模板审核比较容易通过,签名审核一定要按照阿里云的规范去申请
2、代码配置文件 application-dev.xml 和 pom.xml文件
#阿里云短信服务
sms:
ali:
product: Dysmsapi
domain: dysmsapi.aliyuncs.com
signName: #你设置的签名名称
accessKeyId: #阿里云给你的key
accessKeySecret: #阿里云给你的密钥
<!--阿里短信sdk-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.7.1</version>
<!--注:如提示报错,先升级基础包版,无法解决可联系技术支持-->
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
3、代码逻辑层,工具类SmsConfig.java 里面的sendSms()方法调用可直接发送短信,前提是你的配置文件和参数设置正确
package com.superkind.common.config.sms;
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.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
* 阿里短信配置文件
*/
@Component
public class SmsConfig {
/**
* 产品名称:云通信短信API产品,开发者无需替换
*/
@Value("${sms.ali.product}")
private String product;
/**
* 产品域名,开发者无需替换
*/
@Value("${sms.ali.domain}")
private String domain;
/**
* 短信平台keyID
*/
@Value("${sms.ali.accessKeyId}")
private String accessKeyId;
/**
* 短信平台keySecret
*/
@Value("${sms.ali.accessKeySecret}")
private String accessKeySecret;
/**
* 短信签名
*/
@Value("${sms.ali.signName}")
private String signName;
/**
* 阿里云短信发送api
* @param templateCode 短信模板ID
* @param phone 短信接收号码,支持以逗号分隔的形式进行批量调用
* @param obj 短信模板变量替换JSON串
* @return
* @throws ClientException
* @throws IOException
*/
public SendSmsResponse sendSms(String templateCode, String phone, Object obj) throws ClientException, IOException {
SendSmsResponse sendSmsResponse = null;
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);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
//必填:待发送手机号
request.setPhoneNumbers(phone);
//必填:短信签名-可在短信控制台中找到
request.setSignName(signName);
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(templateCode);
ObjectMapper objectMapper = new ObjectMapper();
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam(objectMapper.writeValueAsString(obj));
//选填-上行短信扩展码(无特殊需求用户请忽略此字段)
//request.setSmsUpExtendCode("90997");
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
//request.setOutId("yourOutId");
//hint 此处可能会抛出异常,注意catch
sendSmsResponse = acsClient.getAcsResponse(request);
} catch (Exception e) {
e.printStackTrace();
}
return sendSmsResponse;
}
}
4、最终调用,因为工具类使用了@Component注解,所以在调用的时候需要先注入一下