阿里云短信sdk在php中需严格配置accesskey、signname、templatecode三者权限与状态,缺一不可;国内短信必须完成实名认证、签名及模板全部审核通过,否则sendsms调用必失败。

阿里云短信 SDK 在 PHP 中不是“装上就能发”,关键得配对 AccessKey、SignName、TemplateCode 三者权限和状态,缺一不可;国内短信必须实名认证+签名+模板全部审核通过,否则 SendSms 调用必返回 isSuccess=false 且错误码模糊(如 InvalidParameter.SignName 或 TemplateNotFound)。
确认阿里云账号已开通短信服务并完成实名认证
没完成企业/个人实名,控制台连「国内消息」菜单都看不到,SDK 调用直接报 Forbidden.AccessDenied。实名后还要进入「短信服务」控制台 → 「概览」页点击「立即开通」(哪怕显示已开通,也点一次触发初始化)。开通后检查「国内消息」→ 「签名管理」和「模板管理」是否可访问 —— 如果灰显或 403,说明实名未生效或子账号无 AliyunDysmsFullAccess 权限。
- 个人实名仅支持「验证码」类签名,不能用于通知或营销
- 签名必须与营业执照/网站/APP 名称一致,不能含“官网”“平台”等泛化词
- 模板中的变量(如
${code})必须和 SDK 调用时传的TemplateParam键名完全一致,大小写敏感
安装官方 SDK 并避免 autoload 冲突
阿里云 PHP SDK 依赖 guzzlehttp/guzzle,但老项目若已引入低版本 Guzzle(如 v6),直接 composer require alibabacloud/pop-core 可能引发 Class not found。推荐用最小依赖方式安装:
composer require alibabacloud/alibaba-cloud-sdk-php:^1.5 --no-update composer update alibabacloud/alibaba-cloud-sdk-php guzzlehttp/guzzle
如果项目用的是 Laravel 8+ 或 Symfony,注意别让 alibabacloud/pop-core 的自动加载覆盖你自己的 App\ 命名空间 —— 它的 autoload.psr-4 映射在 vendor/ 下是独立的,一般不影响,但若报 Class AlibabaCloud\Client\AlibabaCloud does not exist,就说明 autoloader 没加载到,执行 composer dump-autoload。
调用 sendSms() 时必填参数和典型错误
核心调用链是 AlibabaCloud::rpcRequest() → sendSms(),但实际要手动拼全 7 个参数,漏一个就失败。常见错误不是语法错,而是业务校验不通过:
-
PhoneNumbers必须是字符串格式的手机号,如"13800138000",不能带+、空格或-,国际号不支持国内模板 -
SignName和TemplateCode必须和控制台「已通过」状态的记录一字不差,包括空格和标点(比如签名是「阿里云测试」,传成「阿里云测试 」就会报InvalidParameter.SignName) -
TemplateParam必须是 JSON 字符串,不是数组:'{"code":"123456"}',不是['code' => '123456'];值里不能有换行或未转义双引号 - 测试期每日限额 10 条,超限返回
BusinessFailed,错误信息里不提示“超限”,只说Message: UnknownError
调试时优先看 getHttpStatus() 和 getErrorMessage()
不要只盯 isSuccess() 返回 false 就重试。先打印 HTTP 状态码:$e->getHttpStatus() 是 400 还是 500?400 表示参数或权限问题,500 才是服务端异常。再看 $e->getErrorCode() —— 比如 InvalidAccessKeyId.NotFound 说明 AccessKeyId 写错或被禁用;InvalidParameter.TemplateCode 说明模板未审核通过或已下线;MissingParameter.PhoneNumbers 说明传了空字符串或 null。
真实线上环境别用 try/catch 吞掉异常后静默失败,至少记一条日志:error_log("SMS failed: {$e->getErrorCode()} - {$e->getErrorMessage()}");。阿里云控制台「发送记录」里查不到失败请求,只能靠日志定位。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











