解析curl_exec调用的响应POST数据

时间:2011-08-10 11:01:13

标签: php post curl https

我有以下代码块连接到安全服务(支付交易网关),传入一些字段($ 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批准日期:2011年8月10日星期三09:24:15 GMT   连接:关闭内容类型:application / x-www-form-urlencoded   内容长度:182   avs_code = X&安培; cvv2_code = P&安培; STATUS_CODE = 1&安培;处理器= TEST&安培; AUTH_CODE = 999999&安培; settle_amount = 2000&安培; settle_currency = USD&安培; TRANS_ID = 120741127516&安培; auth_msg = TEST + APPROVED&安培; auth_date = 2011-08-10 + 09:24: 15

是否存在将此结果字符串拆分为其组成部分的方法或CURL调用?还是我需要自己写的东西?我需要获取响应代码(200),批准/拒绝部分(已批准)和查询字符串(avs_code ....)。我尝试查看curl_getinfo,但这只是获取HTTP响应代码,而不是批准/拒绝或查询字符串值。

我是PHP的新手,所以如果我错过了一个明显的方法调用或CURL参数,请告诉我。

2 个答案:

答案 0 :(得分:5)

    $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 manual

答案 1 :(得分:1)

我建议您查看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;
}

您可以使用http://php.net/manual/ru/function.http-parse-cookie.php(或评论中的功能)和http://php.net/manual/en/function.parse-str.php来解析Cookie并发布值。 HTTP协议相当透明。