Java 对接 阿里云 的短信服务完成短信的发送与查询

一、开通阿里云短信服务,为开发时需要用到的信息做准备

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("电话号码不合理");
        }
    }

 }

关注公众号查看更多资源
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
阿里云短信对接需要以下步骤: 1. 在阿里云短信控制台中创建签名和模板,获取对应的签名和模板CODE。 2. 在阿里云控制台中获取 AccessKey ID 和 AccessKey Secret。 3. 在代码中调用阿里云短信 API,传入必要的参数,例如短信模板、签名、接收手机号等。 这里提供一个简单的 PHP 代码示例: ```php <?php require_once './aliyun-php-sdk-core/Config.php'; use Aliyun\Core\DefaultAcsClient; use Aliyun\Core\Profile\DefaultProfile; use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest; // 替换成自己的AccessKey信息 $accessKeyId = "your_accessKeyId"; $accessKeySecret = "your_accessKeySecret"; // 设置阿里云短信服务所在的Region,如华东1 $region = "cn-hangzhou"; // 替换成自己的短信签名和模板CODE $signName = "your_signName"; $templateCode = "your_templateCode"; // 发送短信的手机号码,支持多个手机号码,用英文逗号分隔 $phoneNumbers = "your_phoneNumbers"; // 短信模板中的变量替换JSON串,如验证码为:{"code":"123456"} $templateParam = "{\"code\":\"123456\"}"; // 初始化DefaultAcsClient实例并设置参数 $profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret); DefaultProfile::addEndpoint("cn-hangzhou", "cn-hangzhou", "Sms", "sms.aliyuncs.com"); $client = new DefaultAcsClient($profile); $request = new SendSmsRequest(); // 设置请求参数 $request->setPhoneNumbers($phoneNumbers); $request->setSignName($signName); $request->setTemplateCode($templateCode); $request->setTemplateParam($templateParam); // 发送短信 $response = $client->getAcsResponse($request); // 输出结果 print_r($response); ?> ``` 注意,以上代码中需要替换成自己的 AccessKey ID、AccessKey Secret、短信签名、模板 CODE、手机号码、短信模板变量等信息。另外,阿里云短信服务需要收取一定的费用,请确保账户余额充足。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值