短信验证码的接入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37774696/article/details/88748617

前言:短信验证码对于大家来说并不陌生,它是一种有效的验证码系统,通过发送验证码到手机让使用者能够安全登陆。不论是网络购物还是大型网站,都能够提供手机短信验证码的功能,越来越多的人们都开始使用手机购物和手机登陆APP,短信验证码的使用也越来越多,它可以大大提高使用的准确性和最大的保证购物的安全性。不知你的项目是否有这短信验证码需求,今天就让我给大家介绍下如何接入短信验证码服务

一、短信验证码平台选择

对于选择第三方服务商,一定先考虑自身的使用背景和条件。购买之前,一定要货比三家,看看实际的到达率、开发成本、服务质量、响应速度、通道质量、稳定性等。不管别人怎么说,自己先测试下,多测试几家,不要动不动就跪了发不出去。这里提供参考的平台有:云之讯 、创蓝235、阿里云、容联云通讯、腾讯云。

二、接口对接方式选择

常见的接口对接有API接口和SDK接口,一般都是用API接口。
SDK接口:SDK短信应用接口,是针对系统集成商和企业软件定制,为其系统的提供移动商务的应用方案,提供包括C++、VB、ASP、delphi、JAVA.NET等多种主流开发语言及 Windows、Linux、Unix 等运行环境的短信通讯开发组件,可以让开发者迅速开发并使用的SDK接口。
API接口: API接口的实现使用了WebService的方式,用户通过调用WebService的指定接口函数以达到发送短信的目的,这样也是快速接入的一种方法,并且提供主流开发语言的DEMO,方便开发者快速接入。

三、应用实例

这里以阿里云平台的短信服务为例给大家讲解下:
1.前提

  • 已开通短信服务。
  • 当前登录账号已实名认证。
  • 已添加签名和短信模板并通过审核。

对于这几点,大家自行登录阿里云解决,有问题欢迎留言提问。

2.接口对接
API调用
简介
短信服务API提供短信发送、发送状态查询、短信批量发送等能力,在短信服务控制台上添加签名、模板并通过审核之后,可以调用短信服务API完成短信发送等操作。
常用的API接口
SendSms
短信发送接口,支持在一次请求中向多个不同的手机号码发送同样内容的短信。
注意:
发送短信会根据发送量计费
在一次请求中,最多可以向1000个手机号码发送同样内容的短信。

请求参数

名称 类型 是否必选 描述
PhoneNumbers String 接收短信的手机号码。格式:国内短信:11位手机号码。国际/港澳台消息:国际区号+号码支持对多个手机号码发送短信,手机号码之间以英文逗号(,)分隔。
SignName String 短信签名名称。请在控制台签名管理页面签名名称一列查看。
TemplateCode String 短信模板ID。请在控制台模板管理页面模板CODE一列查看。
AccessKeyId String 主账号AccessKey的ID。
Action String 系统规定参数。取值:SendSms。
OutId String 外部流水扩展字段。
SmsUpExtendCode String 上行短信扩展码,无特殊需要此字段的用户请忽略此字段。
TemplateParam String 短信模板变量对应的实际值,JSON格式。

返回参数

名称 类型 描述
BizId String 发送回执ID,可根据该ID在接口QuerySendDetails中查询具体的发送状态。
Code String 请求状态码。返回OK代表请求成功。其他错误码请看下面错误码列表
Message String 状态码的描述。
RequestId String 请求ID。

错误码列表

