从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);
我建议你看看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协议相当透明。
我认为你将仍然有\ r \ n \ r \ n根据那些substr分裂后的那些变量之一中的http响应规格来分离那2个。当这样做时,你可能想摆脱这些。 –