
laravel 使用 curl 发起 httpS 请求时返回 false,通常因 ssl 证书验证失败导致;本地开发环境需临时禁用 SSL 验证(CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST 设为 false),但生产环境严禁使用。
laravel 使用 curl 发起 https 请求时返回 `false`,通常因 ssl 证书验证失败导致;本地开发环境需临时禁用 ssl 验证(curlopt_ssl_verifypeer 和 curlopt_ssl_verifyhost 设为 false),但生产环境严禁使用。
在 Laravel 5.8(及更高版本)中,直接调用原生 cURL 发送 HTTPS 请求却意外返回 false,是一个常见但易被忽视的问题。虽然相同请求在 postman 中能正常获得 json 响应(如 {“success”:true,”message”:”Enviado”,…}),但在 Laravel 中却只输出 [false] —— 这往往并非代码逻辑错误,而是 cURL 在启用 SSL 验证时,因本地环境缺少可信 CA 证书或证书链不完整,导致连接被中止。
根本原因在于:PHP cURL 默认开启 SSL 证书校验(CURLOPT_SSL_VERIFYPEER=true 和 CURLOPT_SSL_VERIFYHOST=2),而本地开发环境(如 XAMPP、WAMP、Valet 或 Homestead 中未配置证书路径)常无法通过验证,从而静默失败并返回 false,且不抛出异常——这正是你看到空响应或布尔 false 的根源。
✅ 正确做法(仅限开发/测试环境):
显式关闭 SSL 验证,并确保 curl_setopt_array() 的第一个参数是有效的 cURL 句柄(注意原文中误写为 URL_API,应为 $curl):
public static function sendSMS($number, $message) { $token = json_decode(self::loginCELLVOZ(), true); $url = env('URL_BASE') . 'sms/single'; $api_key = env('API_KEY'); $phone = '551' . $number; $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false, // ← 关键修复:禁用证书验证 CURLOPT_SSL_VERIFYHOST => false, // ← 关键修复:禁用主机名验证 CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode([ 'number' => $phone, 'message' => $message, 'type' => 1 ]), CURLOPT_HTTPHEADER => [ 'api-key: ' . $api_key, 'Authorization: Bearer ' . ($token['token'] ?? ''), 'Content-Type: application/json' ], ]); $response = curl_exec($curl); // ✅ 强烈建议:检查错误以快速定位问题 if ($response === false) { $error = curl_error($curl); $errno = curl_errno($curl); Log::error("cURL Error ({$errno}): {$error}"); throw new RuntimeException("cURL request failed: {$error}"); } curl_close($curl); return $response; }
? 重要注意事项:
-
⚠️ CURLOPT_SSL_VERIFYPEER => false 和 CURLOPT_SSL_VERIFYHOST => false 绝对不可用于生产环境,否则将导致中间人攻击(MITM)风险,严重违反安全规范;
-
✅ 生产环境正确方案:
-
配置系统级 CA 证书路径(如 curl_setopt($curl, CURLOPT_CAINFO, ‘/path/to/cacert.pem’););
-
或使用 Laravel 内置的 HTTP 客户端(推荐):
use IlluminateSupportFacadesHttp; $response = Http::withToken($token['token']) ->withHeaders(['api-key' => env('API_KEY')]) ->post(env('URL_BASE') . 'sms/single', [ 'number' => $phone, 'message' => $message, 'type' => 1 ]);Laravel HTTP Client 自动处理 SSL 验证、JSON 编码、错误响应等,更安全、简洁且可测试性强;
-
-
? 调试技巧:始终检查 curl_exec() 返回值,并结合 curl_error() 和 curl_errno() 输出日志,避免“静默失败”;
-
? CURLOPT_POSTFIELDS 推荐使用 json_encode() 而非字符串拼接,避免 JSON 格式错误和 xss 风险(如手机号/消息内容含特殊字符)。
总结:cURL 返回 false 多数源于 SSL 验证失败。开发阶段可通过禁用验证快速验证业务逻辑,但务必在上线前切换为证书校验方案或迁移到更健壮的 HTTP 抽象层(如 Laravel HTTP Client)。安全与可用性从不互斥——正确的配置,才是可靠集成的第一步。