应封装阿里云短信sdk为独立服务类alismsservice,统一管理accesskeyid、签名模板、异常处理及json编码规范,避免控制器重复代码;通过配置文件sms.php分离密钥,调用时校验返回code是否为ok。

在 ThinkPHP5.1 项目中快速接入阿里云短信服务,避免每个控制器里重复写 accessKeyId、签名、模板参数和异常处理逻辑,必须把 SDK 调用过程封装成可复用的类或服务,否则改一次模板 ID 就要翻遍七八个控制器文件。
准备 SDK 依赖与基础配置
进入 TP5.1 项目根目录,执行:composer require alibabacloud/client。这个包是阿里云官方维护的升级版 SDK,兼容 PHP 7.0+,比老版 aliyun-php-sdk-dysmsapi 更稳定、自动加载更规范。
安装完成后,在 config/ 目录下新建 sms.php 配置文件,返回数组结构:
【accessKeyId 和 accessKeySecret 必须从阿里云 RAM 子用户获取,严禁使用主账号密钥】;签名与模板需在阿里云短信控制台审核通过后才能生效,测试阶段可用官方提供的测试模板 SMS_153055065(验证码类)。
封装短信发送服务类
在 extend/ 目录下新建 AliSmsService.php 文件,定义命名空间 extend\AliSmsService。
第一步:引入 SDK 客户端和异常类:use AlibabaCloud\Client\AlibabaCloud;、use AlibabaCloud\Client\Exception\ClientException;、use AlibabaCloud\Client\Exception\ServerException;。
第二步:在类中定义静态方法 sendVerifyCode($phone, $code),内部先调用 AlibabaCloud::accessKeyClient(...)->regionId('cn-hangzhou')->asGlobalClient() 初始化全局客户端——这一步必须在每次发送前执行,否则会报 “No client found” 错误。
第三步:构造请求参数,'TemplateParam' => json_encode(['code' => $code], JSON_UNESCAPED_UNICODE),注意必须加 JSON_UNESCAPED_UNICODE,否则中文变量(如“【XX科技】”)会变成乱码,导致签名审核不通过。
第四步:捕获 ClientException(客户端错误,如网络超时、参数缺失)和 ServerException(服务端错误,如余额不足、模板未启用),统一抛出业务异常或记录日志,不直接暴露原始 SDK 异常堆栈。
在控制器中调用封装服务
方法一:直接 use 类并调用静态方法:use extend\AliSmsService; → $result = AliSmsService::sendVerifyCode('13800138000', '123456');。
方法二:在 common.php 中注册助手函数:function send_sms($phone, $code) { return extend\AliSmsService::sendVerifyCode($phone, $code); },后续控制器中直接写 send_sms('138...', '654321') 即可。
调用后检查返回值中的 'Code' 字段是否为 'OK',不是则说明发送失败,不要仅靠 try-catch 判断成功与否——有些异常被 SDK 吞掉后仍返回非 OK 状态码。











