1、注册阿里云账号,并开通云短信服务
开通短信服务时免费的,但是发短信需要从点钱,短信收费可以按发送条数收费
2、充值
3、申请短信签名
4、申请短信模板
5、创建AccessKey,这是很重要,是程序调用短信api接口的凭证
可以查看接入文档
6、代码开发调用接口
(1)创建springboot gradle工程
(2)导入jar包
(jar可以去官网下载,代码官网上面也有)2个jar包,一个aliyun-java-sdk-core包,另外一个是alicom-dysms-api包。
<!--短信SDK-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-dysmsapi -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
(3)java api
(4)工程项目中添加短信发送工具类AliyunSmsUtil
代码如下:
package com.aliyun.aliyunsms.util;
import com.alibaba.fastjson.JSON;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 阿里云sms短信工具类
*/
public class AliyunSmsUtil {
private static final Logger logger = LoggerFactory.getLogger(AliyunSmsUtil.class);
//签名(阿里平台配置)
public static String signName = "阿里云";
/**
* AccessKey ID(阿里平台配置),
*/
private static String accessKeyId = "LTAID*******";
/**
* Access Key Secret(阿里平台配置)
*/
private static String accessKeySecret = "TP7vYBU3FFXYI*******";
//短信API产品名称(短信产品名固定,无需修改)
public static final String SMS_PRODUCT = "Dysmsapi";
//短信API产品域名(接口地址固定,无需修改)
public static final String SMS_DOMAIN = "dysmsapi.aliyuncs.com";
/**
* 发送牧家云柜短信
* @param templateCode //必填:短信模版CODE-可在短信控制台中找到
* @param mobile //必填:待发送手机号
* @param templateParam 发送内容替换 key:code value: 内容
* @return true-成功;false-失败
*/
public static boolean sendSms(String templateCode , String mobile , Map<String , String> templateParam) {
//可自助调整超时时间
SendSmsResponse sendSmsResponse = null;
try {
sendSmsResponse = sendSms(signName ,templateCode , mobile , templateParam );
} catch (ClientException e) {
e.printStackTrace();
logger.error("发送短信出错",e);
sendSmsResponse = new SendSmsResponse();
sendSmsResponse.setCode("error");
sendSmsResponse.setMessage(e.toString());
}
//请求成功
if(!"OK".equals(sendSmsResponse.getCode())) {
logger.error("发送消息失败,错误代码:{},code:{}", convertCodeToMsg(sendSmsResponse) , sendSmsResponse.getCode());
return false;
}
logger.info("发送消息成功:{}", JSON.toJSONString(sendSmsResponse));
return true;
}
/**
* 发送短信
* @param singName 必填:短信签名-可在短信控制台中找到
* @param templateCode //必填:短信模板-可在短信控制台中找到
* @param mobile //必填:待发送手机号
* @param templateParam 发送内容替换 key:code value: 内容
* @return
* @throws ClientException
*/
public static SendSmsResponse sendSms(String singName , String templateCode , String mobile , Map<String , String> templateParam) 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", SMS_PRODUCT, SMS_DOMAIN);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
request.setSignName(singName);
request.setTemplateCode(templateCode);
//必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为00+国际区号+号码,如“0085200000000”
request.setPhoneNumbers(mobile);
String templateParamString = JSON.toJSONString(templateParam);
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为"{\"name\":\"Tom\", \"code\":\"123\"}"
//友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
request.setTemplateParam(templateParamString);
//request.setSmsUpExtendCode("90997");//选填-上行短信扩展码(无特殊需求用户请忽略此字段)
request.setOutId("扩展字段"); //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
//请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
return sendSmsResponse;
}
/**
* 转换code为错误信息
* @param sendSmsResponse
* @return
* OK 请求成功
* isp.RAM_PERMISSION_DENY RAM权限DENY
* isv.OUT_OF_SERVICE 业务停机
* isv.PRODUCT_UN_SUBSCRIPT 未开通云通信产品的阿里云客户
* isv.PRODUCT_UNSUBSCRIBE 产品未开通
* isv.ACCOUNT_NOT_EXISTS 账户不存在
* isv.ACCOUNT_ABNORMAL 账户异常
* isv.SMS_TEMPLATE_ILLEGAL 短信模板不合法
* isv.SMS_SIGNATURE_ILLEGAL 短信签名不合法
* isv.INVALID_PARAMETERS 参数异常
* isp.SYSTEM_ERROR 系统错误
* isv.MOBILE_NUMBER_ILLEGAL 非法手机号
* isv.MOBILE_COUNT_OVER_LIMIT 手机号码数量超过限制
* isv.TEMPLATE_MISSING_PARAMETERS 模板缺少变量
* isv.BUSINESS_LIMIT_CONTROL 业务限流
* isv.INVALID_JSON_PARAM JSON参数不合法,只接受字符串值
* isv.BLACK_KEY_CONTROL_LIMIT 黑名单管控
* isv.PARAM_LENGTH_LIMIT 参数超出长度限制
* isv.PARAM_NOT_SUPPORT_URL 不支持URL
* isv.AMOUNT_NOT_ENOUGH 账户余额不足
*/
public static String convertCodeToMsg(SendSmsResponse sendSmsResponse) {
if ("error".equals(sendSmsResponse.getCode())) {
return "调用报错";
}else if ("isp.RAM_PERMISSION_DENY".equals(sendSmsResponse.getCode())) {
return "RAM权限DENY";
}else if ("isv.OUT_OF_SERVICE".equals(sendSmsResponse.getCode())) {
return "业务停机";
}else if ("isv.PRODUCT_UN_SUBSCRIPT".equals(sendSmsResponse.getCode())) {
return "未开通云通信产品的阿里云客户";
}else if ("isv.PRODUCT_UNSUBSCRIBE".equals(sendSmsResponse.getCode())) {
return "产品未开通";
}else if ("isv.ACCOUNT_NOT_EXISTS".equals(sendSmsResponse.getCode())) {
return "账户不存在";
}else if ("isv.ACCOUNT_ABNORMAL".equals(sendSmsResponse.getCode())) {
return "账户异常";
}else if ("isp.SMS_TEMPLATE_ILLEGAL".equals(sendSmsResponse.getCode())) {
return "短信模板不合法";
}else if ("isp.SMS_SIGNATURE_ILLEGAL".equals(sendSmsResponse.getCode())) {
return "短信签名不合法";
}else if ("isp.INVALID_PARAMETERS".equals(sendSmsResponse.getCode())) {
return "参数异常";
}else if ("isp.SYSTEM_ERROR".equals(sendSmsResponse.getCode())) {
return "系统错误";
}else if ("isp.MOBILE_NUMBER_ILLEGAL".equals(sendSmsResponse.getCode())) {
return "非法手机号";
}else if ("isp.MOBILE_COUNT_OVER_LIMIT".equals(sendSmsResponse.getCode())) {
return "手机号码数量超过限制";
}else if ("isp.TEMPLATE_MISSING_PARAMETERS".equals(sendSmsResponse.getCode())) {
return "模板缺少变量";
}else if ("isp.BUSINESS_LIMIT_CONTROL".equals(sendSmsResponse.getCode())) {
return "业务限流";
}else if ("isp.INVALID_JSON_PARAM".equals(sendSmsResponse.getCode())) {
return "JSON参数不合法,只接受字符串值";
}else if ("isp.BLACK_KEY_CONTROL_LIMIT".equals(sendSmsResponse.getCode())) {
return "黑名单管控";
}else if ("isp.PARAM_LENGTH_LIMIT".equals(sendSmsResponse.getCode())) {
return "参数超出长度限制";
}else if ("isp.PARAM_NOT_SUPPORT_URL".equals(sendSmsResponse.getCode())) {
return "不支持URL";
}else if ("isp.AMOUNT_NOT_ENOUGH".equals(sendSmsResponse.getCode())) {
return "账户余额不足";
}
return "未知错误";
}
/**
* 查询短信信息详情
* @param bizId 业务流水号
* @return
* @throws ClientException
*/
public static QuerySendDetailsResponse querySendDetails(String bizId) 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", SMS_PRODUCT, SMS_DOMAIN);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象
QuerySendDetailsRequest request = new QuerySendDetailsRequest();
request.setPhoneNumber("15000000000"); //必填-号码
request.setBizId(bizId); //可选-流水号
SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd"); //必填-发送日期 支持30天内记录查询,格式yyyyMMdd
request.setSendDate(ft.format(new Date()));
request.setPageSize(10L); //必填-页大小
request.setCurrentPage(1L); //必填-当前页码从1开始计数
//hint 此处可能会抛出异常,注意catch
QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
return querySendDetailsResponse;
}
// 产生随机长度码
public static String getNumCode(int intiCode, int endCode) {
String checkCode = "";
for (int i = intiCode; i < endCode; i++) {
String code = (int) Math.floor(Math.random() * 10) + "";
checkCode += code;
}
return checkCode;
}
public static void main(String[] args) {
String loginTemplateCode = "SMS_000" ;//登录模板编码
String registerTemplateCode = "SMS_0001" ;//注册模板编码
String mobile = "1358154***";
String number = getNumCode(0 , 4);//随机生成4位验证码
//模板参数
Map<String , String> templateParam = new HashMap<>();
templateParam.put("code" , number);//验证码,替换阿里云短信模板中的变量
boolean flag = sendSms(registerTemplateCode,mobile,templateParam);
System.out.println("短信发送成功状态:" + (flag ? "成功":"失败"));
}
}
(5)执行main方法测试短信验证码发送
原文链接:https://blog.csdn.net/wen_005/article/details/89919128
希望对你有帮助!