求助:使用SmsGateway.me对接网站与手机发短信,PHP代码报错
修复SmsGateway.me官方PHP代码的常见问题
我懂你现在的糟心处境——好不容易把SmsGateway.me的APK配置妥当,结果官网提供的PHP代码一堆问题没法用,属实耽误事。从你贴的代码片段来看,首先就有代码截断不完整的问题(createContact方法里的makeRequest调用没写完),而且原代码大概率还缺了核心的请求实现、错误处理这些关键模块。
原代码的常见问题
- 缺少和API交互的核心
makeRequest方法实现 - 代码片段语法不完整,无法直接运行
- 没有错误处理逻辑,出问题了根本找不到原因
- 静态变量
$baseUrl的调用方式不符合PHP规范
修正后的完整可用代码
<?php class SmsGateway { static $baseUrl = "https://smsgateway.me"; private $email; private $password; function __construct($email, $password) { $this->email = $email; $this->password = $password; } // 核心请求方法,处理所有API调用 private function makeRequest($endpoint, $method = 'GET', $data = []) { $url = self::$baseUrl . $endpoint; $ch = curl_init(); // 设置请求头,指定JSON格式 $headers = [ 'Content-Type: application/json' ]; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 生产环境建议改成true,保障安全 // 处理POST/PUT类型的请求 if ($method !== 'GET') { curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); // 合并身份验证参数和业务数据 $data = array_merge($data, [ 'email' => $this->email, 'password' => $this->password ]); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); } else { // GET请求把身份参数拼到URL里 $authParams = [ 'email' => $this->email, 'password' => $this->password ]; $url .= '?' . http_build_query($authParams); curl_setopt($ch, CURLOPT_URL, $url); } $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $curlError = curl_error($ch); curl_close($ch); // 捕获CURL请求错误 if ($curlError) { throw new Exception("请求出错: " . $curlError); } $result = json_decode($response, true); // 捕获API返回的错误状态 if ($httpCode >= 400) { $errorMsg = $result['message'] ?? '未知错误'; throw new Exception("API请求失败,状态码: $httpCode,错误信息: $errorMsg"); } return $result; } // 完整实现创建联系人方法 function createContact($name, $number) { $data = [ 'name' => $name, 'number' => $number ]; return $this->makeRequest('/api/v3/contacts/create', 'POST', $data); } // 额外添加发送短信的核心方法,直接能用 function sendMessage($number, $message, $deviceId) { $data = [ 'number' => $number, 'message' => $message, 'device_id' => $deviceId ]; return $this->makeRequest('/api/v3/messages/send', 'POST', $data); } } // 使用示例,替换成你自己的信息 try { $smsGateway = new SmsGateway('your-email@example.com', 'your-password'); // 创建联系人 $contactResult = $smsGateway->createContact('测试用户', '13800138000'); print_r($contactResult); // 发送短信,deviceId要换成你在SmsGateway.me后台绑定的设备ID $messageResult = $smsGateway->sendMessage('13800138000', '这是一条测试短信', 1); print_r($messageResult); } catch (Exception $e) { echo "错误提示: " . $e->getMessage(); } ?>
关键修正说明
- 补全核心请求方法:新增的
makeRequest方法处理了所有和API的交互逻辑,包括身份验证、请求类型适配、数据编码和错误捕获。 - 修正静态属性调用:把
$baseUrl的访问改成self::$baseUrl,符合PHP静态属性的使用规范。 - 添加完善的错误处理:通过try-catch捕获CURL层面和API层面的错误,方便你快速排查问题。
- 完整实现业务方法:把截断的
createContact方法补全,还额外加了sendMessage这个最常用的功能方法,省得你自己再去写。
使用注意事项
- 生产环境请把
CURLOPT_SSL_VERIFYPEER设置为true,避免安全风险。 - 一定要把示例中的邮箱、密码、设备ID换成你自己的真实信息。
- 如果还是有问题,可以对照SmsGateway.me的官方API文档核对请求端点和参数是否正确。
内容的提问来源于stack exchange,提问作者Olana Kenea
相关产品推荐
相关产品推荐

