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

如何正确编写CURLOPT_HTTPHEADER语法实现Telegram Bot消息推送

问题描述

我想要通过Telegram Bot发送通知消息,以下是我的PHP控制器代码:

//php controller.
$curl = curl_init();
$header = [
    'key: this-key',
    'value: 1234',
    'description: '
];
$params = [
    'username' => '998877',
    'massage' => 'This is my message!',
];

curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://api.com/index.php?d=bot&c=Data&m=send_message',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params,
    CURLOPT_HTTPHEADER => $header,
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

这段代码返回error: invalid API Key错误,但使用Postman携带相同请求头和参数时却能成功发送消息。请问如何编写正确的语法以实现Telegram Bot消息发送?

问题分析与修正方案

出现invalid API Key的核心原因是:PHP中直接传递数组给CURLOPT_POSTFIELDS时,CURL会自动将请求编码为multipart/form-data格式,而Postman默认采用application/x-www-form-urlencoded格式发送表单数据,目标接口可能仅支持后者的编码规则,导致请求头中的API Key验证失败。

同时代码存在一处拼写错误:massage应为message,空值的description请求头字段也可能干扰接口验证。

修正后的代码如下:

//php controller.
$curl = curl_init();
$header = [
    'key: this-key',
    'value: 1234'
    // 移除空的description字段,避免不必要的干扰
];
$params = [
    'username' => '998877',
    'message' => 'This is my message!', // 修正拼写错误
];

curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://api.com/index.php?d=bot&c=Data&m=send_message',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => http_build_query($params), // 转换为URL编码字符串,匹配Postman默认格式
    CURLOPT_HTTPHEADER => $header,
));

$response = curl_exec($curl);

// 新增CURL错误排查逻辑,方便定位问题
if(curl_errno($curl)){
    echo 'CURL Error: '.curl_error($curl);
}

curl_close($curl);
echo $response;

额外适配场景

如果目标接口要求使用JSON格式传输数据,需调整参数编码方式并添加对应请求头:

$params = json_encode([
    'username' => '998877',
    'message' => 'This is my message!'
]);

$header = [
    'key: this-key',
    'value: 1234',
    'Content-Type: application/json' // 指定JSON格式请求头
];

curl_setopt_array($curl, array(
    // 其他配置保持不变
    CURLOPT_POSTFIELDS => $params, // 直接传递JSON字符串
    CURLOPT_HTTPHEADER => $header,
));

内容的提问来源于stack exchange,提问作者mark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:00:50