支付宝回调不支持fsockopen,用curl解决方法

这两天学习了支付宝接口即时到账程序,研究了一下原理,其中因为服务器不支持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就得到了支付宝的远程数据了,如果大家有更好的写法请指教!!

posted @ 2011-08-27 17:32  samson1989  阅读(2640)  评论(0)    收藏  举报