阿里大于短信验证对接(超全面)

1 阿里大于简介

1.1 短信服务

短信服务(Short Message Service)是一种存储和转发服务。也就是,短消息并不是直接从发送人发送到接收人,而始终通过短信服务中心进行转发。

1.2 阿里大于

阿里大于是由阿里云为用户提供,与三大运营商合作;支持向国内和国际快速发送验证码短信通知推广信息的一项短信服务。

1.3 产品优势

快速稳定、覆盖面广、高并发处理、消息堆积处理、易开发管理、智能监控调度

1.4 应用场景

(1)短信验证码

​ APP、网站注册账号,向手机下发验证码; 登录账户、异地登录时的安全提醒; 找回密码时的安全验证; 支付认证、身份校验、手机绑定等

(2)系统信息推送

​ 向注册用户下发系统相关信息,包括: 升级或维护、服务开通、价格调整、 订单确认、物流动态、消费确认、 支付通知等普通通知短信

(3)推广短信

​ 向注册用户和潜在客户发送通知和推广信息,包括促销活动通知、业务推广、新产品宣讲、会员关怀等商品与活动的推广信息。增加企业产品曝光率、提高产品和企业的知名度。

阿里大于短信服务官方介绍文档

2 准备工作

2.1 登录阿里云控制台

(1)账号准备

(2)登录阿里云控制台

(3)点击“短信服务”

阿里云控制台

2.2 短信服务配置

(1)短信服务界面介绍

​ ① 包含了短信服务对接需要的访问密钥(AccessKey)和在线API调试工具。

​ ② 包括短信签名以及短信模板,可以在这里快捷修改短信签名与模板。

​ ③ 这里是短信服务所提供的套餐包,可以按需购买,支持超出满足更高级流量包自动按量更高套餐计费。

(2)用户AccessKey的创建

​ 选择①中的“AccessKey”打开“安全信息管理”界面:

​ 点击“创建AccessKey”会提示发送验证码到当前账号的手机号上,填写收到验证码,则创建成功。

(3)签名申请

​ 选择②中“添加签名”进入“添加签名”界面:

Tips: ①这里注意需要尽量使用真实应用名;②如果为个人使用,使用场景选择“验证码”,否则需要提供签名来源以及证明文件;③注意这里的审核还是很迅速的,记得及时去查看直接的签名审核结果。

(4)模板添加

​ 选择②中“添加模板”进入相应页面:

​ 这里提供我的模板以供参考:

​ 万事具备,只差集成代码。 233...

3 Java对接

3.1 使用OpenAPI Explorer

(1)进入OpenAPI Explorer界面

​ 选择①中“OpenAPI Explorer”进入到接口在线调试界面:

(2)设置参数

​ 选择右下角“API签名”设置参数:AccessKey、AccessSecret

​ 在界面右侧设置参数:PhoneNumbers、Signature、TemplateCode、TemplateParam

Tips:其中参数TemplateParam为Json格式。例如:

​ 这里附上官方请求参数介绍文档

(3)返回结果示例

​ 注意:这里接口已经正常调用,证明代码已经没有问题。接下就是针对自己开发业务的一个集成

3.2 业务集成

(1)分析OpenAPI Explorer示例代码

