
本文详解如何通过 cURL 获取 Telegram Bot API 的真实 HTTP 状态码与 JSON 响应,替代不可靠的 fopen() 方式,确保前端能准确识别 token 错误、网络异常等后端失败场景,并触发对应错误提示。
本文详解如何通过 curl 获取 telegram bot api 的真实 http 状态码与 json 响应,替代不可靠的 `fopen()` 方式,确保前端能准确识别 token 错误、网络异常等后端失败场景,并触发对应错误提示。
在当前代码中,fopen("https://...") 仅尝试建立连接并读取响应流,不校验 HTTP 状态码,也不解析 API 返回的 JSON 结构。即使 token 无效(如返回 {"ok":false,"error_code":401,"description":"Unauthorized"}),fopen 仍可能成功打开流并返回空或无效内容,导致 jQuery 的 success 回调被错误触发,掩盖真实错误。
正确的做法是使用 cURL 主动发起请求,并显式检查 API 响应体中的 ok 字段及 HTTP 状态码。以下是优化后的 js/send_to_telegram.php 完整实现:
<?php header('Content-Type: application/json; charset=utf-8');
$token = "5306003979:AAEPK2NhlxW";
$chat_id = "497358";
$txt = !empty($_POST["text"]) ? htmlspecialchars(trim($_POST["text"])) : "";
// 防御性检查:确保必要参数存在
if (empty($txt)) {
http_response_code(400);
echo json_encode(["message" => "Text is required"]);
exit;
}
function sendTelegramMessage($token, $chat_id, $text) {
$url = "https://api.telegram.org/bot{$token}/sendMessage";
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query([
'chat_id' => $chat_id,
'text' => $text,
'parse_mode' => 'html'
]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => false, // 生产环境建议设为 true 并配置 CA 证书
CURLOPT_HTTPHEADER => ['Accept: application/json']
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
// 若 cURL 请求本身失败(如 DNS 解析失败、超时)
if ($response === false) {
throw new Exception("cURL error: {$error} (HTTP {$httpCode})");
}
$decoded = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new Exception("Invalid JSON response: " . substr($response, 0, 200));
}
return [$decoded, $httpCode];
}
try {
[$apiResponse, $httpCode] = sendTelegramMessage($token, $chat_id, $txt);
if (isset($apiResponse['ok']) && $apiResponse['ok'] === true) {
http_response_code(200);
echo json_encode(["message" => "ok", "data" => $apiResponse]);
} else {
// Telegram API 明确返回错误(如 401 Unauthorized, 400 Bad Request)
$errorCode = $apiResponse['error_code'] ?? $httpCode;
$description = $apiResponse['description'] ?? 'Unknown Telegram API error';
http_response_code(500);
echo json_encode([
"message" => "Telegram API failed",
"error_code" => $errorCode,
"description" => $description
]);
}
} catch (Exception $e) {
http_response_code(500);
echo json_encode([
"message" => "Request failed",
"error" => $e->getMessage()
]);
}
同时,前端 AJAX 应增强错误处理逻辑,区分网络错误、超时与服务端业务错误:
jQuery("form").submit(function (e) {
e.preventDefault(); // 阻止默认提交
var form_data = jQuery(this).serialize();
jQuery.ajax({
type: "POST",
url: "js/send_to_telegram.php",
data: form_data,
dataType: "json",
timeout: 10000,
success: function (result) {
if (result.message === "ok") {
donemodal.style.display = "block";
} else {
console.warn("Server reported warning:", result);
errormodal.style.display = "block";
}
},
error: function (jqXHR, textStatus, errorThrown) {
console.error("AJAX Error:", textStatus, errorThrown);
if (jqXHR.status === 0) {
alert("Network error or request timeout. Please check your connection.");
} else if (jqXHR.status === 500) {
// 后端明确返回的错误(如 token 无效)
try {
const res = JSON.parse(jqXHR.responseText);
alert("Error: " + (res.description || res.message));
} catch {
alert("Server returned an invalid error response.");
}
} else {
alert(`HTTP ${jqXHR.status}: ${jqXHR.statusText}`);
}
errormodal.style.display = "block";
}
});
});
✅ 关键改进点总结:
- ✅ 使用 cURL 替代 fopen,可精确获取 HTTP 状态码与完整响应体;
- ✅ 解析 Telegram API 返回的 JSON,严格校验 "ok": true 字段;
- ✅ 对 cURL 异常(超时、DNS 失败)和 JSON 解析失败做独立捕获;
- ✅ 后端统一返回标准 JSON 格式,前端可据此精准判断错误类型;
- ✅ 添加输入校验、超时控制与 SSL 安全选项(生产环境务必启用证书验证)。
这样,当 $token 错误时,Telegram API 将返回 401 Unauthorized 及 {"ok":false,"error_code":401,"description":"Unauthorized"},PHP 脚本会捕获并返回 500 状态码,前端 error 回调随之触发,真正实现“错误可见、可处理”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











