短信:从阿里云 AccessKey 到后台可用(配置教程)
从在阿里云建 AccessKey 开始,一步一步配到网站后台的功能管理 → 短信配置:两条权限策略、资质与签名模板、五个框、测试发送与运营商回执,并说明短信套餐包余量为什么只能在阿里云控制台看。
这篇从「在阿里云建一把 AccessKey」开始,一步一步走到网站后台 功能管理 → 短信配置 能把短信发出去、能把余量查出来。全程只动两个地方:阿里云控制台、网站后台,不需要改代码。
〇、先确认一件事:套餐包买在哪个账号
阿里云的账号边界是账号ID(控制台右上角头像里那个 16 位数字)。套餐包、签名、模板、AccessKey 都分别属于某个账号:
- AccessKey 属于哪个账号,发出去的短信就扣哪个账号的量。
- 在 A 账号买的套餐包,填进后台的却是 B 账号的 AccessKey:网站这边查不到量,也花不到那笔钱,因为根本不是一套。
动手前先记下买套餐包那个账号的账号ID。下面创建 AccessKey 时,必须登录的就是这个账号。
一、阿里云侧:建一把只给短信用的 AccessKey
1. 创建子用户(别用主账号的 AccessKey)
- 登录阿里云,进访问控制 RAM:
https://ram.console.aliyun.com。 - 左侧 身份管理 → 用户,点右上 创建用户。
- 登录名称填一个好认的,例如
ju7-sms;访问方式只勾「使用永久 AccessKey 访问(OpenAPI 调用访问)」,不用给它控制台登录。 - 点确定。
2. 当场保存 AccessKey Secret
- 创建成功后弹出的那一屏,同时给出 AccessKey ID(20 多位)和 AccessKey Secret(30 位)。
- Secret 只显示这一次。当场复制到记事本或密码管理器;关掉那屏就再也找不回来,只能重新创建一把。
3. 给这个子用户加两条权限(缺一不可)
| 系统策略 | 网站靠它做什么 | 不给会怎样 |
|---|---|---|
AliyunDysmsFullAccess | 发验证码、查运营商回执(SendSms、QuerySendDetails) | 测试发送直接被拒,返回 Forbidden.NoPermission;发送记录也查不到,回执那句永远出不来 |
操作:访问控制 → 用户 → 点开这个用户 → 权限 → 新增授权,搜索框里搜 Dysms,勾上 AliyunDysmsFullAccess 这一条系统策略,确定。

