2026年阿里云短信服务全攻略:从入门到精通的实战指南

简介: 阿里云短信服务是稳定可靠、高到达率的企业级通信平台,支持验证码、通知及营销短信发送。国内短信秒级触达,到达率高达99%;国际覆盖200+国家和地区。文档详述了从企业认证、资质备案、签名模板申请,到API接入(Java/PHP示例)、安全配置及常见问题的全流程,助力开发者高效集成。

一、阿里云短信服务核心概念:企业级通信能力

阿里云短信服务(Short Message Service)是阿里云提供的一种稳定可靠、高到达率的企业级通信服务。它支持调用API或使用群发助手发送验证码、通知类和营销类短信,国内验证短信秒级触达,到达率最高可达99%;国际/港澳台短信覆盖200多个国家和地区,安全稳定,广受出海企业选用。

阿里云短信服务历经双十一等极端场景考验,为全球数百万企业提供稳定可靠的通信服务,是国内短信服务领域的标杆产品。

二、阿里云短信服务接入流程:从准备工作到发送短信

2.1 准备工作

1. 注册阿里云账号:访问阿里云官网,https://www.aliyun.com  注册阿里云账号

2. 实名认证:必须完成企业认证(个体工商户通常也算企业认证)。个人认证账号功能受限,无法发送营销短信,且可能影响签名审核通过率

3. 开通服务:在阿里云短信板块:https://www.aliyun.com/product/sms 找到并开通“短信服务”(DYSMS)。

image.png

选择自己想要的资源包

image.png

付款即可。


4. 获取AccessKey:这是调用API的凭证。强烈建议使用RAM子用户的AccessKey,并授予其 <AliyunDysmsFullAccess> 权限策略。这比直接使用主账号的AK更安全。创建AccessKey后,务必妥善保管AccessKey ID和AccessKey Secret

4.1,流程如下:首先到用户管理板块创建子用户:https://ram.console.aliyun.com/users

image.png

4.2,然后为该子用户设置对应的权限,这里推荐给他设置<AliyunDysmsFullAccess> 短信管理权限

image.png

image.png

4.3,获取该子用户的AccessKey ID和AccessKey Secret

登录主账号,打开创建accesskey板块:https://ram.console.aliyun.com/overview?activeTab=workflow

输入你要设置的子账号,

image.png

点击执行配置,即可获取该子用户的AccessKey ID和AccessKey Secret

image.png

2.2 申请资质

根据工信部要求,发送国内短信需提供短信签名归属方的企业资质证件(如营业执照)进行备案。此资质审核是后续申请签名的基础,预计需2个工作日。

image.png

需要填写的信息是:单位名称,单位法人姓名,单位法人身份证号,有效期,单位管理人手机号

需要上传的信息是:单位营业执照,单位法人身份证正反面,单位管理人身份证正反面

image.png

image.png

image.png

2.3 申请短信签名

image.png

1. 签名定义:是出现在短信开头的标识,用于告知用户短信来源,例如【阿里云】。它必须能明确代表您的企业或品牌

2. 命名规范:需遵守平台规则,通常要求是已备案的企业名称、产品名、网站名等

3. 关键步骤 - 运营商报备:签名在阿里云审核通过后,还会自动或手动提交给运营商进行最终实名报备。这是最容易卡顿、最耗时的环节,通常需要7到10个工作日或更长时间。在报备成功前,使用此签名发送短信可能会失败,并返回错误码 <isv.PORT_NOT_REGISTERED> (端口未注册)

image.png

2.4 申请短信模板

image.png

1. 模板内容:即短信正文。若内容中有可变部分(如验证码、订单号),需使用变量,比如:您注册阿里云的的验证码为{code},5分钟内有效

2. 模板类型:分为验证码、通知短信和推广短信。类型不同,审核标准和资费可能不同。创建时需选择正确的类型并与已审核通过的签名关联

3. 审核流程:模板也需通过平台审核(约2小时)后才可使用

image.png

2.5 发送短信

1. 发送方式:可通过控制台的“群发助手”或调用 **<SendSms> ** API实现

2. API调用核心参数

<PhoneNumbers>: 接收手机号

<SignName>: 已审核通过并报备成功的签名名称

