YunCart電商網站支付寶接口出現500錯誤

     yuncart 是一套易與集成的php開源商城系統,方便多人同時經行二次開發,Yuncart 能夠以很是方便的方式切換到sql server,oracle等數據庫,大小1.9MB,感興趣的朋友,能夠去官網下載。php

     最近幫朋友用php作了一個電商網站,化妝品方面的。上網看了相關方面的程序源碼,最後選擇了yuncart,它輕量、簡單、功能豐富等特色,閒暇時,作了些修改。下面就今天出現的問題,簡單的說下,但願能幫助到有相似問題的童鞋。sql

     下圖爲我朋友的網站:數據庫

    yuncart,嫩好看,鄭州北鯊科技

 問題描述:服務器

      在網站上購買支付成功後,返回網站時,出現500內部服務器錯誤。oracle

       排除:出現500後,發現支付寶上交易已成功,錢也少了,說明支付的時候是沒有問題的,在回調的過程當中發生了錯我。app

而後,開啓網站上的日誌,進行線上調試:curl

    

    最後發現錯誤的根源出如今:/include/front/third/payment/alipay/alipay_core.function.php中tcp

 function getHttpResponse($url, $input_charset = '', $time_out = "60") {
    $urlarr     = parse_url($url);
    $errno      = "";
    $errstr     = "";
    $transports = "";
    $responseText = "";
    if($urlarr["scheme"] == "https") {
        $transports = "ssl://";
        $urlarr["port"] = "443";
    } else {
        $transports = "tcp://";//LCQ修改
        $urlarr["port"] = "80";
    }
    
    
    $fp=@fsockopen($transports."".$urlarr['host'],$urlarr['port'],$errno,$errstr,$time_out);
    
    if(!$fp)
     {
        die("ERROR: $errno - $errstr<br />\n");
    }
     else {
        if (trim($input_charset) == '') {
            fputs($fp, "POST ".$urlarr["path"]." HTTP/1.1\r\n");
        }
        else {
            fputs($fp, "POST ".$urlarr["path"].'?_input_charset='.$input_charset." 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))
        {
            $responseText .= @fgets($fp, 1024);
        }

        fclose($fp);
        $responseText = trim(stristr($responseText,"\r\n\r\n"),"\r\n");
        return $responseText;
    }

這個函數中使用了函數

fsockopen這個函數,因爲某些服務器或虛擬空間上,不支持php的fsockopen方法,網上也有說:在url中,去掉http://
如:http://www.xxx.com改爲www.xxx.com。但這仍不是問題的核心。換來,改用curl來取代fsockopen。因而
getHttpResponse方法就改寫成:
/**
 * 做  者:鄭州北鯊* 遠程獲取數據
 * 注意:該函數的功能能夠用curl來實現和代替。curl需自行編寫。
 * $url 指定URL完整路徑地址
 * @param $input_charset 編碼格式。默認值:空值
 * @param $time_out 超時時間。默認值:60
 * return 遠程輸出的數據
 */
//curl改寫fsockopen
function getHttpResponse($url,$requestdata,$time_out = "60") 
{
    $ci = curl_init();
    curl_setopt($ci,CURLOPT_USERAGENT,"Yuncart");
    curl_setopt($ci,CURLOPT_CONNECTTIMEOUT,$time_out);
    curl_setopt($ci,CURLOPT_TIMEOUT,$time_out);
    curl_setopt($ci,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ci,CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($ci, CURLOPT_HEADER, false);
    curl_setopt($ci,CURLOPT_POST,true);
    curl_setopt($ci, CURLOPT_POSTFIELDS,$requestdata);
    curl_setopt($ci, CURLINFO_HEADER_OUT, TRUE );
    curl_setopt($ci, CURLOPT_URL, trim($url,"?"));
    $response = curl_exec($ci);
    $http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
    $http_info = curl_getinfo($ci);
    curl_close ($ci);
   return $response;
}
這樣以來,咱們再次測試,OK!交易成功,問題由此解決!
相關文章
相關標籤/搜索