Java调用阿里云短信服务

一、注册登陆

阿里云官网:https://www.aliyun.com/

如果没有注册需要注册并进行实名认证

实名地址:https://account.console.aliyun.com/v2/#/authc/home

二、开通短信服务

进入短信服务
在这里插入图片描述
免费开通
在这里插入图片描述

三、添加签名

选择国内消息–>签名管理–>添加签名
在这里插入图片描述
签名内容
在这里插入图片描述

四、添加模板

我只会马关报春

五、国内消息设置

安全设置
在这里插入图片描述
发送频率设置在这里插入图片描述
联系人管理,用来通知安全设置中的限制
在这里插入图片描述
黑名单解除记录
在这里插入图片描述

六、账户余额充值

想要发送短信,账户中必须要有余额
首页:https://usercenter2.aliyun.com/home
在这里插入图片描述
使用支付宝进行支付就可以了,可以是任意金额,非常方便

国内短信定价

  • 按量付费
    根据短信的发送条数进行实时梯度计费。短信模板的类型不同,短信的单价也不同。实时计费,自动跨档,跨档后当月所有发送量按新阶梯价重新计算。
    在这里插入图片描述
  • 国内通用短信套餐包
    为了降低用户的使用成本,短信服务提供国内短信套餐包。 仅可用于国内文本短信,不包括国际及港澳台短信。使用短信服务时优先抵用套餐包中的数量。
    套餐包时长为24个月,即短信额度的有效时长为24个月。超出24个月之后按照短信模板类型梯度计费。
    在这里插入图片描述

七、AccessKey 管理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
请记住申请完子用户AccessKey后不要立即关闭窗口,先将申请的AccessKeySecret进行保存,因为关闭后,再也没办法进行查看AccessKeySecret,只能查看到AccessKeyId。

八、开发

8.1、版本说明

目前短信服务SDK分为:升级版SDK(推荐使用)和原版SDK。两者的区别如下所示:

说明 BusinessRequest版本SDK不再维护

对比项 升级版SDK 原版SDK
生成方案 基于DSL语言 Darabonba 基于模版生成,各编程语言之间采用不同的模版方案,各个语言之间功能完备程度不一致,使用体验不一。
语言支持 支持主流6门语言的SDK生成 大部分云产品的老版本SDK无法支持超过3门以上的主流语言。
SDK示例 各语言间的代码在逻辑行为上保持一致,通过中间语言来统一生成,具有校验能力,有效保证示例代码的准确性。 各语言间的代码示例不一致,不能保证代码的正确性。
SDK场景化示例 通过DSL一次编写就能生成多语言的SDK场景化示例,可以协助开发者极大的简化SDK使用的理解成本。 多语言场景化示例编写难度大,覆盖语言数较少。

8.2、 原版 SDK

8.2.1、直接使用

导入项目所需依赖包

 <dependencies>
 	 <!--原版 SDK - 阿里云Java SDK核心库-->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-core</artifactId>
        <version>4.5.16</version>
    </dependency>

    <!--阿里 FastJSON,json格式转换-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.39</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

拷贝“使用示例”代码,并替换示例代码中关键信息

示例地址:https://help.aliyun.com/document_detail/112148.html?spm=a2c4g.11186623.6.670.97dd1e08nhV97h

package com.java521.controller;

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;

/**
 * @Author: xuwendong
 * @Date: 2021/7/16 14:22
 * @Description: 阿里云短信测试
 */
public class SendSms {
    
    
    private static String accessKeyId = "LTAI5tKmStGAf3QzS18*****";
    private static String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZRsg*****";


    public static void main(String[] args) {
    
    
        /*
         * ap-northeast-1代表RegionID
         * 表明使用那个服务区域服务器发生短信,建议根据项目所在服务器选择
         * 具体情况可以参考下面的【阿里云服务器地域介绍】
         *
         */

        //DefaultProfile profile = DefaultProfile.getProfile("ap-northeast-1", "<accessKeyId>", "<accessSecret>");

        DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", accessKeyId, accessKeySecret);
        IAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");
        request.putQueryParameter("PhoneNumbers", "1314520****");
        request.putQueryParameter("SignName", "用生命研发技术");
        request.putQueryParameter("TemplateCode", "SMS_21890****");
        request.putQueryParameter("TemplateParam", "{\"code\":\"6666\"}");
        try {
    
    
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
        } catch (ServerException e) {
    
    
            e.printStackTrace();
        } catch (ClientException e) {
    
    
            e.printStackTrace();
        }
    }
}

发送短信测试
在这里插入图片描述

8.2.2、封装短信工具类

定义短信发送工具类

package com.java521.utils;

import com.alibaba.fastjson.JSON;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;

/**
 * @Author: xuwendong
 * @Date: 2021/7/16 15:05
 * @Description: 阿里云短信发送工具类
 */
@Slf4j
public class AliyunSmsUtil {
    
    
    //短信发送成功状态码
    private static final String OK = "OK";
    //阿里云短信发送相关参数设置
    private static final String REGIONID = "cn-beijing";
    private static final String DOMAIN = "dysmsapi.aliyuncs.com";
    private static final String VERSION = "2017-05-25";
    private static final String ACTION = "SendSms";
    //
    private static final String accessKeyId = "LTAI5tKmStGAf3QzS18*****";
    private static final String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZRsg*****";

