如何在PHP中捕获XML输出并保存短信网关发送结果至数据库
嘿,我来帮你一步步搞定这个需求!你已经成功用sms4connect发送短信了,接下来要做的就是捕获发送结果、存入数据库,之后再查询调取,具体实现如下:
第一步:捕获短信网关的发送结果
首先得完善你的发送代码,把网关返回的响应捕获下来——毕竟要存的就是这个结果嘛。这里用curl来发送请求(比file_get_contents更稳定可靠),然后解析网关返回的XML响应:
<?php $num = "92xxxxxxxxxx"; $mes = "Hello World (&) and a 5 note"; // Configuration variables $type = "xml"; $id = "myid"; $pass = "mypass"; $lang = "English"; $mask = "mymask"; // Data for text message $to = $num ; $message = $mes; $message = urlencode($message); // Prepare data for POST request $postData = http_build_query([ 'id' => $id, 'pass' => $pass, 'to' => $to, 'msg' => $message, 'type' => $type, 'lang' => $lang, 'mask' => $mask ]); // Initialize curl to send request $ch = curl_init(); // 这里替换成sms4connect官方提供的实际接口URL curl_setopt($ch, CURLOPT_URL, 'https://api.sms4connect.com/your-send-endpoint'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Execute request and get response $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // Parse XML response (since you set type=xml) $status = ''; $messageId = null; $timestamp = date('Y-m-d H:i:s'); $phoneNumber = $num; $messageContent = $mes; if ($response) { $result = simplexml_load_string($response); // 注意:这里要根据sms4connect实际返回的XML结构调整节点名称 // 比如网关可能返回<status>、<msg_id>这类字段,查他们的API文档确认 $status = (string)$result->status; $messageId = isset($result->message_id) ? (string)$result->message_id : null; } else { // 请求失败的情况,标记状态为failed $status = 'failed'; }
第二步:创建存储短信结果的数据表
先在你的数据库里建一个专门的表来存发送记录,字段可以覆盖关键信息:
CREATE TABLE sms_logs ( id INT AUTO_INCREMENT PRIMARY KEY, phone_number VARCHAR(20) NOT NULL COMMENT '收件人手机号', message_content TEXT NOT NULL COMMENT '短信内容', message_id VARCHAR(50) DEFAULT NULL COMMENT '网关返回的消息ID', status VARCHAR(20) NOT NULL COMMENT '发送状态:success/failed等', created_at DATETIME NOT NULL COMMENT '发送时间' );
第三步:把发送结果存入数据库
用PDO来操作数据库(更安全,能防SQL注入),把刚才捕获到的结果插入到表里:
// 替换成你的数据库实际配置 $dbHost = 'localhost'; $dbName = 'your_database_name'; $dbUser = 'your_db_username'; $dbPass = 'your_db_password'; try { // 初始化PDO连接 $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 准备插入语句 $insertSql = "INSERT INTO sms_logs (phone_number, message_content, message_id, status, created_at) VALUES (:phone, :content, :msg_id, :status, :created)"; $stmt = $pdo->prepare($insertSql); // 绑定参数 $stmt->bindParam(':phone', $phoneNumber); $stmt->bindParam(':content', $messageContent); $stmt->bindParam(':msg_id', $messageId); $stmt->bindParam(':status', $status); $stmt->bindParam(':created', $timestamp); // 执行插入 $stmt->execute(); echo "短信发送结果已成功保存到数据库!"; } catch(PDOException $e) { echo "数据库操作出错:" . $e->getMessage(); }
第四步:调取已保存的发送结果
现在可以随时查询这个表来获取历史发送记录了,比如查所有记录,或者按手机号、状态筛选:
// 示例:查询所有发送记录,按时间倒序排列 try { $querySql = "SELECT * FROM sms_logs ORDER BY created_at DESC"; $stmt = $pdo->query($querySql); $smsRecords = $stmt->fetchAll(PDO::FETCH_ASSOC); // 格式化输出结果(这里用HTML表格展示,你也可以转成JSON给前端用) echo "<h3>短信发送历史记录</h3>"; echo "<table border='1' cellpadding='8'>"; echo "<tr> <th>ID</th> <th>收件人号码</th> <th>短信内容</th> <th>网关消息ID</th> <th>发送状态</th> <th>发送时间</th> </tr>"; foreach ($smsRecords as $record) { $statusDisplay = $record['status'] === 'success' ? '<span style="color:green">发送成功</span>' : '<span style="color:red">发送失败</span>'; echo "<tr> <td>{$record['id']}</td> <td>{$record['phone_number']}</td> <td>{$record['message_content']}</td> <td>{$record['message_id'] ?? '无'}</td> <td>{$statusDisplay}</td> <td>{$record['created_at']}</td> </tr>"; } echo "</table>"; } catch(PDOException $e) { echo "查询失败:" . $e->getMessage(); } // 示例:按手机号查询特定号码的发送记录 // $targetPhone = "92xxxxxxxxxx"; // $querySql = "SELECT * FROM sms_logs WHERE phone_number = :phone ORDER BY created_at DESC"; // $stmt = $pdo->prepare($querySql); // $stmt->bindParam(':phone', $targetPhone); // $stmt->execute(); // $specificRecords = $stmt->fetchAll(PDO::FETCH_ASSOC);
几个重要的注意事项
- 替换接口URL:一定要把curl里的URL换成sms4connect官方提供的发送接口地址,查他们的API文档就能找到
- 适配XML解析:不同网关返回的XML结构不一样,你要对照sms4connect的文档调整
$result->xxx的节点名称 - 数据库安全:用PDO的参数绑定能有效防止SQL注入,别直接把变量拼到SQL语句里
- 状态值对应:确认网关返回的
status字段的取值(比如是"success"还是"1"代表成功),和你存入数据库的状态值保持一致
内容的提问来源于stack exchange,提问作者Haris Khan
相关产品推荐
相关产品推荐

