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 LIMPIEZA de Intenciones de Pago (SPEI/Transferencia) incompletas..."); if ($isDryRun) { logMessage("ATENCIÓN: Ejecutando en MODO PRUEBA (Dry Run). No se cancelará nada en Stripe."); logMessage("Para ejecutar la limpieza real, pasa el argumento: --confirm"); } else { logMessage("ATENCIÓN: Ejecutando en MODO DESTRUCTIVO. Se procederá a cancelar las intenciones encontradas."); } $hasMore = true; $nextPage = null; $totalCanceled = 0; $totalFound = 0; 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) { // Proteger y omitir por completo cualquier intención de OXXO $paymentMethodTypes = $pi->payment_method_types ?? []; $isOxxo = in_array('oxxo', $paymentMethodTypes); if ($isOxxo) { continue; } // Filtrar solo las que son de Transferencia Bancaria $isBankTransfer = in_array('customer_balance', $paymentMethodTypes); $tipoPago = $pi->metadata['tipoPago'] ?? ''; if ($isBankTransfer || ($tipoPago === 'Transferencia Bancaria' && !$isOxxo)) { $totalFound++; $logStr = "PI: {$pi->id} | Cliente: {$pi->customer} | Monto: " . ($pi->amount / 100) . " {$pi->currency}"; if (!$isDryRun) { try { $stripeClient->paymentIntents->cancel($pi->id, [ 'cancellation_reason' => 'abandoned' ]); logMessage("[CANCELADA] $logStr"); $totalCanceled++; } catch (ApiErrorException $e) { logMessage("[ERROR al cancelar] $logStr - Detalle: " . $e->getMessage()); } } else { logMessage("[SIMULACIÓN - Sería Cancelada] $logStr"); } } } $hasMore = $results->has_more; $nextPage = $results->next_page; // Pausa breve para evitar Rate Limits 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("=== RESUMEN DE LA LIMPIEZA ==="); logMessage("Total encontradas (SPEI): $totalFound"); if (!$isDryRun) { logMessage("Total CANCELADAS exitosamente: $totalCanceled"); } else { logMessage("Modo PRUEBA finalizado. Ninguna fue cancelada."); } echo "\nVerifica el log 'clean_incomplete_pi.log' para los detalles.\n";