setTimezone(new DateTimeZone('UTC'))->getTimestamp(); $endDate = (new DateTime('@' . $endDateLocal))->setTimezone(new DateTimeZone('UTC'))->getTimestamp(); $amount = 200; //Cantidad a cobrar //$amount = intval($amount * 100); //Conversión de la cantidad a centavos, solo referencia, no usar $customer_id_stripe = 'cus_PdXOlNaXGOxvlw'; //ID del cliente en Stripe $clientId_CRM = 409; //ID del cliente en UISP CRM //agregar constante de id de administrador 5472 $signedAdminId = 5472; //ID del administrador que realiza la operación $produccion = true; //Variable para indicar si se está en modo producción o no $clientGuzzleHttp = new Client([ 'base_uri' => $baseUri, 'headers' => [ 'X-Auth-App-Key' => $token, 'Accept' => 'application/json', ], 'verify' => false, ]); if ($produccion) { $stripe = new \Stripe\StripeClient('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'); //Token de clave privada en modo prodcucción para la API de Stripe $baseUri = 'https://sistema.siip.mx/crm/api/v1.0/'; //endpoint de la API REST del CRM // $token = '7adc9198-50b1-41d0-9bfa-d4946902ed89'; //Token para acceder a los recursos del CRM 2025 // $token = '079c28f5-888c-457d-bd7a-0a4202590f75'; //Token para acceder a los recursos del CRM $token = '72VoFACForJQzveorR1sTLrXXwrnnK/oy6Bp9luwFTGC/dRdeQWNmFZqJeHuUzqK'; //Token para acceder a los recursos del CRM actualizado } else { $stripe = new \Stripe\StripeClient('sk_test_51OkG0REFY1WEUtgRH6UxBK5pu80Aq5Iy8EcdPnf0cOWzuVLQTpyLCd7CbPzqMsWMafZOHElCxhEHF7g8boURjWlJ00tBwE0W1M'); //Token de clave privada en modo prueba para la API de Stripe $baseUri = 'https://venus.siip.mx/crm/api/v1.0/'; //endpoint de la API REST del CRM // $token = '6abef18c-783d-4dd0-b530-be6e6a7bbd1d'; //Token para acceder a los recursos del CRM $token = 'gvcnIJqXdUjneVSjhl6THLlQcYXJyIFCcwHKVba2bvIrNraanCTb5VeoWuJ0TFZ9'; //Token para acceder a los recursos del CRM actualizado } createPaymentIntent($stripe, $amount, $customer_id_stripe, $clientId_CRM, $signedAdminId); //Crea el PaymentIntent //createOxxoPaymentIntent($stripe, $amount, $customer_id_stripe, $clientId_CRM); //Crea el PaymentIntent para OXXO //cancelarPaymentIntent($stripe, $customer_id_stripe, $clientId_CRM); //Cancela el PaymentIntent //cancelarOxxoPaymentIntent($stripe, $customer_id_stripe, $clientId_CRM); //Cancela el PaymentIntent para OXXO //cliente GuzzleHttp para consumir API del UISP CRM //descomentar para generar el archivo csv con los ID de los clientes a los que se les va a cancelar sus payment intents // $archivoCsv = './PaymentIntentStripe.csv'; //ruta al archivo csv con los ID de los clientes a los que se les va a cancelar sus payment intents // $columnaDeseada = 0; // Columna para leer del archivo csv // $esPrimeraFila = false; // Variable de control para detectar la primera fila e ignorarla ya que son las columnas // $ucrm_client_id; // if (($gestor = fopen($archivoCsv, 'r')) !== false) { //Abre el archivo csv // while (($datos = fgetcsv($gestor, 1000, ',')) !== false) { //Lee el archivo csv // if ($esPrimeraFila) { //Ignora la primera fila // $esPrimeraFila = false; // continue; // } // $num = count($datos); //Cuenta el número de columnas // for ($c = 0; $c < $num; $c++) { //Recorre las columnas // sleep(2); //Espera 1 segundo // $ucrm_client_id = $datos[$columnaDeseada]; //Obtiene el ID del cliente en UISP CRM // //Hace la petición GET al CRM para obtener el ID del cliente en Stripe // $response = $clientGuzzleHttp->request('GET', 'clients/' . $ucrm_client_id); // $responseBody = json_decode($response->getBody(), true); //Decodifica el JSON de la respuesta // //ejemplo de respuesta en formato JSON de la API del CRM: {"id":2,"userIdent":null,"previousIsp":null,"isLead":false,"clientType":1,"companyName":null,"companyRegistrationNumber":null,"companyTaxId":null,"companyWebsite":null,"street1":"31 Chiapas","street2":null,"city":"Dolores Hidalgo Cuna de la Independencia Nacional","countryId":173,"stateId":null,"zipCode":"37800","fullAddress":"Chiapas 31, Centro, Dolores Hidalgo Cuna de la Independencia Nacional, Gto., M\u00e9xico","invoiceStreet1":null,"invoiceStreet2":null,"invoiceCity":null,"invoiceStateId":null,"invoiceCountryId":null,"invoiceZipCode":null,"invoiceAddressSameAsContact":true,"note":"Cliente espacial, el m\u00e1s chido","sendInvoiceByPost":null,"invoiceMaturityDays":null,"stopServiceDue":null,"stopServiceDueDays":null,"organizationId":1,"tax1Id":null,"tax2Id":null,"tax3Id":null,"registrationDate":"2024-01-25T00:00:00-0600","leadConvertedAt":null,"companyContactFirstName":null,"companyContactLastName":null,"isActive":true,"firstName":"Daniel Humberto","lastName":"Soto Villegas","username":"danydhsv","contacts":[{"id":2,"clientId":2,"email":"dhsv.141089@gmail.com","phone":"5214181878106","name":"Personal","isBilling":false,"isContact":false,"types":[{"id":1000,"name":"WhatsApp"}]},{"id":170,"clientId":2,"email":"chavoloco@homail.com","phone":"4181148783","name":"Tio","isBilling":false,"isContact":false,"types":[{"id":1003,"name":"WhatsNotifica"}]}],"attributes":[{"id":112,"clientId":2,"customAttributeId":10,"name":"Stripe Customer ID","key":"stripeCustomerId","value":"cus_PetN1dhr4rx0kX","clientZoneVisible":true},{"id":113,"clientId":2,"customAttributeId":11,"name":"Clabe Interbancaria","key":"clabeInterbancaria","value":"0021804341999569810","clientZoneVisible":true}],"accountBalance":700.99,"accountCredit":700.99,"accountOutstanding":0.0,"currencyCode":"MXN","organizationName":"SIIP Pruebas","bankAccounts":[],"tags":[{"id":2,"name":"NS EXENTO","colorBackground":"#42a3df","colorText":"#fff"}],"invitationEmailSentDate":null,"avatarColor":"#f1df43","addressGpsLat":21.1564209,"addressGpsLon":-100.9384185,"isArchived":false,"generateProformaInvoices":null,"usesProforma":false,"hasOverdueInvoice":false,"hasOutage":true,"hasSuspendedService":false,"hasServiceWithoutDevices":false,"referral":null,"hasPaymentSubscription":false,"hasAutopayCreditCard":false} // //consutar los adeudos del cliente (accountOutstanding) y ponerlo en una variable // $accountOutstanding = $responseBody['accountOutstanding']; // //Consultar el nombre completo del cliente y ponerlo en una variable // $nombreCompleto = $responseBody['firstName'] . ' ' . $responseBody['lastName']; // print_r("Nombre del cliente: " . $nombreCompleto); //Imprime el nombre del cliente // logMessage("Nombre del cliente: " . $nombreCompleto); //Imprime el nombre del cliente // //Consultar los atributos del cliente en UISP CRM y obtener el ID del cliente en Stripe // $attributes = $responseBody['attributes']; //Obtiene los atributos del cliente // $stripeCustomerId = null; //Inicializa la variable para el ID del cliente en Stripe // foreach ($attributes as $attribute) { //Recorre los atributos del cliente // if ($attribute['key'] == 'stripeCustomerId') { //Busca el atributo con la clave 'stripeCustomerId' // $stripeCustomerId = $attribute['value']; //Obtiene el valor del atributo 'stripeCustomerId' // break; //Sale del ciclo // } // } // if ($stripeCustomerId == null) { //Si no se encontró el ID del cliente en Stripe // print_r("No se encontró el ID del cliente en Stripe" . PHP_EOL); // logMessage("No se encontró el ID del cliente en Stripe" . PHP_EOL); // continue; //Continúa con el siguiente cliente // } else { // print_r("ID del cliente en Stripe: " . $stripeCustomerId); //Imprime el ID del cliente en Stripe // logMessage("ID del cliente en Stripe: " . $stripeCustomerId); //Imprime el ID del cliente en Stripe // if (cancelRequiresActionPaymentIntents($stripe, $stripeCustomerId )) { // echo "Se encontraron y cancelaron PaymentIntents en estado 'requires_action'.\n"; // logMessage("Se encontraron y cancelaron PaymentIntents en estado 'requires_action'.\n"); // } else { // echo "No se encontraron PaymentIntents en estado 'requires_action' para este cliente.\n"; // logMessage("No se encontraron PaymentIntents en estado 'requires_action' para este cliente.\n"); // } // $saldoFinal = getSaldoFinal($stripe, $stripeCustomerId, $startDate, $endDate); //Obtiene el saldo final del cliente // print_r("El saldo final es: " . $saldoFinal); //Imprime el saldo final del cliente // logMessage("El saldo final es: " . $saldoFinal); //Imprime el saldo final del cliente // if ($saldoFinal > 0) { //Si el saldo final es mayor a 0 y el adeudo es mayor a 0 o si el saldo final es mayor a 0 y el adeudo es igual a 0 // print_r("El saldo de Stripe es $$saldoFinal y los adeudos están en $$accountOutstanding, se procede a realizar un payment Intent" . PHP_EOL); //Imprime el saldo final del cliente // logMessage("El saldo de Stripe es $$saldoFinal y los adeudos están en $$accountOutstanding, se procede a realizar un payment Intent" .PHP_EOL); //Imprime el saldo final del cliente // createPaymentIntent($stripe, $saldoFinal, $stripeCustomerId, $ucrm_client_id); //Crea el PaymentIntent // } else { // print_r("El saldo de Stripe es $$saldoFinal y los adeudos están en $$accountOutstanding, no se realizará el cobro" . PHP_EOL); //Imprime el saldo final del cliente // logMessage("El saldo de Stripe es $$saldoFinal y los adeudos están en $$accountOutstanding, no se realizará el cobro".PHP_EOL); //Imprime el saldo final del cliente // } // } // } // } // fclose($gestor); // } else { // print_r("Error al abrir el archivo CSV" . PHP_EOL); // logMessage("Error al abrir el archivo CSV" . PHP_EOL, 'error'); // } // function getSaldoFinal($stripe, $customerId, $startDate, $endDate) // { // $limit = 100; // Máximo de eventos por solicitud (Stripe permite un máximo de 100) // $lastEventId = null; // Almacena el ID del último evento para la paginación // $filteredEvents = []; // Arreglo para almacenar los eventos filtrados // $saldoFinal = 0; // Inicializar el saldo final // do { // // Obtener los eventos de transacciones de saldo en efectivo, filtrando por fechas // $params = [ // 'type' => 'customer_cash_balance_transaction.created', // 'created' => [ // 'gte' => $startDate, // Mayor o igual a la fecha de inicio // 'lte' => $endDate, // Menor o igual a la fecha de fin // ], // 'limit' => $limit, // Establecer el límite de eventos por solicitud // ]; // // Si ya se ha procesado una página, agregar el parámetro de paginación // if ($lastEventId) { // $params['starting_after'] = $lastEventId; // } // // Obtener los eventos // $events = $stripe->events->all($params); // // Filtrar por customer ID y almacenar los eventos filtrados // foreach ($events->data as $event) { // $eventObject = $event->data->object; // if (isset($eventObject->customer) && $eventObject->customer === $customerId) { // $filteredEvents[] = $event; // Almacenar el evento filtrado // } // } // // Guardar el ID del último evento para la paginación // if (!empty($events->data)) { // $lastEventId = end($events->data)->id;// Obtener el último ID de evento // } // } while (!empty($events->has_more)); // Repetir mientras haya más eventos // // Ordenar los eventos filtrados por fecha de creación (más reciente primero) // usort($filteredEvents, function ($a, $b) { // return $b->created - $a->created; // Orden descendente // }); // // Obtener el evento más reciente // if (!empty($filteredEvents)) { // $mostRecentEvent = $filteredEvents[0]; // El primer evento será el más reciente // $eventObject = $mostRecentEvent->data->object; // $netAmount = abs($eventObject->net_amount); // Valor absoluto de la cantidad en centavos // $netAmountMXN = $netAmount / 100; // Convertir a pesos mexicanos // // echo "Evento ID: " . $mostRecentEvent->id . "\n"; // // echo "Tipo de Evento: " . $mostRecentEvent->type . "\n"; // // echo "Fecha del Evento: " . date('Y-m-d H:i:s', $mostRecentEvent->created) . "\n"; // // echo "Cantidad en positivo: " . $netAmountMXN . " MXN\n"; // Mostrar la cantidad positiva convertida a MXN // // echo "Saldo final: " . ($eventObject->ending_balance / 100) . " MXN\n"; // Mostrar el saldo convertido a MXN // // echo "Detalles: " . json_encode($eventObject, JSON_PRETTY_PRINT) . "\n"; // $saldoFinal = ($eventObject->ending_balance / 100); // Asignar el saldo final // } else { // echo "No se encontraron eventos para el cliente especificado dentro del periodo dado.\n"; // logMessage("No se encontraron eventos para el cliente especificado dentro del periodo dado.", 'error'); // } // return $saldoFinal; // } function createPaymentIntent($stripe, $amount, $customer_id_stripe, $clientId_CRM, $signedAdminId) { $amount = intval($amount * 100); //Conversión de la cantidad a centavos try { $paymentIntent = $stripe->paymentIntents->create([ 'amount' => $amount, //Cantidad a cobrar 'currency' => 'mxn', 'customer' => $customer_id_stripe, //ID del cliente en Stripe 'payment_method_types' => ['customer_balance'], 'payment_method_data' => ['type' => 'customer_balance'], 'confirm' => true, 'payment_method_options' => [ 'customer_balance' => [ 'funding_type' => 'bank_transfer', 'bank_transfer' => ['type' => 'mx_bank_transfer'] ], ], 'metadata' => [ 'clientId' => $clientId_CRM, // ID del cliente en UISP CRM 'createdBy' => 'UCRM', 'paymentType' => 'card.one_time', 'signedInAdminId' => $signedAdminId, // ID del administrador que realiza la operación 'tipoPago' => 'Transferencia Bancaria' ], ]); print_r("PaymentIntent creado: " . $paymentIntent->id . PHP_EOL); //Imprime el ID del PaymentIntent creado logMessage("PaymentIntent creado: " . $paymentIntent->id); //Imprime el ID del PaymentIntent creado print_r("Status: " . $paymentIntent->status . PHP_EOL); //Imprime el estatus del PaymentIntent creado logMessage("Status: " . $paymentIntent->status); //Imprime el estatus del PaymentIntent creado print_r("Amount: " . $paymentIntent->amount . PHP_EOL); //Imprime el monto del PaymentIntent creado logMessage("Amount: " . $paymentIntent->amount); //Imprime el monto del PaymentIntent creado print_r("Currency: " . $paymentIntent->currency . PHP_EOL); //Imprime la moneda del PaymentIntent creado logMessage("Currency: " . $paymentIntent->currency); //Imprime la moneda del PaymentIntent creado print_r("Customer: " . $paymentIntent->customer . PHP_EOL); //Imprime el ID del cliente del PaymentIntent creado logMessage("Customer: " . $paymentIntent->customer); //Imprime el ID del cliente del PaymentIntent creado print_r("Payment Method: " . $paymentIntent->payment_method . PHP_EOL); //Imprime el ID del método de pago del PaymentIntent creado logMessage("Payment Method: " . $paymentIntent->payment_method); //Imprime el ID del método de pago del PaymentIntent creado print_r("Payment Method Type: " . $paymentIntent->payment_method_types[0] . PHP_EOL); //Imprime el tipo de método de pago del PaymentIntent creado logMessage("Payment Method Type: " . $paymentIntent->payment_method_types[0]); //Imprime el tipo de método de pago del PaymentIntent creado } catch (\Stripe\Exception\ApiErrorException $e) { print_r("Error creando PaymentIntent: " . $e->getMessage() . PHP_EOL); logMessage("Error creando PaymentIntent: " . $e->getMessage() . PHP_EOL, 'error'); } } // function createOxxoPaymentIntent($event_json, $amount = null): array // { // //declarar un array asociativo de strings pero no asignarle nada aun // $arrayOxxoPayment = array(); // $integerAmount = $amount; // print_r("Creando referencia del cliente para OXXO: " . PHP_EOL); // $configManager = PluginConfigManager::create(); // $config = $configManager->loadConfig(); // $StripeToken = $config['tokenstripe']; // $IPServer = $config['ipserver']; // $tokenCRM = $config['apitoken']; // $baseUri = 'https://' . $IPServer . '/crm/api/v1.0/'; // $ucrmApi = UcrmApi::create(); // $currentUserAdmin = $ucrmApi->get('users/admins', []); // $clientID = $event_json['client_id']; // $stripeCustomerId = null; // $clientEmail = ''; // $clientFullName = ''; // $clientGuzzleHttp = new Client([ // 'base_uri' => $baseUri, // 'headers' => [ // 'X-Auth-App-Key' => $tokenCRM, // 'Accept' => 'application/json', // ], // 'verify' => false, // 'timeout' => 5, // Timeout de 5 segundos // ]); // try { // $response = $clientGuzzleHttp->request('GET', "clients/" . $clientID); // $arrayClientCRM = json_decode($response->getBody()->getContents(), true); // //$this->logger->info("Valor de arrayClientCRM: " . print_r($arrayClientCRM, true) . PHP_EOL); // $clientFullName = $arrayClientCRM['firstName'] . ' ' . $arrayClientCRM['lastName']; // } catch (RequestException $e) { // if ($e->getCode() === 404) { // print_r("Cliente no encontrado en CRM: " . $clientID . PHP_EOL); // //devolver un array con los campos del codigo error, descripción de la falla, clientID, clientFullName y amount // $arrayOxxoPayment['oxxo_reference'] = ''; // $arrayOxxoPayment['url'] = ''; // $arrayOxxoPayment['error'] = 'errorGetClientNotFound'; // $arrayOxxoPayment['failDescription'] = 'Cliente no encontrado en CRM: ' . $clientID; // $arrayOxxoPayment['clientID'] = $clientID; // $arrayOxxoPayment['clientFullName'] = $clientFullName; // $arrayOxxoPayment['amount'] = $integerAmount; // $arrayOxxoPayment['voucher_image_url'] = ''; // return $arrayOxxoPayment; // } // //timeout // if ($e->getCode() === 408) { // print_r("Timeout al obtener el cliente en CRM: " . $clientID . PHP_EOL); // //devolver un array con los campos del codigo error, descripción de la falla, clientID y amount // $arrayOxxoPayment['oxxo_reference'] = ''; // $arrayOxxoPayment['url'] = ''; // $arrayOxxoPayment['error'] = 'errorTimeoutGetClient'; // $arrayOxxoPayment['failDescription'] = 'Timeout al obtener el cliente en CRM: ' . $clientID; // $arrayOxxoPayment['clientID'] = $clientID; // $arrayOxxoPayment['clientFullName'] = $clientFullName; // $arrayOxxoPayment['amount'] = $integerAmount; // $arrayOxxoPayment['voucher_image_url'] = ''; // return $arrayOxxoPayment; // } // print_r("Error al obtener el cliente en CRM (Error {$e->getCode()}): " . $e->getMessage() . PHP_EOL); // //devolver un array con los campos del codigo error, descripción de la falla, clientID y amount // $arrayOxxoPayment['oxxo_reference'] = ''; // $arrayOxxoPayment['url'] = ''; // $arrayOxxoPayment['error'] = 'errorGetClient'; // $arrayOxxoPayment['failDescription'] = 'Error al obtener el cliente en CRM: ' . $clientID; // $arrayOxxoPayment['clientID'] = $clientID; // $arrayOxxoPayment['clientFullName'] = $clientFullName; // $arrayOxxoPayment['amount'] = $integerAmount; // $arrayOxxoPayment['voucher_image_url'] = ''; // return $arrayOxxoPayment; // } // // Obtener email del cliente // foreach ($arrayClientCRM['contacts'] as $contact) { // if (!empty($contact['email'])) { // $clientEmail = $contact['email']; // break; // } else { // $clientEmail = 'siip8873@gmail.com'; // Default // } // } // try { // // Obtener stripeCustomerId // foreach ($arrayClientCRM['attributes'] as $attribute) { // if ($attribute['key'] === 'stripeCustomerId') { // $stripeCustomerId = $attribute['value']; // break; // } // } // print_r("Stripe Customer ID obtenido: " . $stripeCustomerId . PHP_EOL); // } catch (Exception $e) { // print_r("Error al obtener el Customer ID de Stripe (Error {$e->getCode()}): " . $e->getMessage() . PHP_EOL); // //devolver un array con los campos del codigo error, descripción de la falla, clientID y amount // $arrayOxxoPayment['oxxo_reference'] = ''; // $arrayOxxoPayment['error'] = 'errorGetCustomerStripe'; // $arrayOxxoPayment['failDescription'] = 'Error al obtener el Customer ID de Stripe: ' . $clientID; // $arrayOxxoPayment['clientID'] = $clientID; // $arrayOxxoPayment['clientFullName'] = $clientFullName; // $arrayOxxoPayment['amount'] = $integerAmount; // $arrayOxxoPayment['voucher_image_url'] = ''; // return $arrayOxxoPayment; // } // if ($amount === null) { // $amount = abs($arrayClientCRM['accountOutstanding']); //Monto adeudado del cliente // } else { // print_r("Monto proporcionado directamente: $amount " . PHP_EOL); // } // if ($amount > 10) { // $amountInCents = intval($amount * 100); // Convertir a centavos // try { // print_r("Creando referencia en Stripe por $amount para el cliente $stripeCustomerId" . PHP_EOL); // $guzzleClient = new Client([ // 'timeout' => 5, // Timeout de 5 segundos // ]); // $response = $guzzleClient->post('https://api.stripe.com/v1/payment_intents', [ // 'auth' => [$StripeToken, ''], // 'form_params' => [ // 'amount' => $amountInCents, // 'currency' => 'mxn', // 'payment_method_types' => ['customer_balance', 'card', 'oxxo'], // 'description' => 'Pago de servicio de SIIP Internet', // 'customer' => $stripeCustomerId, // 'metadata' => [ // 'clientId' => $clientID, // 'createdBy' => 'UCRM', // 'paymentType' => 'card.one_time', // 'signedInAdminId' => $currentUserAdmin[1]['id'], // 'tipoPago' => 'OXXO', // ], // 'payment_method_options' => [ // 'oxxo' => [ // 'expires_after_days' => 3, // ], // ], // ] // ]); // $paymentIntent = json_decode($response->getBody()->getContents(), true); // } catch (\Stripe\Exception\ApiConnectionException $e) { // print_r("Error de conexión con Stripe (Error {$e->getCode()}): " . $e->getMessage() . PHP_EOL); // //devolver un array con los campos del codigo error, descripción de la falla, clientID y amount // $arrayOxxoPayment['oxxo_reference'] = ''; // $arrayOxxoPayment['url'] = ''; // $arrayOxxoPayment['error'] = 'errorConnectionStripe'; // $arrayOxxoPayment['failDescription'] = 'Error de conexión con Stripe: ' . $clientID; // $arrayOxxoPayment['clientID'] = $clientID; // $arrayOxxoPayment['clientFullName'] = $clientFullName; // $arrayOxxoPayment['amount'] = $amount; // $arrayOxxoPayment['voucher_image_url'] = ''; // return $arrayOxxoPayment; // } catch (\Stripe\Exception\ApiErrorException $e) { // print_r("Error de la API de Stripe: " . $e->getMessage() . PHP_EOL); // //devolver un array con los campos del codigo error, descripción de la falla, clientID y amount // $arrayOxxoPayment['oxxo_reference'] = ''; // $arrayOxxoPayment['url'] = ''; // $arrayOxxoPayment['error'] = 'errorApiStripe'; // $arrayOxxoPayment['failDescription'] = 'Error de la API de Stripe: ' . $clientID; // $arrayOxxoPayment['clientID'] = $clientID; // $arrayOxxoPayment['clientFullName'] = $clientFullName; // $arrayOxxoPayment['amount'] = $amount; // $arrayOxxoPayment['voucher_image_url'] = ''; // return $arrayOxxoPayment; // } catch (Exception $e) { // print_r("Error inesperado al crear PaymentIntent (Error {$e->getCode()}): " . $e->getMessage() . PHP_EOL); // //si e->getMessage incluye el mensaje: You must provide a customer when creating or updating a PaymentIntent with a `customer_ba (truncated...) declarar una variable y ahi poner "Este cliente no tiene cuenta de Stripe" // if ($e->getMessage() == 'You must provide a customer when creating or updating a PaymentIntent with a `customer_ba (truncated...)') { // print_r("Este cliente no tiene cuenta de Stripe" . PHP_EOL); // $arrayOxxoPayment['failDescription'] = 'Este cliente no tiene cuenta de Stripe: ' . $clientID; // } else { // print_r("Este cliente no tiene cuenta de Stripe" . PHP_EOL); // print_r("Error inesperado al crear PaymentIntent: " . $e->getMessage() . PHP_EOL); // $arrayOxxoPayment['failDescription'] = 'Error inesperado al crear PaymentIntent: ' . $clientID; // } // //devolver un array con los campos del codigo error, descripción de la falla, clientID y amount // $arrayOxxoPayment['oxxo_reference'] = ''; // $arrayOxxoPayment['url'] = ''; // $arrayOxxoPayment['error'] = 'errorCreatePaymentIntent'; // $arrayOxxoPayment['clientID'] = $clientID; // $arrayOxxoPayment['clientFullName'] = $clientFullName; // $arrayOxxoPayment['amount'] = $amount; // $arrayOxxoPayment['voucher_image_url'] = ''; // return $arrayOxxoPayment; // } // try { // $firstName = isset($arrayClientCRM['firstName']) ? trim($arrayClientCRM['firstName']) : ''; // $lastName = isset($arrayClientCRM['lastName']) ? trim($arrayClientCRM['lastName']) : ''; // if (strlen($firstName) < 2 || strlen($lastName) < 2) { // print_r("Este cliente no tiene cuenta de Stripe" . PHP_EOL); // ("Nombre/apellido inválido: ' . $firstName . ' ' . $lastName" . PHP_EOL); // //devolver un array con los campos del codigo error, descripción de la falla, clientID y amount // $arrayOxxoPayment['oxxo_reference'] = ''; // $arrayOxxoPayment['url'] = ''; // $arrayOxxoPayment['error'] = 'errorNombreApellidoInvalido'; // $arrayOxxoPayment['failDescription'] = "Nombre/apellido inválido: ' . $firstName . ' ' . $lastName"; // $arrayOxxoPayment['clientID'] = $clientID; // $arrayOxxoPayment['clientFullName'] = $clientFullName; // $arrayOxxoPayment['amount'] = $amount; // $arrayOxxoPayment['voucher_image_url'] = ''; // return $arrayOxxoPayment; // } // $responsePaymentMethod = $guzzleClient->post('https://api.stripe.com/v1/payment_methods', [ // 'auth' => [$StripeToken, ''], // 'form_params' => [ // 'type' => 'oxxo', // 'billing_details' => [ // 'name' => "$firstName $lastName", // 'email' => $clientEmail, // ], // ] // ]); // $paymentMethod = json_decode($responsePaymentMethod->getBody()->getContents(), true); // $responseConfirmPaymentIntent = $guzzleClient->post('https://api.stripe.com/v1/payment_intents/' . $paymentIntent['id'] . '/confirm', [ // 'auth' => [$StripeToken, ''], // 'form_params' => [ // 'payment_method' => $paymentMethod['id'], // ] // ]); // $paymentIntentConfirm = json_decode($responseConfirmPaymentIntent->getBody()->getContents(), true); // } catch (Exception $e) { // print_r("Error al confirmar PaymentIntent: " . $e->getMessage() . PHP_EOL); // //devolver un array con los campos del codigo error, descripción de la falla, clientID y amount // $arrayOxxoPayment['oxxo_reference'] = ''; // $arrayOxxoPayment['url'] = ''; // $arrayOxxoPayment['error'] = 'errorConfirmPaymentIntent'; // $arrayOxxoPayment['failDescription'] = 'Error al confirmar PaymentIntent: ' . $e->getMessage(); // $arrayOxxoPayment['clientID'] = $clientID; // $arrayOxxoPayment['clientFullName'] = $clientFullName; // $arrayOxxoPayment['amount'] = $amount; // $arrayOxxoPayment['voucher_image_url'] = ''; // return $arrayOxxoPayment; // } // if (!empty($paymentIntentConfirm['next_action']) && isset($paymentIntentConfirm['next_action']['oxxo_display_details'])) { // $oxxoPayment = $paymentIntentConfirm['next_action']['oxxo_display_details']; // $oxxo_reference = $oxxoPayment['number']; // $oxxo_receipt_url = $oxxoPayment['hosted_voucher_url']; // print_r("Referencia OXXO: " . $oxxo_reference . PHP_EOL); // print_r("URL del recibo: " . $oxxo_receipt_url . PHP_EOL); // //$this->captureScreenshot($oxxo_receipt_url); // //devolver un array con los campos de url de oxxo, descripción de la falla, clientID y amount // $arrayOxxoPayment['oxxo_reference'] = $oxxo_reference; // $arrayOxxoPayment['url'] = $oxxo_receipt_url; // $arrayOxxoPayment['error'] = ''; // $arrayOxxoPayment['failDescription'] = ''; // $arrayOxxoPayment['clientID'] = $clientID; // $arrayOxxoPayment['clientFullName'] = $clientFullName; // $arrayOxxoPayment['amount'] = $amount; // print_r("Referencia OXXO creada correctamente." . PHP_EOL); // return $arrayOxxoPayment; // } else { // print_r("El PaymentIntent no tiene detalles de OXXO disponibles. Estado: " . $paymentIntentConfirm['status'] . PHP_EOL); // //devolver un array con los campos del codigo error, descripción de la falla, clientID y amount // $arrayOxxoPayment['oxxo_reference'] = ''; // $arrayOxxoPayment['url'] = ''; // $arrayOxxoPayment['error'] = 'errorPaymentIntentWithoutOxxoDetails'; // $arrayOxxoPayment['failDescription'] = 'El PaymentIntent no tiene detalles de OXXO disponibles. Estado: ' . $paymentIntentConfirm['status']; // $arrayOxxoPayment['clientID'] = $clientID; // $arrayOxxoPayment['clientFullName'] = $clientFullName; // $arrayOxxoPayment['amount'] = $amount; // $arrayOxxoPayment['voucher_image_url'] = ''; // return $arrayOxxoPayment; // } // } else { // print_r("Este cliente no tiene adeudos." . PHP_EOL); // //devolver un array con los campos del codigo error, descripción de la falla, clientID y amount // $arrayOxxoPayment['oxxo_reference'] = ''; // $arrayOxxoPayment['url'] = ''; // $arrayOxxoPayment['error'] = 'errorsinadeudo'; // $arrayOxxoPayment['failDescription'] = 'Este cliente no tiene adeudos.'; // $arrayOxxoPayment['clientID'] = $clientID; // $arrayOxxoPayment['clientFullName'] = $clientFullName; // $arrayOxxoPayment['amount'] = $amount; // $arrayOxxoPayment['voucher_image_url'] = ''; // return $arrayOxxoPayment; // } // } // /** // * Cancela todos los PaymentIntents en estado 'requires_action' para un cliente específico. // * // * @param \Stripe\StripeClient $stripe Instancia de StripeClient // * @param string $customerId ID del cliente en Stripe // * @return bool True si se encontraron y cancelaron PaymentIntents, False si no hay ninguno en estado 'requires_action' // */ // function cancelRequiresActionPaymentIntents($stripe, $customerId) // { // try { // // Listar todos los PaymentIntents del cliente // $paymentIntents = $stripe->paymentIntents->all([ // 'customer' => $customerId, // 'limit' => 100, // Número máximo de resultados por página // ]); // $foundAndCanceled = false; // foreach ($paymentIntents->data as $intent) { // // Verificar si el estado es 'requires_action' // if ($intent->status === 'requires_action') { // // Cancelar el PaymentIntent // $stripe->paymentIntents->cancel($intent->id); // $foundAndCanceled = true; // } // } // // Manejar paginación si hay más de 100 PaymentIntents // while ($paymentIntents->has_more) { // $lastIntentId = end($paymentIntents->data)->id; // $paymentIntents = $stripe->paymentIntents->all([ // 'customer' => $customerId, // 'limit' => 100, // 'starting_after' => $lastIntentId, // ]); // foreach ($paymentIntents->data as $intent) { // if ($intent->status === 'requires_action') { // $stripe->paymentIntents->cancel($intent->id); // $foundAndCanceled = true; // } // } // } // return $foundAndCanceled; // } catch (\Stripe\Exception\ApiErrorException $e) { // // Manejo de errores // error_log('Error al procesar PaymentIntents: ' . $e->getMessage()); // return false; // } // } function logMessage($message, $type = 'info') { $logFile = __DIR__ . '/payment_intents.log'; $dateTime = new DateTime('now', new DateTimeZone('America/Mexico_City')); $formattedDateTime = $dateTime->format('Y-m-d H:i:s'); file_put_contents($logFile, "[$formattedDateTime] [$type] $message" . PHP_EOL, FILE_APPEND); }