一、开通阿里云短信服务,为开发时需要用到的信息做准备
1、注册或者使用自己的支付宝账号登录阿里云官网
2、搜索并找到短信服务,进行开通(开通是不要钱的,发送短信的时候才需要钱)
3、注册自己的短信签名,得到签名(区分国内外)
4、注册自己的短信模板,得到模板 code (区分国内外)
5、鼠标悬浮到右上角自己的用户头像,点击 AccessKey 进去 ,获取 AccessKey 的 ID 和 Secret
此处注意选择,继续使用 AccessKey 和 使用子用户 AccessKey ,一个是获得所有权限,一个是获得部分权限。
请记住如果申请完子用户AccessKey后不要立即关闭窗口,先将申请的AccessKeySecret进行保存,因为关闭后,再也没办法进行查看AccessKeySecret,只能查看到AccessKeyId
二、Java 中调用 阿里云 的短信服务接口
1、maven 中导入以下依赖
<!--阿里云短信接口api-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.0.0</version>
</dependency>
2、具体调用实现类,短信发送方法
package com.testaliyun.api.aliyun;
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 java.text.SimpleDateFormat;
import java.util.Dictionary;
import java.util.regex.Pattern;
// 阿里短信发送
public class SendSmsUtil {
// 产品名称:云通信短信API产品,开发者无需替换
private static final String product = "Dysmsapi";
// 产品域名,开发者无需替换
private static final String domain = "dysmsapi.aliyuncs.com";
// 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
private static String mobile = "13145678901";
private static String accessKeyId = "Access Key ID";
private static String accessKeySecret = "Access Key Secret";
private static String signName = "短信签名";
private static String templeteCode = "短信模版Code(一般都是SMS_********格式)";
// 发送短信方法
/**
* @param mobile 接收号码
* @param signName 短信签名
* @param templeteCode 短信模板Code(一般都是SMS_********格式)
* @param templeteContent 短信模板对应内容
* @return
* @throws ClientException
*/
public SendSmsResponse sendSms(String mobile, String signName, String templeteCode, String templeteContent) throws 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(mobile);
// 必填:短信签名-可在短信控制台中找到
request.setSignName(signName);
// 必填:短信模板-可在短信控制台中找到
request.setTemplateCode(templeteCode);
// 可选:模板中的变量替换JSON串,如模板内容为"尊敬的用户,您的验证码为${code}"时,此处的值为
// String templeteContent= "{\"code\":\""+code+"\"}";
request.setTemplateParam(templeteContent);
// hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = null;
try {
sendSmsResponse = acsClient.getAcsResponse(request);
} catch (ClientException e) {
throw new RuntimeException(e.getMessage());
}
return sendSmsResponse;
}
//已短信短信查询方法
/**
* @param mobile 接收号码
* @param bizId 调用发送短信接口时返回的BizId(选填)
* @param pageSize 页大小(10L)
* @param currentPage 当前页码(1L)
* @param sendDate 短信发送的日期,支持30天内记录查询(可查其中一天的发送数据),格式yyyyMMdd
* @return
* @throws ClientException
*/
public QuerySendDetailsResponse selectSendSms(String mobile, String bizId, Long pageSize, Long currentPage,String sendDate) throws
ClientException {
//初始化ascClient
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象
QuerySendDetailsRequest request = new QuerySendDetailsRequest();
//必填-号码
request.setPhoneNumber(mobile);
//可选-调用发送短信接口时返回的BizId
if(bizId != null){
request.setBizId(bizId);
}
//必填-短信发送的日期 支持30天内记录查询(可查其中一天的发送数据),格式yyyyMMdd
request.setSendDate(sendDate);
//必填-页大小
request.setPageSize(pageSize);
//必填-当前页码从1开始计数
request.setCurrentPage(currentPage);
//hint 此处可能会抛出异常,注意catch
QuerySendDetailsResponse querySendDetailsResponse = null;
try {
querySendDetailsResponse = acsClient.getAcsResponse(request);
} catch (ClientException e) {
throw new RuntimeException(e.getMessage());
}
//获取返回结果
if(querySendDetailsResponse.getCode() != null && querySendDetailsResponse.getCode().equals("OK")){
//代表请求成功
}
return querySendDetailsResponse;
}
/**
* 验证手机号码是否合法
* @param mobile
* @return true 合法 false 不合法
*/
public static boolean IsMobile(String mobile)
{
Pattern pattern = Pattern.compile("^[1]\\d{10}$");
Matcher matcher = pattern.matcher(mobile);
return matcher.matches();
}
/**
* 短信发送后返回消息处理机制
* @param str 传入发送短信后,返回的状态码code
* @return 根据 code 返回对应异常信息
*/
public static String smsMessageHandle(String str){
String result = "";
switch (str)
{
case "OK":
result = "短信发送成功!";
break;
case "isp.RAM_PERMISSION_DENY":
result = "RAM权限DENY";
break;
case "isv.OUT_OF_SERVICE":
result = "业务停机";
break;
case "isv.PRODUCT_UN_SUBSCRIPT":
result = "未开通云通信产品的阿里云客户";
break;
case "isv.PRODUCT_UNSUBSCRIBE":
result = "产品未开通";
break;
case "isv.ACCOUNT_NOT_EXISTS":
result = "账户不存在";
break;
case "isv.ACCOUNT_ABNORMAL":
result = "账户异常 ";
break;
case "isv.SMS_TEMPLATE_ILLEGAL":
result = "短信模板不合法";
break;
case "isv.SMS_SIGNATURE_ILLEGAL":
result = "短信签名不合法";
break;
case "isv.INVALID_PARAMETERS":
result = "参数异常";
break;
case "isv.MOBILE_NUMBER_ILLEGAL":
result = "非法手机号";
break;
case "isv.MOBILE_COUNT_OVER_LIMIT":
result = "手机号码数量超过限制";
break;
case "isv.TEMPLATE_MISSING_PARAMETERS":
result = "模板缺少变量";
break;
case "isv.BUSINESS_LIMIT_CONTROL":
result = "业务限流";
break;
case "isv.INVALID_JSON_PARAM":
result = "JSON参数不合法,只接受字符串值";
break;
case "isv.PARAM_LENGTH_LIMIT":
result = "参数超出长度限制";
break;
case "isv.PARAM_NOT_SUPPORT_URL":
result = "不支持URL";
break;
case "isv.AMOUNT_NOT_ENOUGH":
result = "账户余额不足";
break;
case "isv.TEMPLATE_PARAMS_ILLEGAL":
result = "模板变量里包含非法关键字";
break;
}
return result;
}
//测试 短信发送 与 短信查询 的方法
public void sendSms() throws InterruptedException {
//验证手机号码
if (IsMobile(mobile)) {
try {
//调用发送短信方法
SendSmsResponse sendSmsResponse = sendSms(mobile, signName, templeteCode, templeteContent);
if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
//请求成功
//发送短信之后睡眠3秒
Thread.sleep(3000L);
//查询已发送短信
QuerySendDetailsResponse querySendDetailsResponse = selectSendSms(mobile, sendSmsResponse.getBizId(), 10L,1L,new SimpleDateFormat("yyyyMMdd").format(new Date()));
for (QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs()) {
content = smsSendDetailDTO.getContent();
}
}else{
//请求失败,根据错误码获取问题
String s = smsMessageHandle(sendSmsResponse.getCode());
}
} catch (ClientException e) {
throw new RuntimeException(e.getMessage());
}
}else{
System.out.println("电话号码不合理");
}
}
}
关注公众号查看更多资源