PHP UPS не отслеживает ответ

Это мой первый взлом в отслеживании UPS, и я абсолютно ничего не получаю. Я вижу 200 на вкладке сети, но это с моего сервера, обслуживающего страницу.

Вы видите что-то неправильное в следующем коде:

    <?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// UPS SHIP ORDER TRACKING
$xmlRequest1='<?xml version="1.0"?>
<AccessRequest xml:lang="en-US">
<AccessLicenseNumber>my access key</AccessLicenseNumber>
<UserId>my user id</UserId>
<Password>my password</Password>
</AccessRequest>
<?xml version="1.0"?>
<TrackRequest xml:lang="en-US">
<Request>
<TransactionReference>
<CustomerContext>Your Test Case Summary
Description</CustomerContext>
<XpciVersion>1.0</XpciVersion>
</TransactionReference>
<RequestAction>Track</RequestAction>
<RequestOption>activity</RequestOption>
</Request>
<TrackingNumber>1Z12345E0205271688</TrackingNumber>
</TrackRequest>';

  try
  {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://wwwcie.ups.com/ups.app/xml/Track");
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlRequest1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 3600);

    echo $xmlResponse = curl_exec ($ch); // TRACKING RESPONSE
  }
  catch(Exception $ex)
  {
    print_r("Exception: " . $ex);
  }

Независимо от того, обслуживаю ли я его в http или в командной строке php post_track_ups_2.php, ничего не печатается и не повторяется. Разве я не должен что-то увидеть?

Для фавикона есть 404, но это ничего. Это должно работать! Разве не должно быть по крайней мере исключение? Что-то!

Номер отслеживания указан на странице 7 документации UPS «Руководство разработчика веб-службы отслеживания».

заранее спасибо


person kronus    schedule 17.01.2019    source источник
comment
Белый экран смерти == error_reporting и/или display_errors необходимо включить/включить.   -  person Sammitch    schedule 18.01.2019
comment
Ваш php/curl в порядке для установления связи, вы просматриваете источник своего вывода в виде обычного текста (Ctrl+U)? Очевидно, я не могу подтвердить, так как мне нужен лицензионный ключ.   -  person Scuzzy    schedule 18.01.2019
comment
@Sammitch, спасибо за ответ. Я добавил error_reporting(E_ALL); ini_set('display_errors', 1); и все равно ничего   -  person kronus    schedule 18.01.2019
comment
@Scuzzy, спасибо за ответ. Я не знаю, что вы подразумеваете под (Ctrl+U). Вы имеете в виду, что файл должен быть сохранен как обычный текст?   -  person kronus    schedule 18.01.2019
comment
Я не думаю, что сбой вашего запроса на завивку вызовет исключение. Он просто вернет false, и эхо ничего не напечатает. Вы можете проверить ошибки curl после выполнения, чтобы увидеть, в чем проблема.   -  person Don't Panic    schedule 18.01.2019
comment
Ожидается ли два XML-документа в одном запросе?   -  person Don't Panic    schedule 18.01.2019
comment
@kronus в вашем коде, вы можете попробовать добавить var_dump(curl_error($ch),curl_errno($ch)); после того, как вы выполнили curl_exec()   -  person Scuzzy    schedule 18.01.2019
comment
Почему вы отключаете CURLOPT_SSL_VERIFYHOST?   -  person Dharman    schedule 18.01.2019
comment
@Dharman, спасибо за ответ, я отключил его, потому что я не публикую сообщения с SSL-сервера, а только из своей локальной среды разработки. Я также читал, что отключение этого — один из шагов в устранении неполадок cURL. Меньше вероятность ошибки при выключении, так сказать   -  person kronus    schedule 18.01.2019
comment
@Don'tPanic, спасибо за ответ. Я использую то, что прочитал. Я мог бы попытаться объединить два XML-файла, но я не понимаю, почему ничего не возвращается. Даже не ошибка аутентификации   -  person kronus    schedule 18.01.2019
comment
@Scuzzy, спасибо за предложение. Он вернул следующее: строка «ошибка: 1407742E: подпрограммы SSL: SSL23_GET_SERVER_HELLO: версия протокола оповещения tlsv1» (длина = 79) int 35 — я еще не искал ошибку, но означает ли это, что сервер не примет сообщение с моего сервера разработки, на котором нет SSL?   -  person kronus    schedule 18.01.2019
comment
Вы используете ОЧЕНЬ старую версию OpenSSL, и вам абсолютно необходимо обновить ее. На самом деле, улучшите все в радиусе 100 м от этой коробки, так как, вероятно, в этом районе прячется больше гремлинов.   -  person Sammitch    schedule 18.01.2019
comment
@Sammitch, спасибо за ответ. Да, я использовал brew update, а затем brew upgrade openssl, что перевело меня на openssl 1.02q, но, похоже, ничего не изменилось. Я все еще получаю ту же ошибку   -  person kronus    schedule 18.01.2019
comment
Мне удалось создать ls для версии openssl 1.02q, что позволило мне запустить из командной строки, что привело к следующему ответу: ‹?xml version=1.0?›‹TrackResponse›‹Response›‹TransactionReference›‹CustomerContext›Ваш Сводка тестового примераDescription‹/CustomerContext›‹XpciVersion›1.0‹/XpciVersion›‹/TransactionReference›‹ResponseStatusCode›0‹/ResponseStatusCode›ResponseStatusDescription›Failure‹/ResponseStatusDescription›Error›ErrorSeverity›Hard‹/ErrorSeverity›‹ErrorCode›151018‹/ErrorCode ›‹ErrorDescription›Неверный номер отслеживания‹/ErrorDescription›‹/Error›‹/Response›‹/TrackResponse›   -  person kronus    schedule 18.01.2019
comment
Похоже, у вас все готово.   -  person Scuzzy    schedule 18.01.2019
comment
@Scuzzy Мне не удалось заставить phpinfo() отображать последнюю версию openssl, как у меня в CLI. Знаете ли вы, что мне нужно сделать, чтобы обновить apache или чтобы apache увидел последнюю версию? Поскольку я буду публиковать php-файл из Angular, мне нужно, чтобы он работал в apache.   -  person kronus    schedule 18.01.2019
comment
для phpinfo в CLI... stackoverflow.com/questions/7190093/   -  person Scuzzy    schedule 18.01.2019
comment
@Scuzzy, извините, что я не был понятен ранее, но в моем phpinfo указана старая версия openssl. Мой CLI имеет последнюю версию, поэтому мой php работает из командной строки. Как я уже говорил ранее, мне нужно отправить сообщение из моего приложения Angular в файл php, а это означает, что мой php в браузере должен иметь доступ к последней версии openssl. С phpinfo он показывает OpenSSL/0.9.8zd, но мой CLI 1.02q. Как заставить веб-сервер использовать версию openssl 1.02q?   -  person kronus    schedule 18.01.2019


