yuncart 是一套易與集成的php開源商城系統,方便多人同時經行二次開發,Yuncart 能夠以很是方便的方式切換到sql server,oracle等數據庫,大小1.9MB,感興趣的朋友,能夠去官網下載。php
最近幫朋友用php作了一個電商網站,化妝品方面的。上網看了相關方面的程序源碼,最後選擇了yuncart,它輕量、簡單、功能豐富等特色,閒暇時,作了些修改。下面就今天出現的問題,簡單的說下,但願能幫助到有相似問題的童鞋。sql
下圖爲我朋友的網站:數據庫
問題描述:服務器
在網站上購買支付成功後,返回網站時,出現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!交易成功,問題由此解決!