欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

阿里云短信发送接口

程序员文章站 2022-04-26 13:31:31
...

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

希望对你有帮助!

 

相关标签: java sms短信