// 1 首先我们需要导入短信服务所需要SDK依赖,也就是以下依赖,直接复制到项目Pom.xml下引入即可。
/*
pom.xml
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>4.0.3</version>
</dependency>
*/
public class SendSms {
    public static void main(String[] args) {
        // 2 创建一个用于发送短信的客户端的配置类
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
        IAcsClient client = new DefaultAcsClient(profile);
        // 3 实例化公共请求对象
        CommonRequest request = new CommonRequest();
        // 3.1 设置公共请求参数
        request.setMethod(MethodType.POST);
        request.setDomain("dysmsapi.aliyuncs.com");
        request.setVersion("2017-05-25");
        request.setAction("SendSms");
        // 3.2 设置请求参数
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("PhoneNumbers", "待接收短信号");
        request.putQueryParameter("SignName", "签名名称");
        request.putQueryParameter("TemplateCode", "短信模板编号");
        request.putQueryParameter("TemplateParam", "验证码");
        // 4 执行请求得到响应实例
        try {
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

(2)集成SDK

​ 在当前项目文件中添加依赖:

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>4.1.0</version>
</dependency>

(3)针对短信验证业务的分析

​ 根据我所处理的只是用于短信验证的业务,我们需要实现的业务有:
​ ①发送六位随机验证码

​ ②短信验证码验证

​ ③可以灵活的向指定电话号码发送验证码。

(4)参考代码

​ 以下为我根据示例代码和业务需求实现的一个发送验证码工具类;

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.trs.common.base.Defaults;
import lombok.extern.slf4j.Slf4j;

import java.util.Random;

@Slf4j
public class SendSmsUtils {
    /**
     * @Param 请求密钥
     **/
    static final String ACCESS_KEY_ID="***************";
    static final String ACCESS_SECRET="**************";
     //* @Param  注册:您正在申请手机注册,验证码为:${code},5分钟内有效!;
    static final String REGISTER_TEMPLATE_CODE="【短信模板编号】";
     //* @Param  验证:您的验证码:${code},您正进行身份验证,打死不告诉别人!
    static final String VERIFY_TEMPLATE_CODE="【短信模板编号】";
    // @Param  密码重置:您的动态码为:${code},您正在进行密码重置操作,如非本人操作,请忽略本短信!
    static final String PWDUPDATE_TEMPLATE_CODE="【短信模板编号】";

    // 签名名称
    static final String SIGNATURE = "【签名名称】";


    /**
     * @Description 根据模板类型发送指定模板类型的验证短信
     * @Param [phone, templateType]
     **/
    public static CommonResponse sendSmsCodeTophone(String phone,Integer templateFlag,String captCha){
        // 1 实例化短信发送客户端
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID, ACCESS_SECRET);
        IAcsClient client = new DefaultAcsClient(profile);

        // 2 设置请求参数
        CommonRequest request = new CommonRequest();
        // 2.1 初始化公共参数
        setIAcsPublicParams(request);
        // 2.2 初始化请求参数
        String templateTypeStr = getTemplateType(templateFlag);
        setIAcsParams(request, phone, templateTypeStr,captCha);

        // 3 执行请求并返回响应结果
       return getResponse(client, request);
    }

    /**
     * @Description 随机生成六位数字验证码
     * @Param []
     **/
    public static String getCode(){
        int code = new Random().nextInt(900000)+100000;
        return String.valueOf(code);
    }


    /**
     * @Description 设置公共请求参数
     * @Param [request, phone, templateTypeStr]
     **/
    private static void setIAcsParams(CommonRequest request, String phone, String templateTypeStr,String captCha) {
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("PhoneNumbers", phone);
        request.putQueryParameter("SignName", SIGNATURE);
        request.putQueryParameter("TemplateCode", templateTypeStr);
        request.putQueryParameter("TemplateParam", "{\"code\":\""+captCha+"\"}");
    }

    /**
     * @Description 根据传入模板标志返回模板CODE
     * @Param [templateFlag]
     **/
    private static String getTemplateType(Integer templateFlag) {
        String templateTypeStr;
        if (templateFlag == 1){
            templateTypeStr = VERIFY_TEMPLATE_CODE;
        }else if (templateFlag == 2){
            templateTypeStr = PWDUPDATE_TEMPLATE_CODE;
        }else {
            templateTypeStr = REGISTER_TEMPLATE_CODE;
        }
        return templateTypeStr;
    }

    /**
     * @Description 客户端执行请求,并返回请求响应实例
     * @Param [client, request]
     **/
    private static CommonResponse getResponse(IAcsClient client, CommonRequest request) {
        CommonResponse response = Defaults.defaultValue(CommonResponse.class);
        try {
            response = client.getCommonResponse(request);
            log.info(response.getData());
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return response;
    }

    /**
     * @Description 设置公共请求参数
     * @Param [request]
     **/
    private static void setIAcsPublicParams(CommonRequest request) {
        request.setMethod(MethodType.POST);
        request.setDomain("dysmsapi.aliyuncs.com");
        request.setVersion("2017-05-25");
        request.setAction("SendSms");
    }
}

4 使用总结

  • 使用“阿里大于”可以很方便快速为项目提供短信服务
  • 正因为官方文档非常全面,所以出此总结
posted @ 2019-12-24 16:09  車轱辘  阅读(1242)  评论(0编辑  收藏  举报