使用 Java 调用阿里云短信服务

  • 使用 Java 调用阿里云短信服务
  • 登录阿里云申请短信服务
  • 申请签名和模板
  • 申请AccessKey获得阿里云账户的操控权限
  • 测试短信发送
  • 使用Java调用阿里云短信服务
  • 验证码随机生成
  • 测试Main方法


使用 Java 调用阿里云短信服务

短信验证码想必大家都不陌生,在很多网站,APP中都有使用到。比如登录,注册,身份校验等场景。不过通常情况下,短信服务都是外包给第三方公司的,接下来向大家分享如何使用阿里的短信服务。

登录阿里云申请短信服务

首先我们登陆阿里云官网,搜索短信服务,注册并开通授权。

这里为了方便小伙伴快速申请也可以点击下方传送门。

阿里云短信服务

java控制短时间内调取短信接口的次数 java读取短信_java控制短时间内调取短信接口的次数

申请签名和模板

根据接收短信的区域选择国内消息或者国际消息,进行相应的签名和模板申请。申请签名没什么注意事项,具体阿里云都有备注提示,申请完签名申请模板,模板名称:就是接收消息的前缀;

模板内容:可以自己写,也可以查看模板库自定义修改;

申请说明 :个人学习交流。(第一次乱写的没有通过)

这些信息填完之后一般不到半小时左右就通过了,这一点不得不佩服阿里云的办事效率。

java控制短时间内调取短信接口的次数 java读取短信_经验分享_02


java控制短时间内调取短信接口的次数 java读取短信_java_03

申请AccessKey获得阿里云账户的操控权限

java控制短时间内调取短信接口的次数 java读取短信_阿里云_04


java控制短时间内调取短信接口的次数 java读取短信_maven_05


为了安全考虑这里推荐使用子用户AccessKey,给予最小对应权限即可。

java控制短时间内调取短信接口的次数 java读取短信_阿里云_06


java控制短时间内调取短信接口的次数 java读取短信_经验分享_07


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

测试短信发送

准备工作完成后,在短信服务的快速学习栏中,可以使用创建的签名和模板进行发送测试看看效果,没问题后,再进行编码操控。(如余额不足,需要先对账户进行充值)遇到错误代码不要慌,先查看帮助文档;

java控制短时间内调取短信接口的次数 java读取短信_java_08


java控制短时间内调取短信接口的次数 java读取短信_java_09


成功事例

java控制短时间内调取短信接口的次数 java读取短信_java_10

使用Java调用阿里云短信服务

这里尽量使用新的api进行操控,链接: 官方文档 Maven项目架包依赖如下:

<!--阿里云短信sdk-->
 <dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.1.0</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
    <version>2.0.0</version>
</dependency>

工具类如下:

package com.Utils;

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;

/**
 * @ClassName AliyunSmsUtils
 * @Description AliyunSmsUtils
 * @Author Wang
 * @Date 2020/7/4 11:14
 * @Version 1.0
 **/
public class AliyunSmsUtils {
    //产品名称:云通信短信API产品,开发者无需替换
    static final String product = "Dysmsapi";
    //产品域名,开发者无需替换
    static final String domain = "dysmsapi.aliyuncs.com";

    // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
    static final String accessKeyId = "your accessKeyId";
    static final String accessKeySecret = "your accessKeySecret";

    public static SendSmsResponse sendSms(String telephone, String code) 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(telephone);
        //必填:短信签名-可在短信控制台中找到
        request.setSignName("签名名称");
        //必填:短信模板-可在短信控制台中找到
        request.setTemplateCode("SMS_Code");//SMS_开头的模板Code
        //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
//        request.setTemplateParam("{\"name\":\"Tom\", \"code\":\"123\"}");
        request.setTemplateParam("{\"code\":\"" + code + "\"}");
        //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
        //request.setSmsUpExtendCode("90997");
        //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
        //  request.setOutId("yourOutId");
        //hint 此处可能会抛出异常,注意catch
        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
        if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
            System.out.println("短信发送成功!");
        } else {
            System.out.println("短信发送失败!");
        }
        return sendSmsResponse;
    }
}

验证码随机生成

private static int newcode;

    public static int getNewcode() {
        return newcode;
    }

    public static void setNewcode() {
        newcode = (int) (Math.random() * 9999) + 100;  //每次调用生成一位四位数的随机数
    }

测试Main方法

public static void main(String[] args) throws ClientException{
        setNewcode();
        String code = Integer.toString(getNewcode());
        System.out.println("发送的验证码为:" + code);
        //发短信
        SendSmsResponse response = sendSms("yourPhone", code); //
        System.out.println("短信接口返回的数据----------------");
        System.out.println("Code=" + response.getCode());
        System.out.println("Message=" + response.getMessage());
        System.out.println("RequestId=" + response.getRequestId());
        // System.out.println("BizId=" + response.getBizId());
    }

测试成功

java控制短时间内调取短信接口的次数 java读取短信_java_11


项目源码