4. 开通短信服务,把资质、签名、模板都过审
- 进短信服务控制台:
https://dysms.console.aliyun.com,没开通先点开通。 - 资质:国内消息 → 资质管理 → 提交企业营业执照等资料。国内短信必须有审核通过的资质,个人认证发不了国内验证码。
- 签名:国内消息 → 签名管理 → 添加签名。2-12 个字,要和你公司名、网站名或已备案主体对得上,不要带方括号、不要带空格。
- 模板:国内消息 → 模板管理 → 添加模板,模板类型选「验证码」,内容里只放一个变量,变量名必须是
code,例如:
您的验证码为${code},请在 5 分钟内输入,请勿泄露给他人。- 提交后等审核,状态变成审核通过才能用。
- 抄下两个值备用:模板ID(形如
SMS_462661011)和签名名称(不带方括号)。
为什么变量名必须叫code:网站发验证码时传的参数固定是一个code键,值是 6 位数字。模板里的变量名和它对不上,阿里云会直接驳回。
二、网站侧:确认插件已经装上
- 登录网站后台,看左侧 功能管理 里有没有 短信配置这一项。
- 有,说明装好了,直接下一步。
- 没有,到后台的插件列表里找到「短信配置」(标识
andvar.plug.alisms)点安装。安装动作会把plug/alisms/sms.asp复制成lib/sms.asp;卸载会还原成空壳,那时发送会停。
lib/sms.asp 永久排除在在线升级包之外,所以在线升级不会覆盖短信代码,也不会冲掉这里的配置。
三、填这五个框
路径:后台 → 功能管理 → 短信配置。
| 字段 | 填什么 | 最常见的错 |
|---|---|---|
| 是否开启 | 选「开启」 | 关着保存:下面的测试按钮照样能点,回执会写「本地|开关未开启」 |
| Access Key ID | 第 2 步复制的 ID | 前后多打空格;或者抄成了另一个账号的 |
| Access Key Secret | 同一次创建出来的 Secret | 重建了 Secret 却配着旧 ID,或粘错行 → SignatureDoesNotMatch |
| 模板ID | 验证码模板的 SMS_ 开头模板ID | 填成模板名称;模板还没审核通过;类型选成了「通知」 |
| 短信签名 | 签名名称本身 | 把带方括号的签名整个抄进来 → isv.SMS_SIGNATURE_ILLEGAL |
点「保存」。这五个值写进网站数据库 config 表里 setname=andvar.expand、setkey=alisms 的那一行,保存即生效,不用重启。
四、验证发送:测试发送
- 还是这个页面,在「测试发送」里填你自己的手机号(11 位,不要 +86、不要空格),点发送测试短信。
- 按钮会锁 60 秒倒计时,这不是坏了:同一个 IP 加同一个号码,60 秒只允许一条。
- 网关受理不等于手机收到。页面会自动在 45 秒、120 秒、300 秒各问一次运营商回执,问到终态就停:
3是已送达,2是运营商未送达。页面开着才收得到这句更新。
后台还有两道限流:同一个 IP 每小时最多 10 条,同一个号码每天最多 5 条。超了就回「发送太频繁,请稍后再试」。
五、关于「套餐余量」:阿里云没有这个接口,后台也不再显示这一行
先说结论,免得白跑:阿里云目前没有查询短信套餐包剩余条数的 API。官方 FAQ 的原话是「有没有查询套餐包剩余量的 API?目前没有查询套餐包剩余量的 API,请登录短信服务控制台,在套餐包页面查看套餐包剩余条数和有效期」。
接口问不到,这个数就只能在控制台页面上看,所以后台里那两处「套餐余量」(管理首页的卡片、短信配置里的那一行)已经撤掉了。以前那句「账号下没有短信套餐包(按量付费)|账户可用余额 0.00」不代表你配错了,也不代表套餐包用完了——它读的是费用中心的资源包接口 QueryResourcePackageInstances,那个接口管的是预留实例、存储包、流量包这类抵扣型资源包,短信套餐包不在它的口径里。套餐包的剩余条数和失效时间在这里看:
- 短信服务控制台 → 业务统计 → 套餐包资费,列表里就是剩余条数与失效时间;
- 怕忘的话设预警:控制台 → 通用设置 → 国内消息设置 → 联系人,加联系人并打开「套餐包余量预警接收」开关,阿里云会主动发短信提醒你。
网站上要确认「短信到底通没通」,看第三步末尾那个测试发送就够:手机收到验证码,说明签名、模板、AccessKey、权限四样全对;没收到,按下表对着回执查。
| 测试发送的回执 | 含义 | 要不要处理 |
|---|---|---|
没权限/Forbidden.NoPermission | 这把 AccessKey 挂的策略不够,连发送都被拒 | 要:回第一步确认 AliyunDysmsFullAccess 已经挂在这个子用户上 |
| 签名不存在或不合法 | 「短信签名」框里填的不是审核通过的那一个,或签名还在审核中 | 要:改成阿里云审核通过的签名,和后台填的一字不差 |
| 模板不存在或变量不匹配 | 模板ID 填错,或模板里的变量名不是 code | 要:换验证码类型模板,变量名写 code |
| 发送太频繁,请稍后再试 | 撞了后台自己的限流:同一 IP 每小时 10 条、同一号码每天 5 条 | 不用改配置,等窗口过去再试 |
| 提交出去了但一直等不到运营商回执 | 网关受理不等于送达;这一路要出网 443,系统时间偏差超过 15 分钟阿里云会拒签 | 要:让主机开放到 dysmsapi.aliyuncs.com 的出网 443;同步服务器时间 |
六、还有别的场景要发短信(可选)
- 栏目通知:后台 → 栏目管理 → 编辑该栏目,「模板ID」填另一个阿里云模板,模板内容里只留一个变量,变量名用
content。留空并保存就是取消这个栏目的短信。 - 评论提醒:评论管理里的评论设置,同样一个「模板ID」框,规则同上。
- 这两处走各自的配置,不占用「短信配置」页里那个验证码模板ID。
七、安全须知
- 不要填主账号的 AccessKey;这把子用户只挂那一条策略就够。
- Secret 泄露了:先去 访问控制 → 用户 → AccessKey 把它禁用,再重建一把、后台重填、重测一遍。
- 这把钥匙是明文存在网站数据库里的(
config表那一行)。所以数据库文件(data目录下的.mdb)不要留在能被直接下载的位置,备份包也别发群里或公开网盘。 - 换了阿里云账号、或删了子用户,记得回来重填并重测。
配完这四件事——同一个账号、一条策略、审核通过的签名加模板(变量名 code)、五个框填对——后台的短信就是可用状态:访客能取到验证码,运营商回执查得到。套餐包的条数只在阿里云控制台有,见第五节。
