// AJAX 處理函數:測試 TapPay 連線 (僅限管理員) add_action('wp_ajax_aifa_test_tappay_connection', 'aifa_test_tappay_connection_handler'); function aifa_test_tappay_connection_handler() { // 檢查是否在管理後台 if (!is_admin()) { wp_send_json_error('僅限管理後台使用'); return; } // 檢查用戶權限 (雙重檢查) if (!current_user_can('manage_woocommerce') && !current_user_can('administrator')) { wp_send_json_error('權限不足'); return; } // 驗證 nonce if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'aifa_test_connection')) { wp_send_json_error('安全驗證失敗'); return; } // 驗證必要參數 $required_fields = ['app_id', 'app_key', 'partner_key', 'merchant_id', 'environment']; foreach ($required_fields as $field) { if (!isset($_POST[$field]) || empty($_POST[$field])) { wp_send_json_error('缺少必要參數: ' . $field); return; } } $app_id = sanitize_text_field($_POST["app_id"]); $app_key = sanitize_text_field($_POST["app_key"]); $partner_key = sanitize_text_field($_POST["partner_key"]); $merchant_id = sanitize_text_field($_POST["merchant_id"]); $environment = sanitize_text_field($_POST["environment"]); // 組建測試 API URL $api_url = ($environment === "sandbox") ? "https://sandbox.tappaysdk.com/tpc/payment/pay-by-prime" : "https://prod.tappaysdk.com/tpc/payment/pay-by-prime"; try { // 記錄測試開始 error_log('AIFA TapPay 連線測試開始 - 環境: ' . $environment . ', Merchant: ' . $merchant_id); // 建立測試付款請求 (故意使用無效 Prime Token 來測試連線) $test_data = array( 'prime' => 'test_invalid_prime_' . time(), // 無效 Prime Token,但能測試 API 連線 'partner_key' => $partner_key, 'merchant_id' => $merchant_id, 'details' => 'AIFA 連線測試 - ' . date('Y-m-d H:i:s'), 'amount' => 1, 'cardholder' => array( 'phone_number' => '0912345678', 'name' => 'AIFA Test Connection', 'email' => 'test@aifa258.org' ), 'order_number' => 'AIFA_TEST_CONN_' . time() . '_' . wp_generate_password(4, false) ); $response = wp_remote_post($api_url, array( "headers" => array( "Content-Type" => "application/json", "x-api-key" => $partner_key ), "body" => json_encode($test_data), "timeout" => 15 )); if (is_wp_error($response)) { wp_send_json_error("網路連線失敗: " . $response->get_error_message()); return; } $http_code = wp_remote_retrieve_response_code($response); $body = wp_remote_retrieve_body($response); $result = json_decode($body, true); // 記錄回應詳情 error_log('AIFA TapPay API 回應 - HTTP: ' . $http_code . ', Body: ' . substr($body, 0, 500)); // 分析回應 if ($http_code === 200) { if ($result && isset($result['status'])) { $status_code = intval($result['status']); $message = $result['msg'] ?? '未知回應'; if ($status_code === 10100) { // 預期的錯誤:Prime Token 無效,但代表 API 連線和憑證都正確 error_log('AIFA TapPay 連線測試成功 - 收到預期的 Prime Token 錯誤'); wp_send_json_success('✅ API 連線正常!收到預期的錯誤回應 (Prime Token 無效),代表憑證設定正確。環境: ' . $environment); } elseif ($status_code === 0) { // 不太可能發生,但如果成功就更好了 wp_send_json_success('🎉 API 連線並測試付款成功!(這不應該發生,因為使用的是測試 Token)'); } else { // 其他錯誤狀態,但至少連線成功 wp_send_json_success('⚠️ API 連線正常,但收到錯誤狀態 ' . $status_code . ': ' . $message . ' (環境: ' . $environment . ')'); } } else { error_log('AIFA TapPay API 回應格式異常: ' . $body); wp_send_json_error('❌ API 回應格式異常,請檢查設定。回應: ' . substr($body, 0, 200)); } } elseif ($http_code === 401) { error_log('AIFA TapPay 認證失敗 401'); wp_send_json_error('🔑 認證失敗 (401):Partner Key 可能不正確,或環境設定錯誤'); } elseif ($http_code === 400) { error_log('AIFA TapPay 請求格式錯誤 400'); wp_send_json_error('📝 請求格式錯誤 (400):請檢查 Merchant ID 或其他參數設定'); } elseif ($http_code === 403) { wp_send_json_error('🚫 訪問被拒絕 (403):請檢查 API 權限設定'); } elseif ($http_code === 500) { wp_send_json_error('🔧 伺服器錯誤 (500):TapPay 伺服器暫時無法處理請求'); } else { error_log('AIFA TapPay 未預期的 HTTP 狀態碼: ' . $http_code); wp_send_json_error('❓ 未預期的回應 (HTTP ' . $http_code . ')。回應: ' . substr($body, 0, 200)); } } catch (Exception $e) { error_log('AIFA TapPay 連線測試例外: ' . $e->getMessage()); wp_send_json_error('💥 測試過程發生錯誤: ' . $e->getMessage()); } } https://aifa258.org/sitemap-post-type-post.xml https://aifa258.org/sitemap-post-type-page.xml https://aifa258.org/sitemap-post-type-product.xml https://aifa258.org/sitemap-taxonomy-category.xml https://aifa258.org/sitemap-taxonomy-product_cat.xml