Google reCAPTCHA无回调问题:服务器端$response为空求助
嘿,我看了你的问题和代码,本地运行正常但服务器上$response始终为空,大概率是服务器环境限制或者代码里的小细节没处理好,给你几个排查和修复的方向:
检查
allow_url_fopen配置是否开启
很多共享主机或服务器会禁用allow_url_fopen,这会导致file_get_contents无法发起外部HTTP请求。你可以在代码开头加一行测试:var_dump(ini_get('allow_url_fopen'));如果输出
bool(false),要么联系主机服务商开启这个配置,要么换成cURL来请求Google API(cURL不受这个配置限制)。这里给你一个cURL的替代实现:$api_url = 'https://www.google.com/recaptcha/api/siteverify?secret=' . $secret_key . '&response='.$_POST['g-recaptcha-response']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch);修复API URL里的语法错误
你的代码里API URL用了&,这是HTML转义后的实体,在PHP的URL拼接里应该直接用&,&会被Google的API当成参数名的一部分,导致请求无效、返回空内容。把这部分改成:$api_url = 'https://www.google.com/recaptcha/api/siteverify?secret=' . $secret_key . '&response='.$_POST['g-recaptcha-response'];检查服务器防火墙/安全组规则
有些服务器的防火墙会阻止对外请求到Google的域名。你可以登录服务器,用命令行测试能不能访问reCAPTCHA API:curl https://www.google.com/recaptcha/api/siteverify如果返回连接超时或拒绝,需要调整防火墙规则,允许服务器向
www.google.com发起出站HTTPS请求(端口443)。修复
secret_key的引号错误
看你的代码里$secret_key = secret';少了开头的单引号,正确写法应该是$secret_key = 'secret';。虽然本地可能因为错误级别低没报错,但服务器的错误日志里大概率会有变量未定义的提示,这会导致请求时secret参数为空,Google返回无效响应。添加错误排查日志
在服务器上开启PHP错误日志,或者在代码里临时添加错误捕获,方便精准定位问题:$response = file_get_contents($api_url); var_dump($response); // 查看实际返回内容 var_dump(error_get_last()); // 查看file_get_contents的错误信息
内容的提问来源于stack exchange,提问作者Rico Amanda

