第一次接阿里云短信服务,很多人会卡在一个地方:签名和模板要先过审,审核没通过就发不出去,中间的几天只能干等。流程本身不绕,难的是知道先做什么、后做什么,以及哪些参数最容易写错。下面按实际操作顺序讲一遍。

开通服务并完成实名认证
进入控制台的短信服务页面开通产品。发送国内短信之前,账号需要先完成实名认证。个人账号和企业账号能申请的签名类型不一样,所以动手前先想清楚自己是哪种主体,免得签名被退回后再改。
服务按量计费,国内短信单价会随地区和套餐有所不同,具体以控制台公示为准。开通后可以先用控制台的测试发送功能,给自己的手机发一条,确认账号和通道都能用。这一步很快,却能提前排掉大部分“代码没问题,怎么就是发不出去”的疑问。
申请短信签名
签名就是短信开头方括号里的那段文字,比如【某某科技】。它通常使用企业名称或应用名称,而且要和提交的资质材料保持一致。资质上写的是全称,签名却填了简称,审核大概率会被驳回。审核时长以系统通知为准,别照搬别人的经验时间去排期。
创建并提交短信模板
模板大致分为验证码、通知、推广三类。验证码和通知类审核相对快,推广类会严格得多。模板里的变量写成 ${code} 这样的占位符,发送时再替换成真实值。
拿一个在线课程小程序来说,开发者小林需要两类短信,模板大致是这样:
- 注册验证码:“您的验证码是${code},5分钟内有效。”类别选验证码。
- 开课提醒:“您报名的课程${course}将于${time}开始,请准时上线。”类别选通知。
两个模板都顺利过了审。提交时的文字必须和之后实际发送的内容一致,哪怕只改了一个标点,也可能对不上。所以模板文案定下来之后最好别随手改。确实要改,就重新提交审核,不要先发了再说。
准备访问凭证
调用接口需要 AccessKey。别直接用主账号的 AccessKey,去 RAM 访问控制里建一个子账号,只授予短信服务相关的权限。这样即便密钥泄露,影响范围也小得多。密钥从环境变量里读取,不要写死在代码中,更不要提交到代码仓库,否则很容易被扫描到。
用 Python 发送短信
先安装 SDK:
pip install alibabacloud_dysmsapi20170525 alibabacloud_tea_openapi
小林的小程序后端,注册验证码就是用下面这段代码发出去的:
import os
from alibabacloud_dysmsapi20170525.client import Client
from alibabacloud_dysmsapi20170525 import models as sms_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 = sms_models.SendSmsRequest(
phone_numbers="13800000000",
sign_name="某某科技",
template_code="SMS_123456789",
template_param='{"code":"482913"}',
)
response = client.send_sms(request)
print(response.body.code, response.body.message)
其中四个参数最容易出问题:
- phone_numbers:接收手机号。多个号码用英文逗号分隔,单次可发送的数量有上限,超过要分批。
- sign_name:必须是已通过审核的签名,差一个字都会失败。最好从控制台复制,不要手打。
- template_code:模板的 CODE,形如 SMS_ 开头的编号,在模板列表里查看。
- template_param:JSON 字符串,键名要和模板里的变量名完全一致。大小写不一样也算不一致。
怎么判断发送成功
返回的 code 为 OK,说明阿里云已经受理了这条请求,但它不代表手机已经收到短信。真正的送达情况要到控制台的发送记录里看。代码里也别默认“没报错就是发出去了”,非 OK 的返回要记日志,并且给用户一个明确的提示。
发送失败时,常见的错误码大致有以下几类,具体含义请以官方错误码文档为准:
- isv.BUSINESS_LIMIT_CONTROL:触发流控。通常是发送太频繁,需要降低请求速度,或者在业务侧加上限制。
- isv.MOBILE_NUMBER_ILLEGAL:手机号格式不对,先在前端和后端都做一次格式校验。
- isv.SMS_SIGNATURE_ILLEGAL:签名不存在,或者还没通过审核。先去控制台确认签名状态。
- isv.TEMPLATE_MISSING_PARAMETERS:模板变量缺失,或变量名和模板对不上。这类错误多半出在 template_param 的键名上。
上线前要做的几件事
- 验证码要设有效期,也要设发送间隔,比如同一手机号 60 秒内只能发一次。
- 对同一 IP 和同一手机号的请求做频率限制。验证码接口一旦被人刷,短信费用会在很短时间内涨上去,而且很难追回。
- 验证码和通知类模板不要夹带营销内容。这类模板如果被当成推广使用,可能会被封禁,到时候影响的是正常业务。
- 正式放出之前,用几个真实号码把注册和提醒流程完整走一遍,包括短信到达的时间、内容是否正确,以及链接能否正常打开。