Ответы (1)


Как и во всех комментариях, вы можете видеть, что проблема была связана с тем, что не использовалась последняя версия openssl, в которой есть tsl 1.2, которую UPS и другие ищут, чтобы иметь безопасную публикацию и ответ cURL.

На всякий случай, если кто-то еще пройдет через это, вот шаги, которые я предпринял, чтобы моя mac os 10.10 работала в соответствии.

Во-первых, я загрузил последнюю версию openssl с openssl.org и установил — вы можете поискать в Google более подробные инструкции, чем я мог бы дать, но в основном убедитесь, что ваше пиво обновлено, и используйте его для установки.

Это позволит получить последнюю версию openssl в CLI (интерфейс командной строки), но не будет работать с веб-браузером apache/php. Я обнаружил это, создав страницу phpInfo(), и, к моему удивлению, она все еще читалась как 0.9.8zf.

После долгих прочтений сделал вот что:

cd into the openssl directory that you expanded after download

Ваши пути могут отличаться от моих, поэтому внесите соответствующие коррективы:

cd /Users/<home directory>/Downloads/openssl-1.0.2q
./Configure darwin64-x86_64-cc -fPIC shared --prefix=/PREFIX/openssl --openssldir=/PREFIX/openssl
make
make test
make install

brew install php --with-apache --with-homebrew-curl --with-homebrew-libxslt --with-homebrew-openssl --without-snmp

set path - /usr/local/Cellar/php56/5.6.9/bin/php in httpd-ssl.conf
also export /usr/local/Cellar/php56/5.6.9/bin/php in ~/.bash_profile
source ~/.bash_profile

вставьте следующую строку в httpd.conf

LoadModule php5_module /usr/local/Cellar/php56/5.6.9/libexec/apache2/libphp5.so
sudo apachectl restart

Спасибо всем, кто прокомментировал. Одно ведет к другому, чтобы добраться до этой точки, и я благодарю вас всех.

person kronus    schedule 18.01.2019