如何正确编写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
相关产品推荐
相关产品推荐

