短信:从阿里云 AccessKey 到后台可用(配置教程)

Ju7CMS 用户手册 · 发布于 2023-10-15 · 更新于 2026-10-21

从在阿里云建 AccessKey 开始,一步一步配到网站后台的功能管理 → 短信配置:两条权限策略、资质与签名模板、五个框、测试发送与运营商回执,并说明短信套餐包余量为什么只能在阿里云控制台看。

这篇从「在阿里云建一把 AccessKey」开始,一步一步走到网站后台 功能管理 → 短信配置 能把短信发出去、能把余量查出来。全程只动两个地方:阿里云控制台、网站后台,不需要改代码。

〇、先确认一件事:套餐包买在哪个账号

阿里云的账号边界是账号ID(控制台右上角头像里那个 16 位数字)。套餐包、签名、模板、AccessKey 都分别属于某个账号:

  • AccessKey 属于哪个账号,发出去的短信就扣哪个账号的量。
  • 在 A 账号买的套餐包,填进后台的却是 B 账号的 AccessKey:网站这边查不到量,也花不到那笔钱,因为根本不是一套。

动手前先记下买套餐包那个账号的账号ID。下面创建 AccessKey 时,必须登录的就是这个账号。

一、阿里云侧:建一把只给短信用的 AccessKey

1. 创建子用户(别用主账号的 AccessKey)

  1. 登录阿里云,进访问控制 RAM:https://ram.console.aliyun.com。
  2. 左侧 身份管理 → 用户,点右上 创建用户。
  3. 登录名称填一个好认的,例如 ju7-sms;访问方式只勾「使用永久 AccessKey 访问(OpenAPI 调用访问)」,不用给它控制台登录。
  4. 点确定。

2. 当场保存 AccessKey Secret

  1. 创建成功后弹出的那一屏,同时给出 AccessKey ID(20 多位)和 AccessKey Secret(30 位)。
  2. Secret 只显示这一次。当场复制到记事本或密码管理器;关掉那屏就再也找不回来,只能重新创建一把。

3. 给这个子用户加两条权限(缺一不可)

系统策略网站靠它做什么不给会怎样
AliyunDysmsFullAccess发验证码、查运营商回执(SendSms、QuerySendDetails)测试发送直接被拒,返回 Forbidden.NoPermission;发送记录也查不到,回执那句永远出不来

操作:访问控制 → 用户 → 点开这个用户 → 权限 → 新增授权,搜索框里搜 Dysms,勾上 AliyunDysmsFullAccess 这一条系统策略,确定。

在 RAM 权限策略里搜索并勾选系统策略

4. 开通短信服务,把资质、签名、模板都过审

  1. 进短信服务控制台:https://dysms.console.aliyun.com,没开通先点开通。
  2. 资质:国内消息 → 资质管理 → 提交企业营业执照等资料。国内短信必须有审核通过的资质,个人认证发不了国内验证码。
  3. 签名:国内消息 → 签名管理 → 添加签名。2-12 个字,要和你公司名、网站名或已备案主体对得上,不要带方括号、不要带空格。
  4. 模板:国内消息 → 模板管理 → 添加模板,模板类型选「验证码」,内容里只放一个变量,变量名必须是 code,例如:
您的验证码为${code},请在 5 分钟内输入,请勿泄露给他人。
  1. 提交后等审核,状态变成审核通过才能用。
  2. 抄下两个值备用:模板ID(形如 SMS_462661011)和签名名称(不带方括号)。
为什么变量名必须叫 code:网站发验证码时传的参数固定是一个 code 键,值是 6 位数字。模板里的变量名和它对不上,阿里云会直接驳回。

二、网站侧:确认插件已经装上

  1. 登录网站后台,看左侧 功能管理 里有没有 短信配置这一项。
  2. 有,说明装好了,直接下一步。
  3. 没有,到后台的插件列表里找到「短信配置」(标识 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 的那一行,保存即生效,不用重启。

四、验证发送:测试发送

  1. 还是这个页面,在「测试发送」里填你自己的手机号(11 位,不要 +86、不要空格),点发送测试短信。
  2. 按钮会锁 60 秒倒计时,这不是坏了:同一个 IP 加同一个号码,60 秒只允许一条。
  3. 网关受理不等于手机收到。页面会自动在 45 秒、120 秒、300 秒各问一次运营商回执,问到终态就停:3 是已送达,2 是运营商未送达。页面开着才收得到这句更新。

后台还有两道限流:同一个 IP 每小时最多 10 条,同一个号码每天最多 5 条。超了就回「发送太频繁,请稍后再试」。

五、关于「套餐余量」:阿里云没有这个接口,后台也不再显示这一行

先说结论,免得白跑:阿里云目前没有查询短信套餐包剩余条数的 API。官方 FAQ 的原话是「有没有查询套餐包剩余量的 API?目前没有查询套餐包剩余量的 API,请登录短信服务控制台,在套餐包页面查看套餐包剩余条数和有效期」。

接口问不到,这个数就只能在控制台页面上看,所以后台里那两处「套餐余量」(管理首页的卡片、短信配置里的那一行)已经撤掉了。以前那句「账号下没有短信套餐包(按量付费)|账户可用余额 0.00」不代表你配错了,也不代表套餐包用完了——它读的是费用中心的资源包接口 QueryResourcePackageInstances,那个接口管的是预留实例、存储包、流量包这类抵扣型资源包,短信套餐包不在它的口径里。套餐包的剩余条数和失效时间在这里看:

  1. 短信服务控制台 → 业务统计 → 套餐包资费,列表里就是剩余条数与失效时间;
  2. 怕忘的话设预警:控制台 → 通用设置 → 国内消息设置 → 联系人,加联系人并打开「套餐包余量预警接收」开关,阿里云会主动发短信提醒你。

网站上要确认「短信到底通没通」,看第三步末尾那个测试发送就够:手机收到验证码,说明签名、模板、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)、五个框填对——后台的短信就是可用状态:访客能取到验证码,运营商回执查得到。套餐包的条数只在阿里云控制台有,见第五节。