支付宝回调不支持fsockopen,用curl解决方法
2011-08-27 17:32
260 查看
这两天学习了支付宝接口即时到账程序,研究了一下原理,其中因为服务器不支持fsockopen,所以回调异步程序时失败,在支付宝接口程序有如下函数
/**获取远程服务器ATN结果
*$url 指定URL路径地址
*return 服务器ATN结果集
*/
function _get_verify($url,$time_out = "60") {
$urlarr = parse_url($url);
$errno = "";
$errstr = "";
$transports = "";
if($urlarr["scheme"] == "https") {
$transports = "ssl://";
$urlarr["port"] = "443";
} else {
$transports = "tcp://";
$urlarr["port"] = "80";
}
$newurl = $transports . $urlarr['host'];
$this->_log_result($newurl);
$fp = @fsockopen($newurl, $urlarr['port'], $errno, $errstr, $time_out);
if(!$fp) {
$this->_log_result("ERROR: $errno - $errstr");
die("ERROR: $errno - $errstr<br />\n");
} else {
fputs($fp, "POST ".$urlarr["path"]." HTTP/1.1\r\n");
fputs($fp, "Host: ".$urlarr["host"]."\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ".strlen($urlarr["query"])."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $urlarr["query"] . "\r\n\r\n");
while(!feof($fp)) {
$info[] = @fgets($fp, 1024);
}
fclose($fp);
$info = implode(",",$info);
return $info;
}
}
函数用于支付宝异步返回方法中得到的获取远程服务器ATN结果,反正就是true 或者false的结果
function _get_verify($url,$time_out = "60") {
$urlarr = parse_url($url);
$errno = "";
$errstr = "";
$transports = "";
if($urlarr["scheme"] == "https") {
$transports = "ssl://";
$urlarr["port"] = "443";
} else {
$transports = "tcp://";
$urlarr["port"] = "80";
}
$newurl = $transports . $urlarr['host'];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $urlarr["query"]);
curl_setopt($curl, CURLOPT_TIMEOUT, $time_out);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$info = curl_exec($curl);
// $this->_log_result("info:".$info);
if (curl_errno($curl)) {
$error=curl_error($curl);
$this->_log_result($error);
//echo '<pre><b>错误:</b><br />'.curl_error($curl);
}
curl_close($curl);
return $info;
}
不知道是否规范,反正都算解决了,希望大家多多指教,这样用CURL就得到了支付宝的远程数据了,如果大家有更好的写法请指教!!
/**获取远程服务器ATN结果
*$url 指定URL路径地址
*return 服务器ATN结果集
*/
function _get_verify($url,$time_out = "60") {
$urlarr = parse_url($url);
$errno = "";
$errstr = "";
$transports = "";
if($urlarr["scheme"] == "https") {
$transports = "ssl://";
$urlarr["port"] = "443";
} else {
$transports = "tcp://";
$urlarr["port"] = "80";
}
$newurl = $transports . $urlarr['host'];
$this->_log_result($newurl);
$fp = @fsockopen($newurl, $urlarr['port'], $errno, $errstr, $time_out);
if(!$fp) {
$this->_log_result("ERROR: $errno - $errstr");
die("ERROR: $errno - $errstr<br />\n");
} else {
fputs($fp, "POST ".$urlarr["path"]." HTTP/1.1\r\n");
fputs($fp, "Host: ".$urlarr["host"]."\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ".strlen($urlarr["query"])."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $urlarr["query"] . "\r\n\r\n");
while(!feof($fp)) {
$info[] = @fgets($fp, 1024);
}
fclose($fp);
$info = implode(",",$info);
return $info;
}
}
函数用于支付宝异步返回方法中得到的获取远程服务器ATN结果,反正就是true 或者false的结果
function _get_verify($url,$time_out = "60") {
$urlarr = parse_url($url);
$errno = "";
$errstr = "";
$transports = "";
if($urlarr["scheme"] == "https") {
$transports = "ssl://";
$urlarr["port"] = "443";
} else {
$transports = "tcp://";
$urlarr["port"] = "80";
}
$newurl = $transports . $urlarr['host'];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $urlarr["query"]);
curl_setopt($curl, CURLOPT_TIMEOUT, $time_out);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$info = curl_exec($curl);
// $this->_log_result("info:".$info);
if (curl_errno($curl)) {
$error=curl_error($curl);
$this->_log_result($error);
//echo '<pre><b>错误:</b><br />'.curl_error($curl);
}
curl_close($curl);
return $info;
}
不知道是否规范,反正都算解决了,希望大家多多指教,这样用CURL就得到了支付宝的远程数据了,如果大家有更好的写法请指教!!
相关文章推荐
- Lua中让回调函数支持回调对象方法的解决方法
- chrome新版不支持旺旺 支付宝 插件的解决方法
- GridView中出现“TemplateField 上不支持回调,因为某些控件不能在回调中正确更新。”的解决方法
- 解决curl不支持的方法
- IE中setTimeout和setInterval不支持回调函数参数的解决方法
- PHP 不支持CURL的解决方法
- IE中setTimeout和setInterval不支持回调函数参数的解决方法
- IE 8不支持支付宝插件问题解决方法
- 解决高德地图在线API不支持对应的方法回调返回结果的问题
- 安装软件提示“您的设备不支持add-on属性”的解决方法
- Win7 64位系统 php运行出现undefined function curl_init()解决方法
- sharepoint2010的IE6不支持的解决方法
- 因为此版本的应用程序不支持其项目类型(.vcproj)的解决方法
- ie8 不支持new Date(2012-11-10)问题的解决方法
- Android WebView 不支持 H5 input type="file" 解决方法
- android6.0不支持Httpclient的解决方法
- [转]"此数据库没有有效所有者,因此无法安装数据库关系图支持对象"的解决方法
- VS2010在加载项目时,提示无法打开项目文件, 此安装不支持该项目类型的解决方法
- Call to undefined function curl_init() 解决方法