我有以下代码块连接到安全服务(支付交易网关),传入一些字段($ 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参数,请告诉我。
答案 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);
答案 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协议相当透明。