• java 调用阿里云短信接口


    1.情景展示

    阿里云短信接口调用,如何用java实现?

    2.具体分析

    先去阿里云申请账号,拿到分配的秘钥,以及配置好短信模板。

    所需jar包

    <!-- 阿里云短信 -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-core</artifactId>
        <version>4.6.0</version>
        <exclusions>
            <exclusion>
                <artifactId>gson</artifactId>
                <groupId>com.google.code.gson</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
        <version>2.2.1</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.9.0</version>
    </dependency>

    如果需要最新版,去maven中央仓库获取即可:https://mvnrepository.com/

    3.具体实现

    先搞一个参数配置实体类;

    import lombok.*;
    import lombok.experimental.Accessors;
    
    import java.util.Map;
    
    /**
     * 短信配置类
     * @description:
     * @author: Marydon
     * @date: 2022-06-02 9:41
     * @version: 1.0
     * @email: marydon20170307@163.com
     */
    @Builder
    @Accessors(chain = true)
    @Setter
    @Getter
    public class MsgConfig {
        // 发送短信的产品
        @Builder.Default
        private String product = "Dysmsapi";
        // 发送短信的域名
        @Builder.Default
        private String domain = "dysmsapi.aliyuncs.com";
        // 区域ID
        @Builder.Default
        private String regionId = "cn-hangzhou";
        // AccessKey ID
        private String accessKeyId;
        // AccessKey Secret
        private String secret;
        // 短信签名
        @Builder.Default
        private String signName = "阿里云";
        // 短信模板CODE
        private String templateCode;
        // 接收短信的手机号
        private String phone;
        // 动态配置的模板参数名称及参数值
        private Map<String, String> templateParams;
        // 短信发送成功/失败(默认值:false)
        private boolean isSuccess;
        // 短信发送成功/失败 信息
        private String message;
    
        @Override
        public String toString() {
            return "MsgConfig{" +
                    "product='" + product + '\'' +
                    ", domain='" + domain + '\'' +
                    ", regionId='" + regionId + '\'' +
                    ", accessKeyId='" + accessKeyId + '\'' +
                    ", secret='" + secret + '\'' +
                    ", signName='" + signName + '\'' +
                    ", templateCode='" + templateCode + '\'' +
                    ", phone='" + phone + '\'' +
                    ", templateParams=" + templateParams +
                    ", isSuccess=" + isSuccess +
                    ", message='" + message + '\'' +
                    '}';
        }
    
        public static void main(String[] args) {
            System.out.println(MsgConfig.builder().build().isSuccess);
        }
    }

    说明:

    短信签名,与你注册账号时的签名保持一致,而且调短信接口的时候,不能随意更改,否则,会提示:

    该账号下找不到对应签名。

    具体实现:

    import code.marydon.encapsulation.dataType.MapBuilder;
    import code.marydon.encapsulation.dataType.StringUtils;
    import com.alibaba.fastjson2.JSONObject;
    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.profile.DefaultProfile;
    import com.aliyuncs.regions.ProductDomain;
    import com.google.gson.Gson;
    import lombok.extern.slf4j.Slf4j;
    import org.jetbrains.annotations.NotNull;
    
    /**
     * 阿里云短信工具类
     * @description:
     * @author: Marydon
     * @date: 2022-05-31 16:02
     * @version: 1.0
     * @email: marydon20170307@163.com
     */
    @Slf4j
    public final class AliYunMsgUtils{
    
        // 私有化构造方法(防止外部实例化)
        private AliYunMsgUtils() {}
    
        private static AliYunMsgUtils msgUtils = null;
    
        // 单例
        public static AliYunMsgUtils getInstance() {
            return msgUtils == null ? new AliYunMsgUtils() : msgUtils;
        }
    
        // AccessKey ID
        private final String ACCESS_KEY_ID = "ID";
        // AccessKey Secret
        private final String ACCESS_KEY_SECRET = "秘钥";
        // 短信模板CODE
        private final String TEMPLATE_CODE = "SMS_210079199";
    
        /*
         * 发送短信
         * @description:
         * @date: 2022/6/1 15:43
         * @param: config 初始化参数
         * @return: code.marydon.encapsulation.msg.MsgConfig 返回它自己,方便后期调试
         */
        @NotNull
        public static MsgConfig sendMsg(MsgConfig config) {
            try {
                AliYunMsgUtils aliYunMsgUtils = AliYunMsgUtils.getInstance();
    
                String accessKeyId;
                if (StringUtils.isEmpty(config.getAccessKeyId())) {
                    accessKeyId = aliYunMsgUtils.ACCESS_KEY_ID;
                    config.setAccessKeyId(accessKeyId);
                } else {
                    accessKeyId = config.getAccessKeyId();
                }
                String accessKeySecret;
                if (StringUtils.isEmpty(config.getSecret())) {
                    accessKeySecret = aliYunMsgUtils.ACCESS_KEY_SECRET;
                    config.setSecret(accessKeySecret);
                } else {
                    accessKeySecret = config.getSecret();
                }
    
                DefaultProfile profile = DefaultProfile.getProfile(config.getRegionId(), accessKeyId, accessKeySecret);
                IAcsClient client = new DefaultAcsClient(profile);
                SendSmsRequest request = new SendSmsRequest();
                // 固定值(必须配置)
                request.setSysProductDomain(new ProductDomain(config.getProduct(), config.getDomain()));
                request.setSignName(config.getSignName());
                String templateCode;
                if (StringUtils.isEmpty(config.getTemplateCode())) {
                    templateCode = aliYunMsgUtils.TEMPLATE_CODE;
                    config.setTemplateCode(templateCode);
                } else {
                    templateCode = config.getTemplateCode();
                }
    
                request.setTemplateCode(templateCode);
                // 设置接收短信的手机号
                request.setPhoneNumbers(config.getPhone());
                // 模板变量集合,在阿里云当中${name}配置
                request.setTemplateParam(new Gson().toJson(config.getTemplateParams()));
                // 调用
                SendSmsResponse response = client.getAcsResponse(request);
                // 返回结果
                JSONObject json = JSONObject.parseObject(new Gson().toJson(response));
                log.info(json.toString());
    
                config.setSuccess(json.get("code").equals("OK"));
                config.setMessage((String) json.get("message"));
            } catch (Exception e) {
                e.printStackTrace();
                log.error(e.getMessage());
                config.setMessage(e.getMessage());
            }
            return config;
        }
    }

    调用:

    public static void main(String[] args) {
        // 配置短信参数
        MsgConfig msgConfig = MsgConfig.builder().build()
                .setPhone("手机号")
                .setSignName("博客园")
                .setTemplateCode("SMS_210079199")
                .setTemplateParams(MapBuilder.build().put("模板参数", "1234").get());
        // 发送短信
        msgConfig = sendMsg(msgConfig);
        // 打印结果
        System.out.println(msgConfig.toString());
    }

    阿里云接口返回结果,如下:

    {"requestId":"6633E9B9-FF9B-52ED-907B-EDB6D7CC6F45","bizId":"207611654156631160^0","code":"OK","message":"OK"}

    调用阿里云接口,实际请求遵照以下格式:

    http://dysmsapi.aliyuncs.com/?PhoneNumbers=接收短信的手机号&Action=SendSms&Timestamp=2022-06-02T07%3A57%3A10Z&SignName=%E9%83%91%E5%B7%9E%E6%96%B0%E7%9B%8A%E5%8D%8E&TemplateCode=SMS_210079199&SignatureVersion=1.0&Format=JSON&SignatureNonce=e8a9e05b-b72d-48b0-852a-b35a6bfcbf9716541566309211&Version=2017-05-25&AccessKeyId=你的KEY&Signature=QYBqUP%2Fx9Q8%2BNSR8KMniwUbYqJQ%3D&SignatureMethod=HMAC-SHA1&TemplateParam=%7B%22模板变量名称%22%3A%221234%22%7D&RegionId=cn-hangzhou

    如果我们拿着这个链接,去网页请求,会得到如下结果:

    写在最后

      哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

     相关推荐:

  • 相关阅读:
    Asp.net MVC3 Routing study
    Sharepoint 站点页面错误问题
    vc2010 学习笔记1
    UML类成员的困惑
    河道二维水流模拟高精度算法研究
    朱庆:真三维GIS技术进展
    map
    SIGGRAPH 2010: 一场视觉盛宴[转]
    新网站开张,欢迎大家
    获取其它进程内EDIT BOX内容的一种方法
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/16338191.html
Copyright © 2020-2023  润新知