各种后台开发语言如何对接阿里云短信以及阿里云短信如何申请资质、模板和签名
一、认识阿里云短信服务
短信服务是企业业务系统中不可或缺的基础通信能力。无论是用户注册登录时的验证码发送、订单状态变更后的通知推送、服务到期前的提醒触达,还是会员活动中的营销推广,短信都承担着连接企业与用户的重要角色。阿里云短信服务作为企业级通信服务,国内验证短信秒级触达,到达率最高可达99%,国际短信覆盖200多个国家和地区,历经双十一等极端流量场景考验。
在实际接入过程中,短信并不是"调用一个接口、把内容发出去"这么简单。尤其是首次接入时,企业通常需要依次完成资质提交、签名申请、模板审核、运营商实名报备、API对接、发送状态查询和回执配置等多个环节。本文将从零开始,完整拆解整个接入链路,并提供多种主流开发语言的SDK集成示例。
需要先登录阿里云控制台,点击:阿里云控制台
二、整体接入流程概览
一条短信从"你想发送"到"用户收到",中间经过了完整的审核与发送链路。全流程可以拆解为以下核心环节:
- 账号准备与开通服务:注册阿里云账号、完成企业实名认证、开通短信服务
- 申请资质:提交企业营业执照等资质材料,审核通过后方可申请签名
- 申请短信签名:创建签名并等待审核通过,工作时间提交最快24小时
- 运营商实名报备:2025年起新增的必要环节,平均5-7个工作日
- 申请短信模板:创建模板并等待审核通过,约2-4小时
- 购买资源包或充值:确保账户有足够余额
- 发送短信:通过控制台群发助手或API/SDK程序化发送
需要注意的是,阿里云短信服务目前仅支持企业认证账号。个人认证用户功能受限,无法发送营销短信,且可能影响签名审核通过率。如果个人认证用户仅需发送验证码短信,可以考虑申请开通阿里云号码认证服务的短信认证功能。
三、准备工作
3.1 注册账号与企业实名认证
访问阿里云官网注册账号后,需要进行企业实名认证。个体工商户通常也算企业认证。实名认证是开通短信服务的硬性门槛。
3.2 开通短信服务
在阿里云产品列表中找到短信服务并开通,登录短信服务控制台,根据提示完成服务开通。
3.3 购买资源包或确保余额充足
短信服务计费方式分为按量计费和套餐包两种。国际站默认采用短信资源包付费模式,需要先购买资源包。如果有短信套餐包则先扣除套餐包,超出套餐包额度后按量计费,扣除账户余额。建议根据业务需要选择最优的计费方案。短信服务使用全流程中,仅在发送短信时产生费用。
3.4 创建RAM用户并获取AccessKey
AccessKey是调用API的凭证。强烈建议使用RAM子用户的AccessKey,并授予其AliyunDysmsFullAccess权限策略。这比直接使用主账号的AK更安全。
创建RAM用户的步骤:
- 访问RAM控制台创建子用户
- 为该子用户设置对应的权限,推荐授予AliyunDysmsFullAccess短信管理权限
- 获取该子用户的AccessKey ID和AccessKey Secret
安全最佳实践:使用环境变量存储AccessKey(禁止硬编码)、定期轮换密钥、遵循最小权限原则。
四、申请短信资质
短信资质是阿里云对发送方身份的基础审核,相当于确认"你是谁"。企业需要提交营业执照或相关证件,阿里云会审核企业信息的真实性。资质审核通过后,才能进入签名和模板的申请环节。
4.1 资质申请所需材料
在申请短信签名时需要提供签名归属方的资质证件信息,包含企业信息(如企业名称、营业执照、统一社会信用代码)和管理员信息(如管理员身份证号码、手机验证)、委托授权书等。具体来说,需要准备:
- 短信发送方业务信息
- 短信发送方企业实名信息(企业名称、统一社会信用代码等)
- 短信签名、APP/网站/商标等名称
- 短信类型
- 短信发送授权书
- 企业责任人实名信息(法定代表人姓名、法定代表人身份证号、企业短信管理员姓名、管理员身份证号)
4.2 自用资质与他用资质的区别
申请资质时需要根据实际情况选择"自用"或"他用":
- 自用资质:申请短信资质时所提供的企业或个人信息与当前登录的阿里云账户已认证的信息完全一致
- 他用资质:申请短信资质时所提供的企业或个人信息与当前登录的阿里云账户已认证的信息不一致,即涉及第三方企业
选错类型是资质审核失败的常见原因之一:
- 资质"自用"错选为"他用":提交的企业资质信息与本阿里云账号企业信息一致,但选择了他用资质
- 资质"他用"错选为"自用":提交的企业资质信息与本阿里云账号企业信息不一致,但选择了自用资质且未提供授权
4.3 通过API申请资质
目前仅企业认证用户可使用API申请短信资质。若当前阿里云账号为个人认证,请通过短信服务控制台申请资质,或升级为企业认证。不支持批量申请短信资质,建议每次申请至少间隔5秒。
五、申请短信签名
签名就是用户收到短信时,最前面方括号里的那个名字,比如〖淘宝〗、〖菜鸟网络〗。它是短信发送方的身份标识,让用户知道这条短信是谁发的。签名必须与你提交的资质相匹配——资质是A公司,签名就应当是A公司相关的名称。
5.1 签名命名规范
阿里云短信签名需为企事业单位名、App名或商标名,符合工信部实名制要求。不支持模糊、测试类及个人名称。具体规范如下:
- 签名内容需为企事业单位名称、已上线App名称或已注册商标名
- 不支持含义模糊的中性签名,如"客服通知""温馨提示"等
- 不支持个人姓名、测试字样、特殊符号
- 国内短信签名不支持全英文签名,仅支持全中文签名、中英文与数字组成的签名
5.2 签名审核要点
若短信签名审核不通过,常见原因及处理建议如下:
- 内容模糊或无法核实:签名过于宽泛或线上场景信息不足。应申请与业务直接相关的企事业单位名、App名或商标名,并完善App或网站的业务信息
- 链接不符合规范:链接无法访问、与签名无关联。应提供公网可访问且与签名强相关的正式业务链接
- 授权书问题:未签字、盖章错误、无日期或内容不符。需由授权方法定代表人签字并加盖公章,授权期限建议1-3年
- 资质与签名主体不一致:检查营业执照或证件是否与签名名称完全一致
- 涉及特殊行业:如金融、游戏、物流、政企等,需按行业要求补充对应资质
5.3 运营商实名报备
从2025年起,短信签名审核通过后,阿里云会自动向运营商发起实名制报备。这个流程平均需要5-7个工作日,部分情况可能需要7-10个工作日或更长,且运营商并未对时效做出承诺。报备期间,签名无法用于发送短信。对于已经在使用的存量签名,也需要核查是否已完成实名报备。请提前规划好上线时间。
六、申请短信模板
如果说签名解决的是"谁发的"的问题,那模板解决的就是"发什么"。阿里云短信服务不允许自由填写短信内容,所有发送的短信都必须基于已审核通过的模板。这既是为了满足内容合规要求,也是防止短信被滥用的关键机制。
6.1 模板类型与变量规范
您可以根据业务需要,选择申请验证码、通知短信或推广短信。模板内容支持变量占位符,用${variable}的格式表示。比如验证码模板可以写成:"您的验证码为:${code},请勿泄露他人"。其中${code}在实际发送时会被替换为真实的验证码数字。
模板变量规范要点:
- 每个模板内最多支持添加2个号码联系方式,且号码必须全部来自于变量、或全部来自于文本内容
- 每个模板内最多支持添加1个属性为号码的变量
- 每个模板内最多支持添加1个引流链接,且该链接只能来自于文本内容,不能来自于变量
- 变量名不能使用mobile、email等敏感词,否则审核可能不通过
- 推广短信内容中暂不支持添加变量
6.2 模板审核提速技巧
短信模板审核时间相对更长,因为需要校验的内容更多。以下技巧可提升审核通过率:
- 判断内容或链接场景是否涉及第三方,若涉及则需提供三方授权
- 核实链接是否可正常跳转、链接中业务内容和行业是否合法合规
- 核实业务场景,小程序公众号等业务内容需要根据场景多方面核实业务是否合规
- 核实变量属性选择是否正确,根据模板内容上下文语义核实变量属性是否合适
建议在申请模板页面查看常用模板示例,使用示例模板可提高审核效率和成功率。
七、多语言SDK集成与短信发送
签名和模板都审核通过后,就可以正式发送短信了。阿里云短信服务支持两种主要发送模式:一种是通过控制台手动发送,另一种是通过API或SDK程序化发送。短信服务SDK支持多种编程语言,包括Java、Go、C#、PHP、Node.js/TypeScript、Python。SDK已封装签名认证、超时处理、自动重试等底层逻辑,开发者只需关注业务参数(手机号、签名、模板)即可快速完成集成。
以下分别介绍五种主流开发语言的SDK集成示例。
7.1 Java SDK
在Java项目中集成阿里云短信服务,首先需要在pom.xml中引入阿里云官方SDK依赖。以下是一个完整的发送短信示例:
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;
public class SmsDemo {
public static void main(String[] args) {
// 设置地域ID
String regionId = "cn-hangzhou";
// 您的AccessKey ID
String accessKeyId = "LTAI5t********";
// 您的AccessKey Secret
String accessKeySecret = "************";
try {
// 初始化客户端
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
IAcsClient client = new DefaultAcsClient(profile);
// 创建发送请求
SendSmsRequest request = new SendSmsRequest();
// 接收短信的手机号码
request.setPhoneNumbers("13800000000");
// 短信签名名称
request.setSignName("阿里云短信测试");
// 短信模板CODE
request.setTemplateCode("SMS_154950909");
// 模板参数(JSON格式)
request.setTemplateParam("{\"code\":\"123456\"}");
// 发送短信并获取响应
SendSmsResponse response = client.getAcsResponse(request);
System.out.println("发送状态码:" + response.getCode());
System.out.println("发送消息:" + response.getMessage());
System.out.println("请求ID:" + response.getRequestId());
} catch (ClientException e) {
e.printStackTrace();
}
}
}7.2 Python SDK
阿里云官方提供的Python SDK基于OpenAPI规范构建,封装了认证、请求签名、HTTP通信、错误处理等底层逻辑。安装方式:
pip install alibabacloud_dysmsapi20170525发送短信示例:
# -*- coding: utf-8 -*-
import os
from alibabacloud_dysmsapi20170525.client import Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dysmsapi20170525 import models as dysmsapi_models
from alibabacloud_tea_util import models as util_models
# 配置认证信息(建议通过环境变量读取)
config = open_api_models.Config(
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
config.endpoint = 'dysmsapi.aliyuncs.com'
# 创建客户端
client = Client(config)
# 构建发送请求
request = dysmsapi_models.SendSmsRequest(
phone_numbers='13800000000',
sign_name='阿里云短信测试',
template_code='SMS_154950909',
template_param='{"code":"123456"}'
)
# 发送短信
try:
response = client.send_sms(request)
print(f'发送状态码:{response.body.code}')
print(f'发送消息:{response.body.message}')
print(f'请求ID:{response.body.request_id}')
except Exception as e:
print(f'发送失败:{e}')7.3 PHP SDK
使用Composer安装阿里云SDK后,可以快速调用短信发送接口。PHP SDK支持php>=5.5版本。以下是一个简洁的发送示例:
<?php
require_once 'vendor/autoload.php';
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
// 设置AccessKey
AlibabaCloud::accessKeyClient('LTAI5t********', '************')
->regionId('cn-hangzhou')
->asDefaultClient();
try {
$result = AlibabaCloud::rpcRequest()
->product('Dysmsapi')
->version('2017-05-25')
->action('SendSms')
->method('POST')
->options([
'query' => [
'PhoneNumbers' => '13800000000',
'SignName' => '阿里云短信测试',
'TemplateCode' => 'SMS_154950909',
'TemplateParam' => '{"code":"123456"}'
],
])
->request();
print_r($result->toArray());
} catch (ClientException $e) {
echo $e->getErrorMessage() . PHP_EOL;
} catch (ServerException $e) {
echo $e->getErrorMessage() . PHP_EOL;
}7.4 Node.js SDK
Node.js SDK支持在TypeScript或Node.js应用中集成短信能力。安装依赖后即可调用API。示例代码如下:
const DysmsapiClient = require('@alicloud/dysmsapi20170525');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
// 配置认证信息
const config = new OpenApi.Config({
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET
});
config.endpoint = 'dysmsapi.aliyuncs.com';
const client = new DysmsapiClient.default(config);
// 构建发送请求
const request = new DysmsapiClient.SendSmsRequest({
phoneNumbers: '13800000000',
signName: '阿里云短信测试',
templateCode: 'SMS_154950909',
templateParam: '{"code":"123456"}'
});
// 发送短信
client.sendSms(request).then((response) => {
console.log('发送状态码:', response.body.code);
console.log('发送消息:', response.body.message);
console.log('请求ID:', response.body.requestId);
}).catch((err) => {
console.log('发送失败:', err);
});7.5 Go SDK
Go语言调用短信服务需要安装SDK核心库:
go get github.com/alibabacloud-go/darabonba-openapi/v2/client发送短信示例:
package main
import (
"fmt"
dysmsapi "github.com/alibabacloud-go/dysmsapi-20170525/v3/client"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/alibabacloud-go/tea/tea"
)
func main() {
// 配置认证信息
config := &openapi.Config{
AccessKeyId: tea.String("LTAI5t********"),
AccessKeySecret: tea.String("************"),
}
config.Endpoint = tea.String("dysmsapi.aliyuncs.com")
// 创建客户端
client, err := dysmsapi.NewClient(config)
if err != nil {
fmt.Println("创建客户端失败:", err)
return
}
// 构建发送请求
request := &dysmsapi.SendSmsRequest{
PhoneNumbers: tea.String("13800000000"),
SignName: tea.String("阿里云短信测试"),
TemplateCode: tea.String("SMS_154950909"),
TemplateParam: tea.String("{\"code\":\"123456\"}"),
}
// 发送短信
response, err := client.SendSms(request)
if err != nil {
fmt.Println("发送失败:", err)
return
}
fmt.Println("发送状态码:", *response.Body.Code)
fmt.Println("发送消息:", *response.Body.Message)
fmt.Println("请求ID:", *response.Body.RequestId)
}八、发送状态回执与异常处理
8.1 发送状态查询
短信发送后,可以通过返回的响应判断发送状态。SendSms接口的响应中,Code字段为"OK"表示发送成功。建议在代码中做如下判断:
if (response.getCode() != null && "OK".equals(response.getCode())) {
// 发送成功,记录发送日志
} else {
// 发送失败,记录错误码和错误信息
}8.2 常见错误码排查
以下是短信服务常见的错误码及处理建议:
- isv.INVALID_PARAMETERS:参数无效,检查手机号、签名、模板CODE等参数是否正确
- isv.SIGN_NAME_ILLEGAL:签名名称非法,检查签名是否已审核通过
- isv.TEMPLATE_ILLEGAL:模板非法,检查模板是否已审核通过
- isv.BUSINESS_LIMIT_CONTROL:触发业务限流,检查单号码日发送限制(1天20条)
- isv.OUT_OF_SERVICE:账户余额不足,请及时充值
- isv.MOBILE_NUMBER_ILLEGAL:手机号码格式错误
8.3 回执消息配置
短信服务支持通过回调接收上行短信和发送状态回执。配置回执后,短信的最终发送状态(包括运营商返回的送达状态)会通过HTTP请求推送到您指定的回调地址,便于业务系统追踪每一条短信的最终结果。
九、安全与成本优化
9.1 安全最佳实践
使用短信服务API时,建议遵循以下安全规范:
- 使用RAM子账号而非主账号的AccessKey进行API调用
- 通过环境变量存储AccessKey,禁止在代码中硬编码
- 定期轮换AccessKey密钥
- 遵循最小权限原则,仅授予必要的短信服务权限
9.2 成本优化策略
短信服务的费用仅在实际发送时产生。以下策略可有效控制成本:
- 根据业务量选择合适的套餐包,套餐包单价低于按量计费
- 监控短信发送量,防止恶意调用造成费用激增
- 合理设置单号码日发送限制(默认1天20条),避免滥用
- 对于验证码类短信,可结合图形验证码等机制减少无效发送
十、常见问题问答
问1:个人认证用户可以申请短信服务吗?
答:阿里云短信服务目前仅支持企业认证账号。个人认证用户功能受限,无法发送营销短信,且可能影响签名审核通过率。如果个人认证用户仅需发送验证码短信,可以考虑申请开通阿里云号码认证服务的短信认证功能。
问2:短信签名审核需要多长时间?运营商报备又需要多久?
答:签名在工作时间提交审核,预计最快24小时审核完成。但从2025年起,签名审核通过后还需进行运营商实名制报备,平均需要5-7个工作日,部分情况可能需要7-10个工作日或更长。建议提前规划上线时间。
问3:短信模板中的变量有什么限制?
答:变量用${variable}格式表示。每个模板内最多支持添加2个号码联系方式、最多支持添加1个属性为号码的变量、最多支持添加1个引流链接且只能来自于文本内容。变量名不能使用mobile、email等敏感词。推广短信内容中暂不支持添加变量。
问4:发送短信时提示签名或模板非法是什么原因?
答:通常是因为签名或模板尚未审核通过。请登录短信服务控制台的签名管理和模板管理页面,确认签名状态和模板状态均为"正常"或"审核通过"。只有审核通过的签名和模板才能用于发送短信。
问5:RAM子账号调用短信API需要什么权限?
答:需要为RAM子账号授予AliyunDysmsFullAccess权限策略。如果只需要查询功能,可以授予AliyunDysmsReadOnlyAccess。创建RAM子用户后,请及时保存AccessKey ID和AccessKey Secret。
问6:短信发送失败如何排查?
答:首先检查SendSms接口返回的Code和Message字段。常见的失败原因包括:账户余额不足、签名未审核通过、模板未审核通过、手机号码格式错误、单号码日发送超限(1天20条)等。根据错误码对照官方文档进行排查即可。





