tp5调用阿里云短信sendsms返回signaturedoesnotmatch或invalidaccesskeyid.notfound,主因是access_key_id/secret、signname、templatecode、host与regionid四者未严格对齐,且templateparam需合法json并完全匹配模板占位符。

TP5 发短信不是调一个函数就能成的事,漏掉任意一环,线上就收不到验证码。
为什么 SendSms 总返回 SignatureDoesNotMatch 或 InvalidAccessKeyId.NotFound
这不是代码写错了,而是四个关键点没对齐:
-
access_key_id和access_key_secret必须从阿里云「访问控制 RAM」里新建子用户获取,不能用「用户中心」旧版 AK 页面的密钥 -
SignName(签名)和TemplateCode(模板 ID)必须已在「短信服务控制台 → 国内消息 → SMS签名管理 / SMS模板管理」中显示为「已通过」,草稿/待审核状态直接被拒绝 -
TemplateParam必须是合法 JSON 字符串,且字段名要和模板中占位符完全一致:模板写的是{code},就得传{"code": "123456"};写的是${verify_code},就得传{"verify_code": "123456"} - 请求
host和regionId必须匹配:用cn-hangzhou就得配dysmsapi.aliyuncs.com;换cn-shanghai得查对应 endpoint,不能硬写死
SDK 放哪?命名空间和自动加载怎么处理
老项目还在用下载包方式(非 Composer),别往 vendor 里塞,容易冲突。正确路径是:
- 把官方 SDK 解压后,只保留
api_sdk目录,重命名为aliyunsms - 放入
extend/aliyunsms(不是vendor,也不是library) - 修改
api_demo/SmsDemo.php的命名空间为namespace appcommonservice;(按你实际控制器层级调整) - 删掉
SmsDemo::sendSms()的static关键字,改成普通方法,否则 TP5 自动加载会报错 - 别手动 require 所有文件,用
Loader::import()或在控制器里use对应类即可
TemplateParam 为什么总被拒?JSON 编码细节很关键
常见错误是拼接字符串或忽略中文转义,导致签名失败或参数解析为空:
- 必须用
json_encode(['code' => $code], JSON_UNESCAPED_UNICODE),不能用json_encode(['code' => $code])(默认会把中文转成 uXXXX) - 不能手写
"{'code':'123456'}"或"{code:'123456'}",单引号、缺引号、不加双引号都非法 - 如果模板含多个变量,比如
{code} 和 {product},TemplateParam必须包含全部字段,缺一个就整个参数被丢弃 - 值里带中文没问题,但不能含未转义的换行、制表符、控制字符——用
trim()+str_replace([" ", " ", " "], '', $str)预处理更稳
创世华信、容联云等其他服务商怎么绕过编码坑
不同厂商协议差异大,TP5 默认 UTF-8 容易踩雷:
- 创世华信接口(如
http://sh2.cshxsp.com/sms.aspx)要求 GB2312 编码:iconv('UTF-8', 'GB2312//IGNORE', $content)再传;用file_get_contents会静默失败,必须用curl_init()显式设CURLOPT_POST和CURLOPT_POSTFIELDS - 容联云 SDK 默认不注册 PSR-4,需在
composer.json中手动加:"psr-4": {"Ronglian\": "extend/ronglian/src/"},然后执行composer dump-autoload - 所有服务商都严禁硬编码
access_key_secret,TP5 推荐放config/extra/aliyun_sms.php,并加入.gitignore;密码字段必须用strtoupper(md5($password))(创世华信),小写或 base64 全部失败
最常被忽略的其实是响应体记录——线上出问题时,光看 $resp->Code 不够,得把完整 $resp 或 $e->getMessage() 记进日志,否则连是签名错还是频控拦截都分不清。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











