Recently, when using the WeChat QR code scanning payment function of a mall, when the code constructs a WeChat order and then requests WeChat through curl, the curl_exec function reports a 500 error, and no detailed error message is given. There were no problems when using the Alibaba Cloud server and my local test before. Because the customer needs to put the program on the Alibaba Cloud virtual host, this problem occurs. And I confirmed that curl is turned on and can be used. The error displays display_errors and error_reporting has also been set up to display all errors. But:
1. Only 500 errors are displayed and no detailed error information is displayed.
2. The host can only see access logs, but cannot see error logs, nor can it see and modify php.ini settings and apache settings.
3. This error cannot be skipped by using @ and try catch, and the resource parameters of curl are also correct (I have printed each parameter)
In summary, I still haven’t found a way to locate this Wrong, I hope God can guide me.
<code> $ch = curl_init(); //设置超时 curl_setopt($ch, CURLOPT_TIMEOUT, $second); //如果有配置代理这里就设置代理 if(WxPayConfig::getValue('curl_proxy_host') != "0.0.0.0" && WxPayConfig::getValue('curl_proxy_port') != 0){ curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::getValue('curl_proxy_host')); curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::getValue('curl_proxy_port')); } curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验 //设置header curl_setopt($ch, CURLOPT_HEADER, FALSE); //要求结果为字符串且输出到屏幕上 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); if($useCert == true){ //设置证书 //使用证书:cert 与 key 分别属于两个.pem文件 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLCERT, WxPayConfig::getValue('sslcert_path')); curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::getValue('sslkey_path')); } //post提交方式 curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); //运行curl $data = curl_exec($ch); //返回结果 if($data){ curl_close($ch); return $data; } else { $error = curl_errno($ch); curl_close($ch); throw new WxPayException("curl出错,错误码:$error"); }</code>
Recently, when using the WeChat QR code scanning payment function of a mall, when the code constructs a WeChat order and then requests WeChat through curl, the curl_exec function reports a 500 error, and no detailed error message is given. There were no problems when using the Alibaba Cloud server and my local test before. Because the customer needs to put the program on the Alibaba Cloud virtual host, this problem occurs. And I confirmed that curl is turned on and can be used. The error displays display_errors and error_reporting has also been set up to display all errors. But:
1. Only 500 errors are displayed and no detailed error information is displayed.
2. The host can only see access logs, but cannot see error logs, nor can it see and modify php.ini settings and apache settings.
3. This error cannot be skipped by using @ and try catch, and the resource parameters of curl are also correct (I have printed each parameter)
In summary, I still haven’t found a way to locate this Wrong, I hope God can guide me.
<code> $ch = curl_init(); //设置超时 curl_setopt($ch, CURLOPT_TIMEOUT, $second); //如果有配置代理这里就设置代理 if(WxPayConfig::getValue('curl_proxy_host') != "0.0.0.0" && WxPayConfig::getValue('curl_proxy_port') != 0){ curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::getValue('curl_proxy_host')); curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::getValue('curl_proxy_port')); } curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验 //设置header curl_setopt($ch, CURLOPT_HEADER, FALSE); //要求结果为字符串且输出到屏幕上 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); if($useCert == true){ //设置证书 //使用证书:cert 与 key 分别属于两个.pem文件 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLCERT, WxPayConfig::getValue('sslcert_path')); curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::getValue('sslkey_path')); } //post提交方式 curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); //运行curl $data = curl_exec($ch); //返回结果 if($data){ curl_close($ch); return $data; } else { $error = curl_errno($ch); curl_close($ch); throw new WxPayException("curl出错,错误码:$error"); }</code>
Generally speaking, the virtual host will let you see the error log, but it may be the last few entries.
I guess the memory limit may be exceeded. Please submit a ticket to ask.
Why not post the code?
Add the following code at the beginning of the php file:
<code>set_error_handler(function(){ echo '<pre class="brush:php;toolbar:false">'; var_dump(func_get_args()); debug_print_backtrace(); },E_ERROR); set_error_handler(function(\Exception $e){ echo '<pre class="brush:php;toolbar:false">'; echo $e->getFile().PHP_EOL; echo $e->getLine().PHP_EOL; echo $e->getMessage().PHP_EOL; echo $e->getTraceAsString().PHP_EOL; });</code>