<TemplateCode>: 已审核通过的模板CODE

<TemplateParam>: 替换变量的JSON字符串,如 {"code":"123456"}

2.6 查询发送详情与回复

1. 查询发送状态:可通过API(如QuerySendDetails)或配置回执消息(SmsReport)来查询每条短信的发送状态(成功/失败)

2. 接收回复短信:若需接收用户的回复短信(上行短信),需配置SmsUp回执消息

2.7 设置预警

为避免盗刷或资金耗尽,建议在控制台设置预警,如:

套餐包余量预警

发送频率预警

验证码防盗刷预警

三、以Java为例阿里云短信服务代码实现:从依赖引入到发送短信

3.1 引入依赖

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>dysmsapi20170525</artifactId>
  <!-- 请将 'the-latest-version' 替换为最新版本号:https://mvnrepository.com/artifact/com.aliyun/dysmsapi20170525 -->
  <version>the-latest-version</version>
</dependency>


3.2 配置参数

在application.yml配置文件中引入阿里云短信服务的配置,相关内容需要在阿里云控制台按指引申请。

# 阿里云key
aliyun:
  sms:
    accessKeyId: xxxxxxxxxxxxxxx
    accessSecret: xxxxxxxxxxxxxxxxxxxx
    endpoint: dysmsapi.aliyuncs.com
    signName: 签名

3.3 编写公共发送工具类

 
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.b2bwings.nry.app.business.web.param.message.SmsSendParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
 
 
@Slf4j
@Component
@ConfigurationProperties(prefix = "aliyun.sms")
public class SmsUtil {
    // 访问密钥id
    @Value("${aliyun.sms.accessKeyId}")
    private String accessKeyId;
 
    // 访问密钥secret
    @Value("${aliyun.sms.accessSecret}")
    private String accessKeySecret;
 
    // 短信 API 的访问域名
    @Value("${aliyun.sms.endpoint}")
    private String endpoint;
 
    // 短信签名
    @Value("${aliyun.sms.signName}")
    private String signName;
 
    /**
     * 创建客户端
     */
    public Client createClient() {
        // 创建阿里云客户端:配置访问密钥 ID、 配置密钥、配置访问端点
        Config config = new Config()
                .setAccessKeyId(accessKeyId)
                .setAccessKeySecret(accessKeySecret);
        config.endpoint = endpoint;
        Client client = null;
        try {
            client = new Client(config);
        } catch (Exception e) {
            log.error("阿里云短信服务初始化失败:{}" ,e.getMessage());
        }
        return client;
    }
 
 
    // 发送短信
    public Boolean sendSms(SmsSendParam param) {
        // 阿里云客户端
        Client client = createClient();
        // 构建发送请求
        SendSmsRequest sendSmsRequest = new SendSmsRequest()
                // 设置签名
                .setSignName(signName)
                // 设置模板
                .setTemplateCode(param.getTemplateCode())
                // 设置手机号为参数传入的值
                .setPhoneNumbers(param.getPhone())
                // 设置模板为参数传入的值(map转json):{\"code\":\"" + code + "\"}
                .setTemplateParam(param.getTemplateParam());
 
        // 运行时选择,可以设置不同的属性来配置运行时环境的参数。
        RuntimeOptions runtime = new RuntimeOptions();
        try {
            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);
            if (!"OK".equals(sendSmsResponse.getBody().getCode())) {
                log.info("短信发送失败:{}" ,sendSmsResponse.getBody().getMessage());
                return false;
            }
            log.info("短信发送成功");
            return true;
 
        } catch (Exception error) {
            log.info("短信发送异常:{}" , error.getMessage());
            return false;
        }
    }
}

3.4 模板参数需要自定义

这里根据不同的业务需求实现,我这里是根据我的需求写的,主要是针对短信发送情况存储验证码、存储发送日志,发送结果等。

其中模板参数内容需要根据你配置的短信内容模板决定,如举例:

短信内容模板:您的验证码${code},该验证码5分钟内有效,请勿泄露给他人!

模板参数内容:{"code":"446774"}

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
 
/**
 * 发送短信参数
 * @author 
 */
@Data
@AllArgsConstructor
public class SmsSendParam {
 
