模板CODE、templateParam键名和signName必须与阿里云控制台审核通过的内容严格一致,大小写敏感且含全角括号;templateParam须为合法JSON字符串;accessKeySecret严禁硬编码。

直接说结论:模板 CODE 和变量参数必须严格匹配阿里云控制台审核通过的内容,templateParam 传入的键名要和模板里 ${code} 中的 code 完全一致,大小写敏感,且必须是合法 JSON 字符串。
模板 CODE 必须与控制台审核通过的一致
你在阿里云短信控制台申请的模板,审核通过后会生成一个形如 SMS_123456789 的唯一 templateCode。这个值不能手写、不能拼错、不能用草稿模板 ID,否则调用直接返回 TemplateNotFound 错误。
- 常见错误现象:
"InvalidTemplateCode"或"Template not found" - 检查方式:登录阿里云短信控制台 → 模板管理 → 找到已“通过”状态的模板 → 复制“模板CODE”字段(不是“模板名称”)
- 注意兼容性:ThinkPHP5/6 都不校验该值,出错全由阿里云接口返回,调试时务必先确认这个字符串是否准确复制
templateParam 必须是 JSON 字符串,且键名与模板变量名完全一致
阿里云要求 templateParam 是标准 JSON 格式字符串,不是 PHP 数组。模板中写的是 ${code},你就必须传 ['code' => '123456'] 并用 json_encode() 转成字符串;如果模板是 ${verify_code},那就得用 ['verify_code' => '123456']。
- 常见错误现象:
"InvalidTemplateParam"、短信内容显示为${code}原样未替换、或整个短信发送失败 - 典型错误写法:
$request->setTemplateParam(['code' => $code])(漏掉json_encode) - 正确写法(TP5/6 均适用):
$request->setTemplateParam(json_encode(['code' => $code], JSON_UNESCAPED_UNICODE)) - 多参数示例:模板为
您好${name},验证码${code},有效期${minute}分钟→ 传json_encode(['name' => '张三', 'code' => '654321', 'minute' => '5'])
签名名称 signName 必须与控制台完全一致,含括号也不可省略
你在控制台提交并审核通过的签名是 【我的公司】,那代码里就必须填 【我的公司】,少一个括号、多一个空格、写成 我的公司 都会报 SignNameNotExists。
立即学习“PHP免费学习笔记(深入)”;
- 常见错误现象:
"InvalidSignName"或"Sign name does not exist" - 特别注意:中文全角括号
【】是签名的一部分,不是前端渲染符号;不要试图在代码里去掉或替换成英文括号 - TP6 封装类中常把
signName写死在配置数组里,建议抽成配置项,避免硬编码导致上线后才发现不一致
最易被忽略的一点:所有涉及 accessKeyId 和 accessKeySecret 的地方,绝不能写死在控制器或模型文件里;哪怕只是临时测试,也必须走配置文件或环境变量。一旦 commit 到 Git,accessKeySecret 泄露即等于短信账户失控——阿里云不会主动告警,但你可能第二天就收到数千条异常发送记录的账单。



















