1、业务需求
发送短信功能是一个很普遍的需求,比如验证码,快递单号,通知信息一类。 而在Java中实现短信功能相对简单,只需要调用短信服务商提供的API。接下来以阿里云为例,介绍如何实现短信发送功能,其他短信服务商也是类似的操作。
2、短信发送逻辑
阿里云短信发送逻辑大致总结为:提供登录阿里云的账号(AccessKey ID)和密码(AccessKey Secret)登录后,选择对应的短信签名和模版,填充对应的短信内容(模版参数),然后将短信发送到指定的手机号。
签名:短信开头时【】内的公司信息
模板:短信内容的骨架,可填充对应参数
注意:阿里云短信服务申请签名主要针对企业开发,个人申请时有一定难度,在审核时会审核资质,需要上传营业执。但阿里云提供了测试签名和测试模板,开发测试时只需要获取对应的测试签名和测试模板。
- 获取AccessKeyId和AccessKeySecret,点击头像右上角的AccessKey管理按钮后获取。
- 获取测试签名和模板
3、代码实现
目前阿里云短信服务的SDK分为1.0版本和2.0版本,1.0已经不再维护,推荐使用2.0版本,下面列举了两种方式的实现代码。
- 2.0版本
(1) Maven方式引入pom依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.24</version>
</dependency>
(2) 代码编写
代码逻辑:创建发送短信的客户端,提供参数调用对应方法即可。 需要提供下面几个参数:
- AccessKey ID:类似登录阿里云时的账号
- AccessKey Secret:类似登录阿里云的密码
- phone:接收短信的号码
- signName:短信签名,即短信开头时【】内的公司信息
- templateCode:模版编码,即短信内容的骨架
- templateParam:模版参数,即要往短信模版骨架中填充的内容
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teautil.models.RuntimeOptions;
public class SMSUtils {
/**
* 阿里云登录id
*/
private final static String ACCESS_KEY_ID = "your access key id";
/**
* 阿里云登录密码
*/
private final static String ACCESS_KEY_SECRET = "your access key secret";
/**
* 初始化登录阿里云的Client
*
* @param accessKeyId
* @param accessKeySecret
* @return Client
*/
public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
.setAccessKeyId(accessKeyId)
.setAccessKeySecret(accessKeySecret);
// 可指定登录的服务器地址,可参考 https://api.aliyun.com/product/Dysmsapi
config.endpoint = "dysmsapi.aliyuncs.com";
return new com.aliyun.dysmsapi20170525.Client(config);
}
/**
* 发送短信方法
* @param phoneNumbers 手机号
* @param signName 签名
* @param templateCode 模板编号
* @param param 模板参数
* @throws Exception
*/
public static void sendMessage(String phoneNumbers, String signName, String templateCode, String param) throws Exception {
com.aliyun.dysmsapi20170525.Client client = SMSUtils.createClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
.setPhoneNumbers(phoneNumbers)
.setSignName(signName)
.setTemplateCode(templateCode)
.setTemplateParam(param);
SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new RuntimeOptions());
System.out.println("短信发送成功,返回结果是:"+sendSmsResponse);
}
public static void main(String[] args) {
try {
SMSUtils.sendMessage("15179068888", "阿里云短信测试", "SMS_154958888", "{\"code\":\"7777\"}");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
- 1.0版本
(1) Maven方式引入pom依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.16</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.1.0</version>
</dependency>
(2) 代码编写
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;
/**
* 短信发送工具类
*/
public class SMSUtils {
/**
* 发送短信
* @param signName 签名
* @param templateCode 模板
* @param phoneNumbers 手机号
* @param param 模板参数
*/
public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){
// client的参数,服务器ip, accessKeyId, accessKeySecret
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "xxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxx");
// 登录client
IAcsClient client = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
request.setSysRegionId("cn-hangzhou");
request.setPhoneNumbers(phoneNumbers);
request.setSignName(signName);
request.setTemplateCode(templateCode);
request.setTemplateParam("{\"code\":\""+param+"\"}");
try {
SendSmsResponse response = client.getAcsResponse(request);
System.out.println("短信发送成功");
}catch (ClientException e) {
e.printStackTrace();
}
}
}