阿里云短信发验证码关键三步:申请签名模板、配置密钥、调用SendSms;签名须为公司名等合规主体,模板须含{code}占位符,RegionId必须为cn-hangzhou。

阿里云短信接口发验证码,关键就三步:申请签名模板、配密钥、调用 SendSms
阿里云不是注册完就能发,必须先过「签名 + 模板」双审核。签名得是你公司名、APP名或网站备案主体,个人开发者只能用「小程序」或「公众号」资质申请;模板内容要固定,不能动态拼接验证码数字——你得写成“您的验证码是{code}”,然后在 API 调用时传入 code 参数替换。
容易踩的坑:
- 签名审核失败常因「未提供证明材料」或「名称含敏感词」,比如“测试”“demo”“临时”一律拒审
- 模板里不能出现“免费”“秒到账”“高回报”等营销话术,否则直接驳回
-
RegionId必须填cn-hangzhou(杭州),填错会返回InvalidParameter.RegionId - 调用前必须安装 SDK:
pip install aliyun-python-sdk-core aliyun-python-sdk-dysmsapi
腾讯云发短信,SendSms 报 InvalidParameterValue.Signature 怎么办
这个错误几乎 90% 是签名没通过审核,或者调用时没传对。腾讯云要求签名必须和你在「短信控制台 > 签名管理」里审核通过的**完全一致**,包括空格、标点、中英文括号——哪怕你后台显示的是「小张科技」,代码里写了「小张科技 」(末尾多一个空格),也会报这个错。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 登录 腾讯云短信控制台,点「签名管理」,复制「审核通过」状态下的签名原文,粘贴进代码,不要手打
- 模板 ID(
TemplateID)和签名(Sign)必须来自同一主体(同一腾讯云账号+同一资质材料) - 国内短信必须用
PhoneNumberSet传数组,哪怕只发一个号也得写成["+86156xxxxxxxx"],传字符串直接报错 - 调试时用
ExtendCode字段加个标记,比如"dev",方便在控制台筛选测试记录
为什么推荐用官方 SDK 而不是 requests.post 直接调 HTTPS
不是不能用 requests,而是自己拼签名串太容易翻车。阿里云/腾讯云都用 HmacSHA256 或 SHA256 算法对参数做签名,时间戳、随机串、参数排序、URL 编码规则全有严格要求。少 encode 一个空格、多排一个参数,就会返回 SignatureDoesNotMatch 或 AuthFailure.SignatureFailure。
真实影响:
- SDK 自动处理参数排序、编码、签名、重试、超时,而手写
requests很难覆盖所有边界情况(比如中文模板变量、特殊字符手机号) - 腾讯云 SDK 会自动把
+86156xxxxxxxx标准化为国际格式,手写容易漏掉+或区号导致发送失败 - 阿里云 SDK 支持异步回调解析,手写 HTTP 调用得自己搭服务收回执,运维成本陡增
本地测试发不出去?先查这三项配置
95% 的“本地能跑通但发不出短信”问题,卡在这三个地方:
- AccessKey 是「主账号」还是「子用户」?子用户必须手动授权
QcloudSMSFullAccess或AliyunDysmsReadOnlyAccess等策略,仅开通短信服务控制台权限不够 - 手机号是否在腾讯云「已验证号码」列表里?阿里云虽不限制接收号,但首次发送会进人工审核池,延迟 1–2 小时,测试务必用已发过成功短信的号码
- 环境变量没设对:
os.environ["TENCENTCLOUD_SECRET_ID"]和os.environ["TENCENTCLOUD_SECRET_KEY"]必须在运行前加载,IDE 终端里 export 了,PyCharm 运行配置里却没同步,就会静默失败
最常被忽略的一点:阿里云的 PhoneNumbers 参数必须是逗号分隔的字符串(如 "156xxxxxxxx,138xxxxxxxx"),而腾讯云的 PhoneNumberSet 是 JSON 数组。传错类型不报错,但一条都不发——日志里只显示 “success: true”,实际运营商网关根本没收到。










