Я пытаюсь получить доступ к API Почты Австралии для проверки адресов, однако я не могу авторизовать вызов через cURL с PHP или CLI.
Следующий вызов Wget CLI работает как положено и возвращает XML:
wget [email protected] --password=pass https://api.auspost.com.au/ValidateAddress.xml?addressLine1=31+test+street\&suburb=Adelaide\&postcode=5000\&state=SA\&country=Australia
И журнал CLI от Wget:
--2014-12-16 00:33:24-- https://api.auspost.com.au/ValidateAddress.xml?addressLine1=31+test+street&suburb=Adelaide&postcode=5000&state=SA&country=Australia
Resolving api.auspost.com.au (api.auspost.com.au)... 54.66.176.138, 54.66.176.138
Connecting to api.auspost.com.au (api.auspost.com.au)|54.66.176.138|:443... connected.
HTTP request sent, awaiting response... 401 Authorization Required
Reusing existing connection to api.auspost.com.au:443.
HTTP request sent, awaiting response... 200 OK
Length: 255 [application/xml]
Saving to: ‘ValidateAddress.xml?addressLine1=31+test+street&suburb=Adelaide&postcode=5000&state=SA&country=Australia.5’
Однако приведенный ниже вызов cURL CLI не делает:
curl -u [email protected]:pass https://api.auspost.com.au/ValidateAddress.xml?addressLine1=31+test+street\&suburb=Adelaide\&postcode=5000\&state=SA\&country=Australia -v
журнал CURL:
* Hostname was NOT found in DNS cache
* Trying 54.66.176.138...
* Connected to api.auspost.com.au (54.66.176.138) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
* Server certificate: api.auspost.com.au
* Server certificate: VeriSign Class 3 Extended Validation SSL SGC CA
* Server certificate: VeriSign Class 3 Public Primary Certification Authority - G5
* Server auth using Basic with user '[email protected]'
> GET /ValidateAddress.xml?addressLine1=3 HTTP/1.1
> Authorization: Basic auth_hash_here
> User-Agent: curl/7.37.1
> Host: api.auspost.com.au
> Accept: */*
>
< HTTP/1.1 401 Authorization Required
Передача заголовка «Авторизация» с аутентификационным хешем, как показано ниже, также приводит к ошибке 401.
curl -H 'Authorization: Basic auth_hash_here' https://api.auspost.com.au/ValidateAddress.xml?addressLine1=31+test+street\&suburb=Adelaide\&postcode=5000\&state=SA\&country=Australia -v
В конечном счете, мне нужно вызвать это в PHP (в идеале через Guzzle, но я возьму cURL, если я смогу заставить его работать!). Ниже приведен код PHP, который я пробовал безуспешно.
$service_url = 'https://api.auspost.com.au/ValidateAddress.xml?addressLine1=31+test+street&suburb=Adelaide&postcode=5000&state=SA&country=Australia';
$curl = curl_init($service_url);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, "[email protected]:pass");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
$curl_response = curl_exec($curl);
var_dump($curl_response);
Я успешно выполнил вызов через клиент Chrome REST и могу видеть правильные заголовки, отправляемые вместе с вызовом через сетевой инспектор Chrome.
Имя пользователя и пароль верны и подтверждают это много раз.
У кого-нибудь есть какие-либо предложения относительно того, как я мог бы заставить это работать в PHP?
Задача ещё не решена.
Других решений пока нет …