阿里云短信服务从入门到精通:完整对接使用指南
一、认识阿里云短信服务
阿里云短信服务是阿里云提供的一种稳定可靠、高到达率的企业级通信服务。它支持调用API或使用群发助手发送验证码、通知类和营销类短信,国内验证短信秒级触达,到达率最高可达99%;国际短信覆盖200多个国家和地区。短信服务历经双十一等极端场景考验,为全球数百万企业提供稳定可靠的通信服务。
短信服务主要应用于以下场景:用户注册与登录的验证码发送、订单状态变更通知、服务到期提醒、预约确认、会员活动营销等。无论是ToC还是ToB业务,短信都是连接企业与用户的重要桥梁。
需要注意的是,阿里云短信服务目前仅支持企业认证账号使用。个人认证用户功能受限,无法发送营销短信,且可能影响签名审核通过率。如果个人认证用户仅需发送验证码短信,也可以考虑申请开通阿里云号码认证服务的短信认证功能。
需要先登录阿里云控制台,点击:阿里云控制台
二、整体接入流程概览
通过阿里云发送短信,整体流程可以分为以下几个核心步骤:
- 账号准备与开通服务:注册阿里云账号、完成企业实名认证、开通短信服务
- 申请资质:提交企业营业执照等资质材料,审核通过后方可申请签名
- 申请短信签名:创建签名并等待审核通过(最快24小时)
- 申请短信模板:创建模板并等待审核通过(约2-4小时)
- 购买资源包或充值:确保账户有足够余额
- 发送短信:通过控制台群发助手或API/SDK程序化发送
从2025年起,中国大陆新增短信签名必须完成运营商实名报备(5-10个工作日),请提前规划。
三、准备工作
3.1 注册账号与企业实名认证
访问阿里云官网注册阿里云账号。完成注册后,需要进行企业实名认证。个体工商户通常也算企业认证。实名认证是开通短信服务的硬性门槛。
3.2 开通短信服务
在阿里云产品列表中找到短信服务并开通。登录短信服务控制台,根据提示完成服务开通。
3.3 购买资源包或确保余额充足
短信服务计费方式分为按量计费和套餐包两种。国际站默认采用短信资源包付费模式,需要先购买资源包。如果有短信套餐包则先扣除套餐包,超出套餐包额度后按量计费,扣除账户余额。建议根据业务需要选择最优的计费方案。
3.4 创建RAM用户并获取AccessKey
AccessKey是调用API的凭证。强烈建议使用RAM子用户的AccessKey,并授予其AliyunDysmsFullAccess权限策略。这比直接使用主账号的AK更安全。
创建RAM用户的步骤:
- 访问RAM控制台创建子用户
- 为该子用户设置对应的权限,推荐授予AliyunDysmsFullAccess短信管理权限
- 获取该子用户的AccessKey ID和AccessKey Secret
安全最佳实践:使用环境变量存储AccessKey(禁止硬编码)、定期轮换密钥、遵循最小权限原则。
四、申请资质
短信资质是阿里云对发送方身份的基础审核,相当于确认\"你是谁\"。企业需要提交营业执照或相关证件,阿里云会审核企业信息的真实性。资质审核通过后,才能进入签名和模板的申请环节。
申请资质需要填写的信息:单位名称、单位法人姓名、单位法人身份证号、有效期、单位管理人手机号。需要上传的材料:单位营业执照、单位法人身份证正反面、单位管理人身份证正反面。
资质审核预计需2个工作日。当使用场景非该阿里云账户企业、属于第三方公司的业务时,需要先申请相关他用资质。
五、申请短信签名
短信签名就是用户收到短信时,最前面方括号里的那个名字,比如〖淘宝〗、〖菜鸟网络〗。它是短信发送方的身份标识,让用户知道这条短信是谁发的。签名必须与提交的资质相匹配。
签名申请需要注意的要点:
- 签名必须体现业务属性:比如\"XX科技\"会被拒,而\"XX科技验证码\"就能通过
- 不能包含联系方式:类似\"联系客服138xxxx\"通不过
- 金融类业务需要特殊资质:涉及支付、理财等关键词需额外提交金融许可证
首次申请建议选择\"验证码\"类签名,通过率最高。签名审核通常需2小时。在\"国内消息\"或\"国际/港澳台消息\"菜单下申请。
从2025年起,短信签名审核通过后,阿里云会自动向运营商发起实名制报备。这个流程平均需要5-7个工作日,部分情况可能需要7-10个工作日或更长。报备期间,签名无法用于发送短信。
六、申请短信模板
如果说签名解决的是\"谁发的\"的问题,那模板解决的就是\"发什么\"。阿里云短信服务不允许自由填写短信内容,所有发送的短信都必须基于已审核通过的模板。
模板内容支持变量占位符,用${variable}的格式表示。比如验证码模板可以写成:\"您的验证码为:${code},5分钟内有效。\"其中${code}在实际发送时会被替换为真实的验证码数字。需要注意的是,变量名不能使用mobile、email等敏感词,否则审核可能不通过。
模板审核通常需2小时。国内短信模板与国际/港澳台短信模板不通用,不能混用。模板审核通过后不允许修改,只能删除。删除短信模板后不可恢复,请谨慎操作。
七、发送短信
7.1 控制台发送(群发助手)
控制台提供\"群发助手\"功能,适用于人工发送系统通知或营销短信。操作步骤:
- 登录短信服务控制台,左侧导航栏选择群发助手
- 点击创建发送任务,填写场景类型、任务名称、短信内容等参数
- 短信内容可包含变量,格式${name},如:尊敬的${name},您的快递…
- 接收号码支持文件导入或手动输入(最多100个号码)
- 可预设定时发送时间
7.2 API/SDK程序化发送
对于开发者,推荐使用阿里云官方SDK集成短信发送能力。SDK封装了请求签名、异常重试等底层逻辑。阿里云短信服务支持Java、PHP、Python、Node.js、C#等多种语言。
下面以Java和Python两种语言为例,详细介绍SDK的集成方法。
7.2.1 Java SDK集成示例
环境要求:Java版本需高于Java 8。
第一步:在pom.xml中添加Maven依赖:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.24</version>
</dependency>第二步:在application.yml中配置参数:
aliyun:
sms:
access-key-id: your-access-key-id
access-key-secret: your-access-key-secret
endpoint: dysmsapi.aliyuncs.com
sign-name: 你的签名
template-code: SMS_123456789第三步:创建配置类初始化SDK客户端:
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.teaopenapi.models.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AliyunSmsConfig {
@Value("${aliyun.sms.access-key-id}")
private String accessKeyId;
@Value("${aliyun.sms.access-key-secret}")
private String accessKeySecret;
@Value("${aliyun.sms.endpoint}")
private String endpoint;
@Bean
public Client smsClient() throws Exception {
Config config = new Config()
.setAccessKeyId(accessKeyId)
.setAccessKeySecret(accessKeySecret)
.setEndpoint(endpoint);
return new Client(config);
}
}第四步:编写发送短信的Service:
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.tea.TeaException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class SmsService {
@Autowired
private Client smsClient;
@Value("${aliyun.sms.sign-name}")
private String signName;
@Value("${aliyun.sms.template-code}")
private String templateCode;
public SendSmsResponse sendSms(String phoneNumber, String templateParam) {
SendSmsRequest request = new SendSmsRequest()
.setPhoneNumbers(phoneNumber)
.setSignName(signName)
.setTemplateCode(templateCode)
.setTemplateParam(templateParam);
try {
return smsClient.sendSms(request);
} catch (TeaException e) {
System.err.println("发送短信失败:" + e.getMessage());
throw new RuntimeException("短信发送异常", e);
}
}
}第五步:在Controller中调用:
@RestController
@RequestMapping("/api/sms")
public class SmsController {
@Autowired
private SmsService smsService;
@PostMapping("/send")
public ResponseEntity<String> send(@RequestParam String phone, @RequestParam String code) {
String templateParam = "{\"code\":\"" + code + "\"}";
SendSmsResponse response = smsService.sendSms(phone, templateParam);
return ResponseEntity.ok("发送成功,BizId:" + response.getBody().getBizId());
}
}7.2.2 Python SDK集成示例
环境要求:Python版本>=3.7。
第一步:安装SDK:
pip install aliyun-python-sdk-core-v3
pip install aliyun-python-sdk-dysmsapi第二步:编写发送短信代码:
from aliyunsdkcore.client import AcsClient
from aliyunsdkdysmsapi.request.v20170525 import SendSmsRequest
import json
# 配置AccessKey
access_key_id = 'your-access-key-id'
access_key_secret = 'your-access-key-secret'
region_id = 'cn-hangzhou'
# 创建客户端
client = AcsClient(access_key_id, access_key_secret, region_id)
# 构建请求
request = SendSmsRequest.SendSmsRequest()
request.set_AcceptFormat('json')
request.set_PhoneNumbers('13800138000')
request.set_SignName('你的签名')
request.set_TemplateCode('SMS_123456789')
request.set_TemplateParam(json.dumps({"code": "123456"}))
# 发送请求
try:
response = client.do_action_with_exception(request)
print("发送成功:" + response.decode('utf-8'))
except Exception as e:
print("发送失败:" + str(e))八、安全与限流配置
8.1 RAM权限管理
推荐的做法是使用RAM身份(即RAM用户和RAM角色)来访问短信服务,避免直接使用阿里云主账号。这种方法不仅提升了安全性,还便于进行更精细的权限管理。
短信服务相关的系统权限策略:
- AliyunDysmsFullAccess:管理短信服务的权限
- AliyunDysmsReadOnlyAccess:只读访问短信服务的权限
如果默认的系统策略不满足需求,可以创建自定义权限策略,实现更细粒度的权限控制。
8.2 QPS限流
短信服务API有QPS限制:
- 套餐包模式:单用户QPS限制为30次/秒
- 按量付费模式:单用户QPS限制为2000次/秒
同一主账号及其所有RAM用户共享上述QPS限额。如果业务需要更高的并发量,建议升级到按量付费模式或联系阿里云提升限额。
8.3 发送频率限制
短信服务对发送频率有严格限制:
- 单号码限频:1天20条
- 验证码同一号码最多1条/分钟
可以在控制台设置日发送量总量阈值和月发送量总量阈值。同时可开启验证码防盗刷监控,防止恶意攻击。
九、回执消息配置
回执消息是在使用API接口发送短信之后,通过配置轻量消息队列(原MNS)消费模式或HTTP批量推送模式,帮助您掌握短信的发送成功率。
回执消息的两种接收方式:
- MNS消息队列消费模式:通过轻量消息队列的Queue模型来接收指定地域的短信回执消息
- HTTP批量推送模式:阿里云将回执消息通过HTTP请求推送到您指定的URL地址
配置回执消息后,可以实时获取短信的发送状态(成功、失败、运营商返回码等),便于业务系统进行后续处理和数据统计分析。
十、常见错误码排查
调用短信服务API接口失败时会返回错误码,以下是一些常见的错误码及解决方案:
- isv.SMS_SIGNATURE_SCENE_ILLEGAL:签名和模板类型不一致。模板和签名类型必须匹配
- InvalidTemplateCode:模板ID无效或未通过审核。检查模板ID是否正确,确认模板已审核通过
- 账号欠费:账户余额不足。检查账户余额,充入相应金额
- 权限不足:AK/SK没有授权管理短信服务的权限。检查RAM用户是否已授予AliyunDysmsFullAccess权限
- 签名未通过审核:签名状态不是\"审核通过\"。在控制台确认签名已通过审核
发送失败时,建议首先检查API错误码和错误信息进行定位。更详细的问题排查可以通过订阅回执消息,参考短信发送状态回执错误码查看问题原因和解决方案。
十一、成本优化建议
短信服务计费主要涉及发送条数。以下是一些成本优化的建议:
- 选择合适的计费方式:高频发送场景建议购买套餐包,单价更低;低频场景可选择按量付费
- 套餐包优先抵扣:系统会优先消耗套餐包额度,超出部分按量计费
- 关注套餐包余量:在控制台套餐包统计界面查看余量,及时续购避免按量高价
- 合理设置发送频率:避免不必要的重复发送,节省成本
- 利用测试环境:控制台提供专用的测试签名和测试模板,支持发送测试短信,帮助您在测试阶段免去签名和模板的申请环节
十二、国际短信注意事项
国际短信流程相对简化,大部分国家和地区无需预先申请签名和模板。但仍需注意以下事项:
- 印度:需要完成DLT注册
- 沙特阿拉伯:需要预注册Sender ID
- 美国/加拿大:推荐使用当地号码(长码/短码)以提高到达率
- 其他国家或地区:具体的合规要求以控制台页面显示为准
十三、常见问题问答
问:个人认证用户可以开通短信服务吗?
答:阿里云短信服务目前仅支持企业认证账号使用。个人认证用户功能受限,无法发送营销短信。建议升级为企业认证,或申请他用资质。
问:签名和模板审核需要多长时间?
答:签名审核通常需2小时,模板审核通常需2小时。但运营商实名报备需5-10个工作日。建议提前规划时间。
问:如何获取AccessKey?
答:在RAM控制台创建RAM子用户,勾选\"编程访问\",系统会自动生成AccessKey ID和AccessKey Secret。创建后请妥善保管Secret,不支持二次查看。
问:发送短信失败如何排查?
答:首先查看API返回的错误码和错误信息。常见原因包括:签名或模板未审核通过、账户余额不足、AK/SK权限不足、QPS超限等。也可通过订阅回执消息获取详细状态。
问:短信服务如何计费?
答:计费方式分为按量计费和套餐包两种。先扣除套餐包额度,超出部分按量计费。国内验证码短信低至0.045元/条起。具体价格以官网为准。
问:如何防止短信被盗刷?
答:可在控制台设置日发送量总量阈值和月发送量总量阈值。开启验证码防盗刷监控。同时建议设置验证码短信发送频率限制。使用RAM子账号并遵循最小权限原则也能降低风险。




