PHP调用Google Chat Bot webhook用curl请求返回400无效参数错误如何解决
PHP调用Google Chat Bot Webhook推送报错解决方案
问题根源
核心是URL中的token参数被重复URL编码导致无效:
你当前使用的API URL中token末尾为%253D,其中%25是百分号%的URL编码形式,相当于你把原本token末尾的=先编码为%3D,又把%再次编码为%25,最终得到%253D。curl发起请求时会自动对URL做一次解码,传到Google服务端的token末尾就变成了%3D,和实际正确的token值不符,所以返回400无效参数错误。
Python脚本运行正常是因为Python的HTTP请求库处理参数编码时没有出现重复编码的问题。
解决方法
提供两种修复方案,任选一种即可:
方案1:直接修正URL编码错误
把URL中的%253D替换为原始的=即可,同时建议显式指定POST请求,避免curl的默认行为异常:
// 修正后的URL,直接使用原始token值,不需要二次编码 $apiUrl = 'https://chat.googleapis.com/v1/spaces/AAAAbvoeZ0w/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=h2OIcCLB6_f_XxhPX6lugnGizE88ZBBpJURFHtPfh_0='; $ch = curl_init($apiUrl); // 推荐用json_encode构造JSON数据,避免手动写JSON语法错误 $data = json_encode(['text' => 'All Mock Test are Free ']); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 可选:如果遇到SSL证书验证报错可临时开启下面两行,生产环境建议配置正确的证书 // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $result = curl_exec($ch); curl_close($ch); return $result;
方案2:规范构造查询参数(推荐)
把查询参数单独拆分,用PHP内置的http_build_query自动处理编码,完全避免手动编码出错的问题:
$baseApiUrl = 'https://chat.googleapis.com/v1/spaces/AAAAbvoeZ0w/messages'; // 直接填写原始的key和token值,不需要手动做任何编码 $queryParams = [ 'key' => 'AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI', 'token' => 'h2OIcCLB6_f_XxhPX6lugnGizE88ZBBpJURFHtPfh_0=' ]; $apiUrl = $baseApiUrl . '?' . http_build_query($queryParams); $ch = curl_init($apiUrl); $data = json_encode(['text' => 'All Mock Test are Free ']); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch); return $result;
内容的提问来源于stack exchange,提问作者Deepesh singh
相关产品推荐
相关产品推荐

