阿里云短信服务面向企业发送短信,国内短信之外也支持国际及港澳台短信。你可以在控制台手动发一条测试,也可以通过 API 或 SDK 接入业务系统。日常用得最多的是下面几项:

- 模板发送:短信正文要先报备成模板,发送时只填变量。文案改动一个字,就得重新走审核。
- 签名:短信开头的签名同样需要审核,一般对应企业或产品名称。
- 发送回执:可以按发送流水号查每条短信的状态,漏发和延迟问题基本靠它排查。
- 发送监控:控制台能看到发送量和成功率,业务量突然波动时,可以先从这里看起。
接入前要准备的三件事
正式调用之前,先把下面三件事办完,免得发送时才报错。
第一是访问凭证。建议使用 RAM 子账号的 AccessKey,只授予短信相关权限。不要直接用主账号密钥,一旦泄露,影响范围太大。
第二是签名和模板申请。两者都要审核,一般一到两个工作日出结果。验证码、营销、通知类的审核口径不一样,申请时就要选对类别,选错往往要重新提交。
第三是余额或资源包。账户余额不足时,发送会直接失败,线上最好设置余量提醒。
电商订单通知改造的例子
假设某中型电商团队每天处理几万笔订单,需要在下单、发货、签收三个节点通知用户。他们最早由业务系统直接拼接短信文案,很快出现了两个问题。一是文案随手改,和报备的模板对不上,部分短信被拦截。二是发送失败后既没有重试,也没有记录,客服接到的“没收到通知”咨询越来越多。
后来的改法很朴素。三类通知各固定成一个模板,变量只保留订单号、商品名和物流单号。业务系统调用发送接口后,把返回的发送流水号存下来,再定时通过回执接口核对状态。失败的短信做有限次数的重试,超过次数就转入人工处理队列。改完之后,通知到达情况稳定了不少,相关咨询也随之减少。这个例子说明,短信平台的价值不只是把消息发出去,更在于每条发送都能查到结果,出了问题也能复盘。
调用示例
下面是用 Python SDK 发送模板短信的简化代码。AccessKey 从环境变量读取,手机号、签名和模板编码请换成你自己已审核通过的值。
import os
import json
from alibabacloud_dysmsapi20170525.client import Client
from alibabacloud_dysmsapi20170525 import models as dysms_models
from alibabacloud_tea_openapi import models as open_api_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"],
endpoint="dysmsapi.aliyuncs.com",
)
client = Client(config)
request = dysms_models.SendSmsRequest(
phone_numbers="13800000000", # 示例手机号
sign_name="示例签名", # 已审核通过的签名
template_code="SMS_000000", # 已审核通过的模板编码
template_param=json.dumps({"code": "123456"}, ensure_ascii=False),
)
response = client.send_sms(request)
# 根据返回码判断结果,并保存流水号用于后续回执查询
print(response.body.code, response.body.message, response.body.biz_id)
模板审核和使用中要注意的地方
- 模板变量里不要放完整的身份证号、银行卡号。确需展示时做脱敏处理,比如只保留后四位。
- 验证码类短信要限制发送频率。同一手机号、同一 IP 在短时间内的请求应当拦截,否则很容易被刷量。
- 营销类短信要提供退订方式,发送时段也要避开休息时间。
- 错误码要分开处理。遇到限流,做退避后重试;遇到模板或签名不合规,应先修改内容再提交,原样反复提交只会一直失败。
- 生产环境建议配置告警,成功率突然下降时能第一时间通知负责人。
落地时的建议
先把业务里用到短信的场景列出来,每个场景对应一个模板和一个签名,不要让文案在代码里随意拼接。之后再把发送、回执和重试串成一条完整流程。这样一旦触达出现问题,就能较快判断是哪一步出的事。