
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 Illuminate\Support\Facades\Http; $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)。安全与可用性从不互斥——正确的配置,才是可靠集成的第一步。










