loadConfig(); $stripeApiKey = $config['tokenstripe'] ?? ''; if (empty($stripeApiKey)) { logMessage("Error: Stripe Secret Key is missing in plugin configuration."); exit(1); } $stripeClient = new StripeClient($stripeApiKey); logMessage("Iniciando auditoría de Intenciones de Pago (SPEI/Transferencia) incompletas..."); $hasMore = true; $nextPage = null; $totalIncomplete = 0; $customersWithIncomplete = []; $pisToReview = []; while ($hasMore) { try { $queryParams = [ 'query' => 'status:"requires_payment_method" OR status:"requires_action"', 'limit' => 100 ]; if ($nextPage) { $queryParams['page'] = $nextPage; } $results = $stripeClient->paymentIntents->search($queryParams); foreach ($results->data as $pi) { // Filtrar y proteger explícitamente los pagos OXXO $paymentMethodTypes = $pi->payment_method_types ?? []; $isOxxo = in_array('oxxo', $paymentMethodTypes); // Si es un pago de OXXO vigente (o en general para estar seguros), lo saltamos if ($isOxxo) { continue; } // Filtrar solo las que son de Transferencia Bancaria real (SPEI) $isBankTransfer = in_array('customer_balance', $paymentMethodTypes); $tipoPago = $pi->metadata['tipoPago'] ?? ''; // Garantizar que solo tocamos las transferencias bancarias if ($isBankTransfer || ($tipoPago === 'Transferencia Bancaria' && !$isOxxo)) { $totalIncomplete++; $customerId = $pi->customer; if (!isset($customersWithIncomplete[$customerId])) { $customersWithIncomplete[$customerId] = 0; } $customersWithIncomplete[$customerId]++; $pisToReview[] = [ 'id' => $pi->id, 'customer' => $customerId, 'amount' => $pi->amount / 100, 'currency' => $pi->currency, 'status' => $pi->status, 'created' => date('Y-m-d H:i:s', $pi->created) ]; } } $hasMore = $results->has_more; $nextPage = $results->next_page; // Pausa breve para evitar Rate Limits de Stripe usleep(500000); // 0.5s } catch (ApiErrorException $e) { logMessage("Error en la API de Stripe: " . $e->getMessage()); break; } catch (\Exception $e) { logMessage("Error inesperado: " . $e->getMessage()); break; } } logMessage("=== RESULTADOS DE LA AUDITORÍA ==="); logMessage("Total de Intenciones de Pago Incompletas (SPEI): " . $totalIncomplete); logMessage("Total de Clientes afectados: " . count($customersWithIncomplete)); $csvFile = __DIR__ . '/audit_incomplete_pi_results.csv'; $fp = fopen($csvFile, 'w'); if ($fp) { fputcsv($fp, ['PaymentIntent_ID', 'Stripe_Customer', 'Amount', 'Currency', 'Status', 'Created_At']); foreach ($pisToReview as $pi) { fputcsv($fp, [ $pi['id'], $pi['customer'], $pi['amount'], $pi['currency'], $pi['status'], $pi['created'] ]); } fclose($fp); logMessage("Se ha generado un archivo CSV con el detalle completo en: $csvFile"); } echo "\nResumen:\n"; echo "1. Intenciones huérfanas encontradas: $totalIncomplete\n"; echo "2. Clientes afectados: " . count($customersWithIncomplete) . "\n"; echo "-> Verifica el log y el archivo CSV para los detalles.\n";