Я пытаюсь отправить запрос в API (если точнее, в Xero), используя cURL, но я явно отправляю пустые запросы. Я проверил информацию cURL, и похоже, что у меня не установлен тип контента, хотя я устанавливал его в коде.
Вот мой код:
$content = $this->getContent();
$headers = [
"Content-Type: application/x-www-form-urlencoded",
"Content-Length: " . strlen($content),
"Connection: close"];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->getUrl());
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
de($headers, curl_getinfo($ch));
de()
это функция «dump and exit», которая выводит это:
array(3) {
[0] =>
string(47) "Content-Type: application/x-www-form-urlencoded"[1] =>
string(20) "Content-Length: 1003"[2] =>
string(17) "Connection: close"}
array(26) {
'url' =>
string(41) "https://api.xero.com/api.xro/2.0/Invoices"'content_type' =>
NULL
'http_code' =>
int(0)
'header_size' =>
int(0)
'request_size' =>
int(0)
'filetime' =>
int(0)
'ssl_verify_result' =>
int(0)
'redirect_count' =>
int(0)
'total_time' =>
double(0)
'namelookup_time' =>
double(0)
'connect_time' =>
double(0)
'pretransfer_time' =>
double(0)
'size_upload' =>
double(0)
'size_download' =>
double(0)
'speed_download' =>
double(0)
'speed_upload' =>
double(0)
'download_content_length' =>
double(-1)
'upload_content_length' =>
double(-1)
'starttransfer_time' =>
double(0)
'redirect_time' =>
double(0)
'certinfo' =>
array(0) {
}
'primary_ip' =>
string(0) ""'primary_port' =>
int(0)
'local_ip' =>
string(0) ""'local_port' =>
int(0)
'redirect_url' =>
string(0) ""}
Насколько я вижу, я правильно устанавливаю заголовки (константа написана правильно, и я не устанавливал их несколько раз). Что я делаю неправильно?
Сначала проверьте с curl_error
функция нажмите меня для деталей!
так как ваш URL https
, поэтому процесс проверки ssl следует.
Неформальное исправление:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Формальное исправление:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/CAcerts/your_certificate.crt");
Где сертификат?
Нажмите на панель блокировки слева от адресной строки
Затем нажмите больше информации
Теперь нажмите view certificate
кнопка
В открывшемся всплывающем окне вы увидите две вкладки в этой вкладке сведений о клике (ярлык ALT + D
).
Затем нажмите кнопку экспорта и сохраните сертификат
Это путь, который вы должны дать здесь
curl_setopt ($ ch, CURLOPT_CAINFO, getcwd (). «/CAcerts/your_certificate.crt»)
Других решений пока нет …