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


    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 /> ");
        }
         else {
            if (trim($input_charset) == '') {
                fputs($fp"POST ".$urlarr["path"]." HTTP/1.1 ");
            }
            else {
                fputs($fp"POST ".$urlarr["path"].'?_input_charset='.$input_charset." HTTP/1.1 ");
            }
             
            fputs($fp"Host: ".$urlarr["host"]." ");
            fputs($fp"Content-type: application/x-www-form-urlencoded ");
            fputs($fp"Content-length: ".strlen($urlarr["query"])." ");
            fputs($fp"Connection: close ");
            fputs($fp$urlarr["query"] . " ");
            while(!feof($fp))
            {
                $responseText .= @fgets($fp, 1024);
            }
     
            fclose($fp);
            $responseText = trim(stristr($responseText," ")," ");
            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!交易成功,问题由此解决!
  • 相关阅读:
    Rancher安装
    JDK8日期时间对象
    String经典面试题
    String
    单例模式
    多线程
    接口
    代码块
    内存吞金兽(Elasticsearch)的那些事儿 -- 常见问题痛点及解决方案
    内存吞金兽(Elasticsearch)的那些事儿 -- 写入&检索原理
  • 原文地址:https://www.cnblogs.com/ibeisha/p/yuncart.html
Copyright © 2020-2023  润新知