yuncart 是一套易与集成的php开源商城系统,方便多人同时经行二次开发,Yuncart 可以以非常方便的方式切换到sql server,oracle等数据库,大小1.9MB,感兴趣的朋友,可以去
官网下载。
最近帮朋友用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!交易成功,问题由此解决!
|