从curl_exec解析响应POST数据调用

问题描述:

我有以下代码块连接到一个安全服务(支付交易网关),传递一些字段($ postData)并接收响应($ returnValue)。从curl_exec解析响应POST数据调用

$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日9时24分15秒GMT 连接:关闭内容类型:应用/ X WWW的窗体-urlencoded 的Content-Length:182 avs_code = X & cvv2_code = P & STATUS_CODE = 1个&处理器= TEST & AUTH_CODE = 999999 & settle_amount = 2000 & settle_货币= 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参数。

$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

我认为你将仍然有\ r \ n \ r \ n根据那些substr分裂后的那些变量之一中的http响应规格来分离那2个。当这样做时,你可能想摆脱这些。 –

我建议你看看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。 HTTP协议相当透明。