李朝强的博客

人之为学,如饮河海,大饮则大盈,小饮则小颖!
随笔 - 39, 文章 - 2, 评论 - 187, 阅读 - 19万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

YunCart电商网站支付宝接口出现500错误

Posted on   李朝强  阅读(1488)  评论(0编辑  收藏  举报
yuncart 是一套易与集成的php开源商城系统,方便多人同时经行二次开发,Yuncart 可以以非常方便的方式切换到sql server,oracle等数据库,大小1.9MB,感兴趣的朋友,可以去官网下载。

     最近帮朋友用php做了一个电商网站,化妆品方面的。上网看了相关方面的程序源码,最后选择了yuncart,它轻量、简单、功能丰富等特点,闲暇时,做了些修改。下面就今天出现的问题,简单的说下,希望能帮助到有类似问题的童鞋。

     下图为我朋友的网站:

    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!交易成功,问题由此解决!
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示