標籤: 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 智庫開發的支付插件就正常,用這個就有這個問題。我會按照你説的去試一遍~ 再次感謝
-
作者帖子
- 哎呀,回覆話題必需登錄。