    @ApiModelProperty(value = "发送目标手机号")
    private String phone;
 
    @ApiModelProperty(value = "模板Code")
    private String templateCode;
 
    @ApiModelProperty(value = "模板参数")
    private String templateParam;
}

//构建发送短信参数
            SmsSendParam sendParam = new SmsSendParam(phone, templateCode, JsonUtil.getJsonString(map));
            Boolean verifyCode = smsUtil.sendSms(sendParam);
            //发送失败
            if (!verifyCode) {
                //存储验证码值redis,保存短信记录
                putRedisHandle(templateCode, phone, code, msgLog, now, time);
 
                msgLog.setRequestStatus(2);
                msgLog.setGmtModified(now);
                msgLogMapper.updateById(msgLog);
 
                return ApiResult.fail(ApiCode.LOGIN_SMS_ERR);
            }else{
                putRedisHandle(templateCode, phone, code, msgLog, now, time);
            }
            return ApiResult.ok();

四、以PHP为例阿里云短信服务代码实现:从依赖引入到发送短信

4.1,安装阿里云短信服务SDK

你可以使用Composer来安装阿里云短信服务的PHP SDK。在项目的composer.json文件中添加以下依赖

{
    "require": {
        "aliyun/dysmsapi-php-sdk": "^x.x.x" // 使用最新版本
    }
}

4.2,配置参数

<?php
 
namespace app\admin\controller;
 
use AlibabaCloud\SDK\Dysmsapi\V20170525\Dysmsapi;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Dysmsapi\V20170525\Models\SendSmsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use think\facade\Config as tConfig;
 
class AliSms  {
 
    /**
     * 使用AK&SK初始化账号Client
     * @param string $accessKeyId
     * @param string $accessKeySecret
     * @return Dysmsapi Client
     */
    public static function createClient($accessKeyId, $accessKeySecret,$endpoint){
        $config = new Config([
            // 您的 AccessKey ID
            "accessKeyId" => $accessKeyId,
            // 您的 AccessKey Secret
            "accessKeySecret" => $accessKeySecret
        ]);
        // 访问的域名
        $config->endpoint = $endpoint;
        return new Dysmsapi($config);
    }
 
    /**
     * @param string[] $args
     * @return void
     */
    public static function main($args){
        $client = self::createClient($args['access_key_id'], $args['access_key_secret'],$args['endpoint']);
        $sendSmsRequest = new SendSmsRequest([
            "phoneNumbers" => $args['phone'],  //发送的手机号码
            "signName" => $args['sign_name'],  //签名
            "templateCode" => $args['template'],  //模板CODE
            "templateParam" => $args['code']  //这个根据你的模板信息来
        ]);
 
        $result = $client->sendSms($sendSmsRequest);
        // return $result;
        if ($result->body->message == 'OK' && $result->body->code == 'OK') {
            return ['code' => 200,'msg'=>'success'];
        }
        if ($result->body->code == 'isv.MOBILE_NUMBER_ILLEGAL') {
            return ['code' => 0, 'msg' => '手机号码格式不正确'];
        }
        return ['code' => 0, 'msg' => '短信发送失败,网络繁忙'];
    }
}

4.3,发送短信

<?php
namespace app\admin\controller;
 
use app\admin\controller\AliSms;
use think\Session;
use think\Request;
use think\Db;
class Send{
    
