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!交易成功,问题由此解决! |
人之为学,如饮河海,大饮则大盈,小饮则小颖!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?