跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

CodeIgniter框架怎么对接短信服务_CodeIgniter框架第三方API调用汇总【汇总】

CodeIgniter 短信类必须严格放在指定路径(CI3:application/libraries/;CI4:app/Libraries/),文件名与类名一致且首字母大写;配置需统一写入 config/sms.php,凭证、endpoint、模板审核状态须逐一验证,回调须单独控制器处理并做幂等与IP校验,日志需记录脱敏后的完整请求响应。 短信服务类必须放在
application/libraries/
目录下 CodeIgniter 不会自动加载任意位置的类,第三方短信 SDK(比如阿里云、腾讯云官方 PHP SDK)若直接丢进
vendor/
或根目录,
$this->load->library('AliyunSms')
会报错 Class not found。正确路径只有两个:CI3 是
application/libraries/AliyunSms.php
,CI4 是
app/Libraries/AliyunSms.php
,且文件名与类名必须严格一致、首字母大写。 常见错误现象:
Unable to load the requested class: AliyunSms
,90% 是因为路径或命名不匹配;更隐蔽的是类用了命名空间但没配 Composer 自动加载——此时即使放对位置也无效,得手动
require_once
或改用无命名空间版本。 不要把整个 SDK 包原样挪进
application/libraries/
,只提取核心发送类 + 依赖的最小工具类 如果 SDK 依赖
guzzlehttp/guzzle
,别试图在 CI3 里混用 Composer 加载和
$this->load->library()
,优先改写为 cURL 实现 CI3 中
$this->load->library('AliyunSms', $config)
的第二个参数不是配置数组,而是“是否启用构造函数传参”的开关,真要传配置得在类内部读
$this->config->item('aliyun_sms')
AlibabaCloud\Tea\Exception\TeaException
这类错误基本是凭证或 endpoint 配错了 阿里云短信 SDK 报这个错,往往不是网络问题,而是
access_key_id
access_key_secret
region_id
填错,或者 endpoint 写成测试环境地址却用了正式密钥。腾讯云同理,
TencentCloud\Common\Exception\TencentCloudSDKException
多半是
SecretId
/
SecretKey
权限不足或签名时间戳偏差超 5 分钟。 实操建议: 先用 Postman 手动调通官方文档里的 HTTP 示例请求,确认凭证可用,再贴到 CI 里 把密钥信息从控制器里剥离,统一写进
application/config/sms.php
$config['aliyun_access_key_id'] = 'LTAI...';
,然后在类中用
$this->CI->config->load('sms')
加载 endpoint 必须带协议和端口,比如阿里云是
https://dysmsapi.aliyuncs.com
,少个
s
或漏掉
https://
都会触发底层连接异常而非业务错误 异步回调验证逻辑不能写在短信发送类里 短信服务本身不提供回调,但你对接的「短信平台」(如聚合数据、容联云)可能有送达回执或上行短信回调。这类接口必须单独建控制器处理,比如
SmsCallback
,而不是塞进
AliyunSms
类里——否则无法被外部 HTTP 请求访问,也违反单一职责。 典型陷阱: 微信接口库:PHPToQyWeixin PHP调用企业微信API接口底层类库 下载 用
$this->input->post()
读取回调参数时,没检查
Content-Type: application/json
,导致 JSON 格式回调体读成空 阿里云回传签名是
Signature
字段,但你代码里写成
sign
,校验永远失败 没做 IP 白名单校验,任何人都能伪造回调请求,触发重复发券或状态误更新 回调处理耗时超过 3 秒,部分平台(如腾讯云)会重试,没加幂等判断就可能发两条短信 日志必须记录原始请求和响应,不能只记成功/失败 短信发不出去时,
Success: false
毫无调试价值。真正有用的是完整请求 URL、header、body 和平台返回的 raw response。CI 默认日志不存这些,得自己补。 做法很简单,在发送方法末尾加:
log_message('error', 'SMS request: ' . json_encode([ 'url' => $url, 'headers' => $headers, 'body' => $params, 'response' => $response ]));
注意三点: 别用
log_message('debug')
,生产环境默认不记录 debug 级别 敏感字段如
access_key_secret
必须脱敏,记录时替换成
***
响应体可能含二进制或不可见字符,
json_encode($response, JSON_UNESCAPED_UNICODE)
更安全 最常被忽略的是:没验证短信模板 Code 是否已在平台审核通过。错误信息里藏在 response 的
Message
字段,但如果你只看
Code
==
OK
就认为成功,实际发出去的是乱码或拦截提示。

相关文章