    public function send(){
        // $res = ROOT_PATH.'application/admin/controller/AliSms.php';
        $request = Request::instance();
        $phone = $request->param('phone');
        $code = rand(1000,9999);
        session("{$phone}",$code);
        $accessKeyId = '';//accesskeyid
        $accessKeySecret = '';//accessketsecret
        $endpoint = 'dysmsapi.aliyuncs.com';
        $param['access_key_id'] = $accessKeyId;
        $param['access_key_secret'] = $accessKeySecret;
        $param['endpoint'] = $endpoint;
        $param['phone'] = $phone;
        $param['sign_name'] = '模版名';
        $param['template'] = 'SMS_472685110';//模版id
        // $param['code'] = "{\"code\":\"1234\"}";
        $param['code'] = "{\"code\":\"{$code}\"}";
        $res = AliSms::main($param);
        // var_dump($res);
        return json_encode($res);
        
    }
?>


五、阿里云短信服务注意事项:避免常见问题

5.1 签名审核注意事项

签名必须能明确代表您的企业或品牌,命名规范需遵守平台规则

签名在阿里云审核通过后,还会提交给运营商进行最终实名报备,通常需要7到10个工作日或更长时间

在报备成功前,使用此签名发送短信可能会失败,并返回错误码 isv.PORT_NOT_REGISTERED (端口未注册)

5.2 模板审核注意事项

模板内容需符合平台规则,类型不同,审核标准和资费可能不同

模板需通过平台审核(约2小时)后才可使用

5.3 AccessKey安全注意事项

强烈建议使用RAM子用户的AccessKey,并授予其 AliyunDysmsFullAccess 权限策略,这比直接使用主账号的AK更安全

创建AccessKey后,务必妥善保管AccessKey ID和AccessKey Secret,避免泄露

若AccessKey泄露,需及时禁用或删除该AccessKey,并创建新的AccessKey

5.4 发送短信注意事项

发送短信时,需使用已审核通过并报备成功的签名和模板

若发送失败,需根据错误码排查问题,如 isv.PORT_NOT_REGISTERED表示端口未注册,需等待签名报备成功

六、阿里云短信服务常见问题FAQ:新手必看

6.1 个人认证账号能否发送营销短信?

个人认证账号功能受限,无法发送营销短信,且可能影响签名审核通过率,建议完成企业认证。

6.2 签名审核通过后,为什么发送短信仍然失败?

签名在阿里云审核通过后,还会提交给运营商进行最终实名报备,通常需要7到10个工作日或更长时间。在报备成功前,使用此签名发送短信可能会失败,并返回错误码 isv.PORT_NOT_REGISTERED (端口未注册)。

6.3 如何选择短信模板类型?

短信模板类型分为验证码、通知短信和推广短信。类型不同,审核标准和资费可能不同。创建时需选择正确的类型并与已审核通过的签名关联。

6.4 如何保障AccessKey的安全?

强烈建议使用RAM子用户的AccessKey,并授予其 AliyunDysmsFullAccess 权限策略,这比直接使用主账号的AK更安全。创建AccessKey后,务必妥善保管AccessKey ID和AccessKey Secret,避免泄露。若AccessKey泄露,需及时禁用或删除该AccessKey,并创建新的AccessKey。

6.5 如何查询短信发送状态?

可通过API(如QuerySendDetails)或配置回执消息(SmsReport)来查询每条短信的发送状态(成功/失败)。

相关文章
|
5天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
10806 71
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
5天前
|
人工智能 IDE API
2026年国内 Codex 安装教程和使用教程:GPT-5.4 完整指南
Codex已进化为AI编程智能体,不仅能补全代码,更能理解项目、自动重构、执行任务。本文详解国内安装、GPT-5.4接入、cc-switch中转配置及实战开发流程,助你从零掌握“描述需求→AI实现”的新一代工程范式。(239字)
3475 129
|
1天前
|
人工智能 Kubernetes 供应链
深度解析:LiteLLM 供应链投毒事件——TeamPCP 三阶段后门全链路分析
阿里云云安全中心和云防火墙已在第一时间上线相关检测与拦截策略!
1257 5
|
2天前
|
人工智能 自然语言处理 供应链
【最新】阿里云ClawHub Skill扫描:3万个AI Agent技能中的安全度量
阿里云扫描3万+AI Skill,发现AI检测引擎可识别80%+威胁,远高于传统引擎。
1221 1
|
11天前
|
人工智能 JavaScript API
解放双手!OpenClaw Agent Browser全攻略(阿里云+本地部署+免费API+网页自动化场景落地)
“让AI聊聊天、写代码不难,难的是让它自己打开网页、填表单、查数据”——2026年,无数OpenClaw用户被这个痛点困扰。参考文章直击核心:当AI只能“纸上谈兵”,无法实际操控浏览器,就永远成不了真正的“数字员工”。而Agent Browser技能的出现,彻底打破了这一壁垒——它给OpenClaw装上“上网的手和眼睛”,让AI能像真人一样打开网页、点击按钮、填写表单、提取数据,24小时不间断完成网页自动化任务。
2610 6