标签: WooAlipay
-
作者帖子
-
开启插件后
https://domain.com/wc-api/WC_Alipay/
错误如下:
Fatal error: Uncaught Error: Call to a member function get_total() on bool in /www/wwwroot/domain.com/wp-content/plugins/woo-alipay/inc/class-wc-alipay.php:355 Stack trace: #0 /www/wwwroot/domain.com/wp-includes/class-wp-hook.php(290): WC_Alipay->check_alipay_response() #1 /www/wwwroot/domain.com/wp-includes/class-wp-hook.php(316): WP_Hook->apply_filters() #2 /www/wwwroot/domain.com/wp-includes/plugin.php(484): WP_Hook->do_action() #3 /www/wwwroot/domain.com/wp-content/plugins/woocommerce/includes/class-wc-api.php(161): do_action() #4 /www/wwwroot/domain.com/wp-includes/class-wp-hook.php(292): WC_API->handle_api_requests() #5 /www/wwwroot/domain.com/wp-includes/class-wp-hook.php(316): WP_Hook->apply_filters() #6 /www/wwwroot/domain.com/wp-includes/plugin.php(551): WP_Hook->do_action() #7 /www/wwwroot/domain.com/wp-includes/class-wp.php(388): do_action_ref_array() #8 /www/wwwroot/domain.com/wp-includes/class-wp.php(750): WP->parse_request() #9 /www/wwwroot/domain.com/wp-includes/functions.php(1291): WP->main() # in /www/wwwroot/domain.com/wp-content/plugins/woo-alipay/inc/class-wc-alipay.php on line 355
WordPress 系统版本:5.8
停用你网站除 woocommerce 的全部插件后进行排查,一般是插件不兼容导致。
应该不是,可能是插件不兼容现在的 wp 版本了。我重新建立了测试站换了主题停用了其他所有插件一样报错误。
再过五年这个插件都能正常用,我们给客户配的和自己商城用的都是。
这个错误是因为 Woo-Alipay 无法通过订单 ID 获取 Woo 的 WC_Order 对象。
而订单 ID 是从前端通过 POST 传来的 out_trade_no 字段中提取的。
考虑到 Woo 内置的常用函数出 bug 的几率太小,所以这个问题只存在以下两种可能:
- 你订单的 out_trade_no 字段格式错误。去数据库里瞅瞅,然后贴上来再看看。
- 支付宝回调时未正常传递 out_trade_no 。这种可能性非常非常小,几乎可以忽略,所以只检查一下情况一就可以。不过如果你开启了某些 waf 防火墙的话是有可能被过滤掉字段的,有这些防火墙、 CDN 之类的建议先停掉。
非常感谢您的回复, 数据库中没有 out_trade_no 这个字段呀
翻了下代码,out_trade_no 字段是实时生成的没入库。不过通过代码上下文判断,我觉得这个字段不存在生成错误的可能,如果生成错误的话你应该在下单的时候就碰到报错,而不是等到回调的时候。
所以现在可能的情况只剩下在支付宝回调的传参过程中出现了问题。
不过你为啥能看到上面的报错信息?是通过 PHP 错误日志看的吗?所以我怀疑你是不是在手工请求支付网关?这个网关应该由支付宝官方主动回调,而不是手工访问。
如果你没有手工访问的话,需要在以下两个地方分别下调试语句取日志:
文件:wp-content/plugins/woo-alipay/inc/class-wc-alipay.php(行:671)
在函数开头加两行:
var_dump($out_trade_no);
exit;之后尝试下单,就会在网页上看到下单时的 out_trade_no 字段值。获取值后记得把代码删掉。
然后是获取回调时支付宝传递来的 out_trade_no 。
文件:wp-content/plugins/woo-alipay/inc/class-wc-alipay.php(行:340)
在函数开头添加以下两行:
file_put_contents( WP_CONTENT_DIR . ‘/alipay.log’, json_encode( $_POST ) . PHP_EOL, FILE_APPEND );
file_put_contents( WP_CONTENT_DIR . ‘/alipay.log’, filter_input( INPUT_POST, ‘out_trade_no’, FILTER_SANITIZE_STRING ) . PHP_EOL, FILE_APPEND );然后完整执行一次下单流程,之后把 wp-content 目录下的 alipay.log 文件的内容连同下单时的 out_trade_no 值一起贴上来。注意下:你得保证 wp-content 目录有 www 用户的写入权限,否则是写不了日志的。
我是手动输入上面的地址,页面出现这个错误。
因为我支付订单时支付宝成功后返回到我网站的页面,但是订单页面还是显示未支付,但是钱已经到账了。 所以我手动输入输入回调地址 页面报错,正常来说访问回调地址的链接不应该出现报错。
你手工访问触发报错是插件作者没做边界处理,不过这个顶多算编码不规范,不能算是 BUG 。
你这种情况先检查一下 PHP 错误日志 (日志文件),看回调时时候有没有错误被记录。
其次确认下你是否在使用 let’s encrypt 证书?也不排除支付宝官方的服务器使用旧版的 openssl,仍不信任这个证书,于是导致回调失败。
最后你可以按我前面发的,记录一下支付宝回调的日志。如果发现没有日志生成的话就需要联系支付宝客户问问是不是有什么稀奇古怪的问题导致他们没触发回调。
再次非常感谢您的耐心解答和分析,我是使用 let』s encrypt 的证书。我用 wordpress 智库开发的支付插件就正常,用这个就有这个问题。我会按照你说的去试一遍~ 再次感谢
-
作者帖子
- 哎呀,回复话题必需登录。