阿里云短信服务从零到一:完整对接实战指南
一、认识阿里云短信服务
阿里云短信服务是阿里云提供的一种稳定可靠、高到达率的企业级通信服务,支持调用API或使用群发助手发送验证码、通知类和营销类短信。国内验证短信秒级触达,到达率最高可达99%;国际短信覆盖200多个国家和地区。短信服务主要应用于用户注册与登录的验证码发送、订单状态变更通知、服务到期提醒、预约确认、会员活动营销等场景。
需要注意的是,阿里云短信服务目前仅支持企业认证账号使用。个人认证用户功能受限,无法发送营销短信,且可能影响签名审核通过率。
需要先登录阿里云控制台,点击:阿里云控制台
二、整体接入流程概览
通过阿里云发送短信,整体流程可以分为以下核心步骤:
- 账号准备与开通服务:注册阿里云账号、完成企业实名认证、开通短信服务
- 申请资质:提交企业营业执照等资质材料,审核通过后方可申请签名
- 申请短信签名:创建签名并等待审核通过(最快24小时)
- 申请短信模板:创建模板并等待审核通过(约2-4小时)
- 购买资源包或充值:确保账户有足够余额
- 发送短信:通过控制台群发助手或API/SDK程序化发送
从2025年起,中国大陆新增短信签名必须完成运营商实名报备(5-10个工作日),请提前规划。
三、准备工作
3.1 注册账号与企业实名认证
访问阿里云官网注册阿里云账号。完成注册后,需要进行企业实名认证。个体工商户通常也算企业认证。实名认证是开通短信服务的硬性门槛。
3.2 开通短信服务
在阿里云产品列表中找到短信服务并开通。登录短信服务控制台,根据提示完成服务开通。
3.3 购买资源包或确保余额充足
短信服务计费方式分为按量计费和套餐包两种。国际站默认采用短信资源包付费模式,需要先购买资源包。如果有短信套餐包则先扣除套餐包,超出套餐包额度后按量计费,扣除账户余额。验证码和通知短信约0.045元/条起,推广短信约0.055元/条起。短信超过70字将拆分成多条计费。
3.4 创建RAM用户并获取AccessKey
AccessKey是调用API的凭证。强烈建议使用RAM子用户的AccessKey,并授予其AliyunDysmsFullAccess权限策略。这比直接使用主账号的AK更安全。
创建RAM用户的步骤:
- 访问RAM控制台创建子用户
- 为该子用户设置对应的权限,推荐授予AliyunDysmsFullAccess短信管理权限
- 获取该子用户的AccessKey ID和AccessKey Secret
安全最佳实践:使用环境变量存储AccessKey(禁止硬编码)、定期轮换密钥、遵循最小权限原则。
四、申请资质
短信资质是阿里云对发送方身份的基础审核,相当于确认"你是谁"。企业需要提交营业执照或相关证件,阿里云会审核企业信息的真实性。资质审核通过后,才能进入签名和模板的申请环节。
根据工信部要求,发送国内短信需提供短信签名归属方的企业资质证件(如营业执照)进行备案。需要填写的信息包括:单位名称、单位法人姓名、单位法人身份证号、有效期、单位管理人手机号。需要上传的材料包括:单位营业执照、单位法人身份证正反面、单位管理人身份证正反面。
五、申请短信签名
签名就是用户收到短信时,最前面方括号里的那个名字,比如〖淘宝〗、〖菜鸟网络〗。它是短信发送方的身份标识,让用户知道这条短信是谁发的。签名必须与提交的资质相匹配,资质是A公司,签名就应当是A公司相关的名称。
从2025年起,短信签名审核通过后,阿里云会自动向运营商发起实名制报备。这个流程平均需要5-7个工作日,部分情况可能需要7-10个工作日或更长。报备期间,签名无法用于发送短信。
六、申请短信模板
如果说签名解决的是"谁发的"的问题,那模板解决的就是"发什么"。阿里云短信服务不允许自由填写短信内容,所有发送的短信都必须基于已审核通过的模板。
模板内容支持变量占位符,用${variable}的格式表示。比如验证码模板可以写成:"您的验证码为:${code},请勿泄露他人"。其中${code}在实际发送时会被替换为真实的验证码数字。模板内容需符合规范,不能包含金融信息、色情、赌博、毒品、党政、维权等敏感内容。变量名不能使用mobile、email等敏感词,否则审核可能不通过。
七、发送短信
签名和模板都审核通过后,就可以正式发送短信。阿里云短信服务支持两种主要发送模式:
7.1 控制台发送
通过控制台群发助手手动发送短信,适合运营人员批量发送营销短信或通知。也可以在控制台快速学习页面发送测试短信。每个账号最多可绑定5个测试手机号码。
7.2 API/SDK程序化发送
通过API或SDK程序化发送短信,适合将短信能力集成到业务系统中。开发者将阿里云SDK集成至应用中,通过RAM为应用分配具有短信服务权限的访问凭证,应用使用该凭证调用API发送请求,阿里云服务端完成鉴权与合规校验后,将消息交由短信网关处理,最终送达目标用户手机。
八、Java SDK集成示例
8.1 环境要求
Java版本需高于Java 8。
8.2 安装SDK
在Maven项目的pom.xml文件中,在<dependencies>标签内添加以下依赖:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20180501</artifactId>
<version>请替换为最新版本号</version>
</dependency>8.3 完整代码示例
package com.aliyun.sample;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.dysmsapi20180501.Client;
import com.aliyun.dysmsapi20180501.models.SendMessageToGlobeRequest;
import com.aliyun.dysmsapi20180501.models.SendMessageToGlobeResponse;
import com.aliyun.teautil.models.RuntimeOptions;
public class SendSmsDemo {
public static void main(String[] args) throws Exception {
// 1. 配置账号信息
Config config = new Config()
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
.setEndpoint("dysmsapi.ap-southeast-1.aliyuncs.com");
// 2. 创建客户端
Client client = new Client(config);
// 3. 构建请求
SendMessageToGlobeRequest request = new SendMessageToGlobeRequest()
.setMessage("您的验证码为:123456,请勿泄露他人")
.setTo("+8613912345678")
.setFrom("YourSignature")
.setChannelId("");
// 4. 发送短信
RuntimeOptions runtime = new RuntimeOptions();
SendMessageToGlobeResponse response = client.sendMessageToGlobeWithOptions(request, runtime);
// 5. 处理响应
System.out.println("RequestId: " + response.getBody().getRequestId());
System.out.println("Code: " + response.getBody().getCode());
System.out.println("Message: " + response.getBody().getMessage());
}
}上述代码示例调用的是SendMessageToGlobe接口。如果是发送到中国内地的短信,应使用SendMessageWithTemplate接口,通过模板ID和模板参数发送。
九、Python SDK集成示例
9.1 环境要求
Python版本需大于等于3.7。
9.2 安装SDK
pip install alibabacloud_dysmsapi201805019.3 完整代码示例
import os
from alibabacloud_dysmsapi20180501.client import Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dysmsapi20180501 import models as dysmsapi_models
from alibabacloud_tea_util import models as util_models
class SendSmsDemo:
def __init__(self):
config = open_api_models.Config(
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
endpoint='dysmsapi.ap-southeast-1.aliyuncs.com'
)
self.client = Client(config)
def send_sms(self):
request = dysmsapi_models.SendMessageToGlobeRequest(
message='您的验证码为:123456,请勿泄露他人',
to='+8613912345678',
from_='YourSignature',
channel_id=''
)
runtime = util_models.RuntimeOptions()
try:
response = self.client.send_message_to_globe_with_options(request, runtime)
print(f'RequestId: {response.body.request_id}')
print(f'Code: {response.body.code}')
print(f'Message: {response.body.message}')
except Exception as e:
print(f'发送失败: {e}')
if __name__ == '__main__':
demo = SendSmsDemo()
demo.send_sms()十、安全与限流配置
10.1 安全最佳实践
- 使用RAM子账号AccessKey,避免使用主账号
- AccessKey禁止硬编码在代码中,应使用环境变量或配置中心管理
- 定期轮换AccessKey
- 遵循最小权限原则,仅授予必要的短信服务权限
10.2 限流配置
单号码限频为1天20条。可以在控制台系统设置中修改日发送量总量限额。
十一、回执消息配置
回执消息是在使用API接口发送短信之后,帮助您掌握短信发送成功率和业务支持的重要机制。短信服务接收回执消息的模式有轻量消息队列消费模式和HTTP批量推送模式两种。通过配置回执消息,可以获取短信的最终发送状态(成功或失败),以及运营商返回的错误码,便于进行业务统计和异常排查。
十二、常见错误码排查
- RAM校验失败,用户权限不足:请授权RAM调用接口的全部权限,重新尝试
- 短信服务没开通:请在控制台开通短信服务
- 签名和模板类型不一致:模板和签名类型需要匹配
- 账户余额不足:为阿里云账户充值或购买资源包
- 模板不合法:模板不存在或被拉黑
- API返回Code为OK但短信未收到:登录控制台查看发送记录中的运营商回执错误码
十三、成本优化策略
- 购买短信套餐包比按量计费更划算。例如500条套餐包约10元,折合0.02元/条
- 短信超过70字会拆分成多条计费,尽量控制短信长度在70字以内
- 验证码和通知短信约0.045元/条起,推广短信约0.055元/条起
- 关注套餐包的有效期,避免过期浪费
十四、常见问题
问:个人认证账号可以使用阿里云短信服务吗?
答:阿里云短信服务目前仅支持企业认证账号使用。个人认证用户功能受限,无法发送营销短信,建议升级为企业认证。
问:短信签名审核需要多长时间?
答:签名在工作时间段提交审核,预计最快24小时审核完成。从2025年起,签名审核通过后还需完成运营商实名报备,约需5-10个工作日。
问:短信模板审核需要多长时间?
答:模板审核预计2-4小时完成。
问:为什么API返回成功但用户收不到短信?
答:建议登录短信服务控制台,在业务统计 > 发送记录页面查看该条短信的运营商回执错误码。可能是手机终端问题(信号差、安全软件拦截、垃圾短信过滤等)。
问:如何保证AccessKey安全?
答:强烈建议使用RAM子用户的AccessKey,并授予最小权限。使用环境变量存储AccessKey,禁止硬编码在代码中,定期轮换密钥。
问:短信服务如何计费?
答:短信服务有两种计费方式:按量计费和套餐包。验证码和通知短信约0.045元/条起,推广短信约0.055元/条起。短信超过70字拆分成多条计费。



