我正在尝试使用 PHP CURL 扩展从 API 获取数据,但不起作用。另一台服务器中的相同代码正在运行。
(服务器 1) CURL 配置:它有效
(服务器 2) 卷曲配置: 不起作用
是否有任何防火墙配置?
<?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:Erro:数组([错误] => invalid_request [error_description] => 访问令牌无效。它有效!
服务器 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).'';
}
?>
它有效!:)
看起来您正在使用的第二个服务器(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
设置为该文件,并将其包含在源代码中。
在 Windows 10 上遇到同样的问题。 卷曲扩展已启用。通过将 php dir 添加到 PATH 变量来解决。
我的电脑>属性>高级系统设置>环境变量。
将 php 工作目录 (f.e C:''php) 添加到 'Path' 系统变量中。
不要忘记重新启动Apache。