我正在尝试使用PHP CURL扩展从API获取数据但不起作用。 正在运行另一台服务器中的相同代码。
(Server 1) CURL configuration: It works
(Server 2) CURL configuration: Does not work
是否有防火墙配置?
<?php
$con = curl_init();
$url = "https://api.moloni.com/v1/companies/getOne/?access_token=123456";
$my_values = array('company_id' => 0);
curl_setopt($con, CURLOPT_URL, $url);
curl_setopt($con, CURLOPT_POST, true);
curl_setopt($con, CURLOPT_POSTFIELDS, http_build_query($my_values));
curl_setopt($con, CURLOPT_HEADER, false);
curl_setopt($con, CURLOPT_RETURNTRANSFER, true);
$res_curl = curl_exec($con);
curl_close($con);
$res_txt = json_decode($res_curl, true);
if(!isset($res_txt['error'])){
echo 'Result: '.print_r($res_txt,true).'';
}else{
echo 'Erro: '.print_r($res_txt,true).'';
}
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
?>
编辑:
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$con = curl_init();
$url = "https://api.moloni.com/v1/companies/getOne/?access_token=123456";
$my_values = array('company_id' => 0);
curl_setopt($con, CURLOPT_URL, $url);
curl_setopt($con, CURLOPT_POST, true);
curl_setopt($con, CURLOPT_POSTFIELDS, http_build_query($my_values));
curl_setopt($con, CURLOPT_HEADER, false);
curl_setopt($con, CURLOPT_RETURNTRANSFER, true);
$res_curl = curl_exec($con);
if($res_curl === false){ echo 'Curl error: ' . curl_error($con);}
curl_close($con);
$res_txt = json_decode($res_curl, true);
if(!isset($res_txt['error'])){
echo 'Result: '.print_r($res_txt,true).'';
}else{
echo 'Erro: '.print_r($res_txt,true).'';
}
?>
结果:
服务器1:错误:数组([错误] =&gt; invalid_request [error_description] =&gt;无效的访问令牌。)它有效!
服务器2:卷曲错误:SSL证书问题:无法获取本地颁发者证书
编辑2:
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$con = curl_init();
$url = "https://api.moloni.com/v1/companies/getOne/?access_token=123456";
$my_values = array('company_id' => 0);
curl_setopt($con, CURLOPT_URL, $url);
curl_setopt($con, CURLOPT_POST, true);
curl_setopt($con, CURLOPT_POSTFIELDS, http_build_query($my_values));
curl_setopt($con, CURLOPT_HEADER, false);
curl_setopt($con, CURLOPT_RETURNTRANSFER, true);
curl_setopt($con, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($con, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($con, CURLOPT_CAINFO, 'cacert.pem');
$res_curl = curl_exec($con);
if($res_curl === false){ echo 'Curl error: ' . curl_error($con);}
curl_close($con);
$res_txt = json_decode($res_curl, true);
if(!isset($res_txt['error'])){
echo 'Result: '.print_r($res_txt,true).'';
}else{
echo 'Erro: '.print_r($res_txt,true).'';
}
?>
有效! :)
答案 0 :(得分:2)
看起来你正在使用的第二个服务器是cURL请求失败的Windows平台。
问题是cURL需要一个受信任的证书颁发机构证书列表,以便验证您要连接的网站的身份,但是没有任何或缺少您要连接的站点的CA证书到。
至少,将此添加到您的请求中可以解决您的问题:
curl_setopt($con, CURLOPT_CAINFO, 'C:/path/to/GeoTrustGlobalCA.pem');
GeoTrustGlobalCA.pem
的证书内容应为:
-----BEGIN CERTIFICATE-----
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
-----END CERTIFICATE-----
为了获得最大的便携性,请尝试从http://curl.haxx.se/docs/caextract.html下载cacert.pem
并将CURLOPT_CAINFO
设置为该文件并将其与您的源代码一起包含。
答案 1 :(得分:0)
启用了Windows 10上的相同问题。curl扩展已启用。 通过将php dir添加到PATH变量来解决。
我的电脑>属性>高级系统设置>环境变量。
将php工作目录(例如C:\ php)添加到“路径”系统变量。
别忘了重启Apache。