阿里云短信发送接口

标签: java  sms短信

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

希望对你有帮助!

 

版权声明:本文为qq_37272886原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37272886/article/details/103047833