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