Code 描述
OK 请求成功
isp.RAM_PERMISSION_DENY RAM权限DENY
isv.OUT_OF_SERVICE 业务停机
isv.PRODUCT_UN_SUBSCRIPT 未开通云通信产品的阿里云客户
isv.PRODUCT_UNSUBSCRIBE 产品未开通
isv.ACCOUNT_NOT_EXISTS 账户不存在
isv.ACCOUNT_ABNORMAL 账户异常
isv.SMS_TEMPLATE_ILLEGAL 短信模板不合法
isv.SMS_SIGNATURE_ILLEGAL 短信签名不合法
isv.INVALID_PARAMETERS 参数异常
isp.SYSTEM_ERROR 系统错误
isv.MOBILE_NUMBER_ILLEGAL 非法手机号
isv.MOBILE_COUNT_OVER_LIMIT 手机号码数量超过限制
isv.TEMPLATE_MISSING_PARAMETERS 模板缺少变量
isv.BUSINESS_LIMIT_CONTROL 业务限流
isv.INVALID_JSON_PARAM JSON参数不合法,只接受字符串值
isv.BLACK_KEY_CONTROL_LIMIT 黑名单管控
isv.PARAM_LENGTH_LIMIT 参数超出长度限制
isv.PARAM_NOT_SUPPORT_URL 不支持URL
isv.AMOUNT_NOT_ENOUGH 账户余额不足

当前支持通过以下方式调用短信服务API

  • (推荐)不同编程语言的短信服务SDK
  • 阿里云 OpenAPI Explorer
  • API URL 请求

实例:
首先下载SDK工具包:
SDK工具包中一共包含了2个类库,一个aliyun-java-sdk-core包,另外一个是alicom-dysms-api包【下载地址
如果是maven管理的项目可以在pom.xml文件下添加

 <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-core</artifactId>
        <version>4.0.6</version> <!-- 注:如提示报错,先升级基础包版,无法解决可联系技术支持 -->
    </dependency>
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
        <version>1.1.0</version>
    </dependency>

编写信息调用工具类(AliyunMessageUtil):

public class AliyunMessageUtil {

    private static final String product = "Dysmsapi";
    //产品域名,开发者无需替换
    private static final String domain = "dysmsapi.aliyuncs.com";

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

    public static SendSmsResponse sendSms(Map<String, String> paramMap) throws com.aliyuncs.exceptions.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(paramMap.get("phoneNumber"));
        //必填:短信签名-可在短信控制台中找到
        request.setSignName(paramMap.get("msgSign"));
        //必填:短信模板-可在短信控制台中找到
        request.setTemplateCode(paramMap.get("templateCode"));
        //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
        request.setTemplateParam(paramMap.get("jsonContent"));

        //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
//        request.setSmsUpExtendCode(paramMap.get("extendCode"));

        //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
//        request.setOutId(paramMap.get("outId"));

        //hint 此处可能会抛出异常,注意catch
        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
        return sendSmsResponse;
    }
}

测试

public class Test{
public static void main(String args[]){
// sendMsg("你的号码","验证码");
}
  public static void sendMsg( String phoneNumber,String randomNum)  {
        String jsonContent = "{\"code\":\"" + randomNum + "\"}";
        Map<String, String> paramMap = new HashMap<>();
        paramMap.put("phoneNumber", phoneNumber);
        paramMap.put("msgSign", "****");
        paramMap.put("templateCode", "SMS_129660018");
        paramMap.put("jsonContent", jsonContent);
        SendSmsResponse sendSmsResponse = null;
        try {
            sendSmsResponse = AliyunMessageUtil.sendSms(paramMap);
        } catch (ClientException e) {
            e.printStackTrace();
            throw new AppRunTimeException(AppErrorCodeEnum.MESSAGE_ERROE);
        }
        if (!(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK"))) {
            if (sendSmsResponse.getCode() == null) {
                throw new AppRunTimeException(AppErrorCodeEnum.MESSAGE_ERROE);
            }
            if (!sendSmsResponse.getCode().equals("OK")) {
                throw new AppRunTimeException(AppErrorCodeEnum.MESSAGE_ERROE);
            }
        }
    }
}

四、总结

以上是为大家提供的短信验证码的接入的个人思考和案例,希望能帮到大家。如果有任何问题请留言提问。

猜你喜欢

转载自blog.csdn.net/m0_37774696/article/details/88748617