    /**
     * 功能描述: 阿里云短信发送接口,支持通知、验证码、激活码类短信
     *
     * @param map map中所需参数,参数名称固定,如下(注意:参数首字母都是小写的):
     *            phoneNumbers : 手机号码,支持多个中间以“,”英文逗号分隔 (必填)
     *            signName :签名(必填)
     *            templateCode :模板code(必填)
     *            templateParam :模板参数(不必填,如果是通知类短信,该参数可以不设置)
     * @return : java.lang.Boolean
     * true-短信发送成功;false-短信发送失败
     */
    public static Boolean sendSms(Map<String, String> map) {
    
    
        Boolean flag = false;
        DefaultProfile profile = DefaultProfile.getProfile(REGIONID, accessKeyId, accessKeySecret);
        IAcsClient client = new DefaultAcsClient(profile);
        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        //发送短信域名,不要改变
        request.setSysDomain(DOMAIN);
        request.setSysVersion(VERSION);
        request.setSysAction(ACTION);
        request.putQueryParameter("PhoneNumbers", map.get("phoneNumbers"));
        request.putQueryParameter("SignName", map.get("signName"));
        request.putQueryParameter("TemplateCode", map.get("templateCode"));
        //通知类短信,模板不需要参数。判断传递的模板参数是否为空,如果为空可能是通知类短信,则不需要添加模板参数条件
        if (map.get("templateParam") != null) {
    
    
            request.putQueryParameter("TemplateParam", map.get("templateParam"));
        }
        try {
    
    
            //发送短信
            CommonResponse response = client.getCommonResponse(request);
            //发送短信结果转为Map类型
            Map<String, String> responseMap = JSON.parseObject(response.getData(), Map.class);
            //判断短信发送是否成功
            if (OK.equals(responseMap.get("Code"))) {
    
    
                flag = true;
            }
            log.debug("send fail[code={}, message={}]", responseMap.get("Code"), responseMap.get("Message"));
        } catch (ServerException e) {
    
    
            e.printStackTrace();
        } catch (ClientException e) {
    
    
            e.printStackTrace();
        }
        return flag;
    }
}

测试发送短信工具类

package com.java521.controller;

import com.java521.utils.AliyunSmsUtil;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: xuwendong
 * @Date: 2021/7/16 15:06
 * @Description: 工具类短信发送测试
 */
public class AliyunSendSmsTest {
    
    
    public static void main(String[] args) {
    
    
        //封装工具类所需参数
        Map<String,String> map = new HashMap<>();
        map.put("phoneNumbers","1314520****");
        map.put("signName","用生命研发技术");
        map.put("templateCode","SMS_21890****");
        map.put("templateParam","{\"code\":\"8888\"}");
        //调用工具类完成短信发送
        Boolean success = AliyunSmsUtil.sendSms(map);
        //验证短信发送是否成功
        if(success){
    
    
            System.out.println("短信发送成功");
        }else{
    
    
            System.out.println("短信发送失败");
        }
    }
}

发送短信测试
在这里插入图片描述

8.3、升级版SDK

添加升级版SDK依赖

<!--升级版 SDK-->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>dysmsapi20170525</artifactId>
    <version>2.0.4</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>tea-openapi</artifactId>
    <version>0.0.16</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>tea-console</artifactId>
    <version>0.0.1</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>tea-util</artifactId>
    <version>0.2.11</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>tea</artifactId>
    <version>[1.0.3, 2.0.0)</version>
</dependency>

编写示例

package com.java521.controller;

import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teaopenapi.models.Config;

/**
 * @Author: xuwendong
 * @Date: 2021/7/16 15:29
 * @Description:
 */
public class Sample {
    
    
    /**
     * 使用AK&SK初始化账号Client
     *
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    public static Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
    
    
        Config config = new Config()
                // 您的AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 您的AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // 访问的域名
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new Client(config);
    }

    public static void main(String[] args_) throws Exception {
    
    
        String accessKeyId = "LTAI5tKmStGAf3QzS18*****";
        String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZRsg*****";
        java.util.List<String> args = java.util.Arrays.asList(args_);
        com.aliyun.dysmsapi20170525.Client client = Sample.createClient(accessKeyId, accessKeySecret);
        SendSmsRequest sendSmsRequest = new SendSmsRequest()
                .setPhoneNumbers("1314520****")
                .setSignName("用生命研发技术")
                .setTemplateCode("SMS_21890****")
                .setTemplateParam("{\"code\":\"520520\"}");
        // 复制代码运行请自行打印 API 的返回值
        SendSmsResponse response = client.sendSms(sendSmsRequest);
        System.out.println(response.getHeaders());
        System.out.println("=========");
        /**
         *   "RequestId": "10C14877-9808-4C80-84E1-8F7D45B92502",
         *   "Message": "OK",
         *   "BizId": "626211126421974956^0",
         *   "Code": "OK"
         */
        System.out.println(response.getBody().getRequestId());
        System.out.println(response.getBody().getMessage());
        System.out.println(response.getBody().getBizId());
        System.out.println(response.getBody().getCode());
    }
}

发送短信测试
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37242720/article/details/118516024