最近帮朋友用php做了一个电商网站,化妆品方面的。上网看了相关方面的程序源码,最后选择了yuncart,它轻量、简单、功能丰富等特点,闲暇时,做了些修改。下面就今天出现的问题,简单的说下,希望能帮助到有类似问题的童鞋。
下图为我朋友的网站:
问题描述:
在网站上购买支付成功后,返回网站时,出现500内部服务器错误。
排除:出现500后,发现支付宝上交易已成功,钱也少了,说明支付的时候是没有问题的,在回调的过程中发生了错我。
然后,开启网站上的日志,进行线上调试:
最后发现错误的根源出现在:/include/front/third/payment/alipay/alipay_core.function.php中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
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 ;
}
|
这个函数中使用了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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!交易成功,问题由此解决! |