You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:21:52