анализ POST-данных ответа на вызов curl_exec - PullRequest
0 голосов
/ 10 августа 2011

У меня есть следующий блок кода, который подключается к защищенному сервису (шлюз платежных транзакций), проходит в некоторые поля ($ postData) и получает ответ ($ returnValue).

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://secure.service.com/data');
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1); 
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
if ($returnValue = curl_exec($ch))
{
    $error = curl_error($ch);
}

Когда я отображаю содержимое $ returnValue ... они отображаются следующим образом:

HTTP / 1.0 200 OK Утверждено Дата: ср, 10 августа 2011 09:24: 15 GMT Соединение: закрыть Тип контента: application / x-www-form-urlencoded Длина контента: 182 avs_code = X & cvv2_code = P & status_code = 1 & процессор = TEST & auth_code = 999999 &plan_amount = 2000 &селиться_currency = USD & trans_id = 120741127516 & TEST + ATH_HTHG10 + 09: 24: 15

Существует ли метод или вызов CURL, который разбивает эту строку результата на составные части?или это то, что мне нужно написать самому?Мне нужно получить код ответа (200), часть утверждения / отклонения (Утверждено) и строку запроса (avs_code ....).Я попытался просмотреть curl_getinfo, но это только дает мне код ответа HTTP, а не значения подтверждения / отклонения или строки запроса.

Я новичок в PHP, поэтому, пожалуйста, дайте мне знать, если яотсутствует очевидный вызов метода или параметр CURL.

Ответы [ 2 ]

5 голосов
/ 10 августа 2011
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_COOKIE, "");
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $result = curl_exec($ch);
    $header=substr($result,0,curl_getinfo($ch,CURLINFO_HEADER_SIZE));
    $body=substr($result,curl_getinfo($ch,CURLINFO_HEADER_SIZE));
    curl_close($ch);

Чем использовать что-то вроде preg_match_all("/Set-Cookie: (.*?)=(.*?);/i",$header,$res);

См. preg_match_all руководство

1 голос
/ 10 августа 2011

Я предлагаю вам посмотреть http://php.net/manual/en/function.http-parse-headers.php руководство, если вы не хотите устанавливать PECL pecl_http - есть полезные комментарии пользователей. Например:

function http_parse_headers($header) {
    $retVal = array();
    $fields = explode("\r\n", preg_replace('/\x0D\x0A[\x09\x20]+/', ' ', $header));
    foreach ($fields as $field) {
        if (preg_match('/([^:]+): (.+)/m', $field, $match)) {
            $match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($match[1])));
            if (isset($retVal[$match[1]])) {
                $retVal[$match[1]] = array($retVal[$match[1]], $match[2]);
            } else {
                $retVal[$match[1]] = trim($match[2]);
            }
        }
    }
    return $retVal;
}

Вы можете анализировать файлы cookie и публиковать значения с помощью http://php.net/manual/ru/function.http-parse-cookie.php (или функций в комментариях) и http://php.net/manual/en/function.parse-str.php. Протокол HTTP довольно прозрачен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...