From afbac9df2cb390679344350a919ad588d05fd0db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Le=CC=81o?= Date: Tue, 30 Jun 2026 19:08:06 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20corrige=20la=20race=20condition=20OAuth2?= =?UTF-8?q?=20et=20la=20validation=20des=20caract=C3=A8res=20sp=C3=A9ciaux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - process_payment() ne refresh le token que si absent ou expiré, évitant la rotation concurrente du refresh token sous charge (boucle 401) - les erreurs API (wp_error, non-200, réponse sans redirectUrl) retournent désormais un échec WooCommerce propre au lieu de continuer l'exécution - corrige la regex validate_fields() : '![...]' → '[^...]' pour bloquer correctement les points, @, _ et autres caractères rejetés par l'API --- inc/Gateway/WC_HelloAsso_Gateway.php | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/inc/Gateway/WC_HelloAsso_Gateway.php b/inc/Gateway/WC_HelloAsso_Gateway.php index 02e48de..2eb2c15 100644 --- a/inc/Gateway/WC_HelloAsso_Gateway.php +++ b/inc/Gateway/WC_HelloAsso_Gateway.php @@ -491,12 +491,12 @@ public function validate_fields() return false; } - if (preg_match('/![a-zA-ZéèêëáàâäúùûüçÇ\'-]/', $firstName)) { + if (preg_match('/[^a-zA-ZéèêëáàâäúùûüçÇ\' -]/', $firstName)) { wc_add_notice('Le prénom ne doit pas contenir de caractères spéciaux ni de caractères n\'appartenant pas à l\'alphabet latin', 'error'); return false; } - if (preg_match('/![a-zA-ZéèêëáàâäúùûüçÇ\'-]/', $lastName)) { + if (preg_match('/[^a-zA-ZéèêëáàâäúùûüçÇ\' -]/', $lastName)) { wc_add_notice('Le nom ne doit pas contenir de caractères spéciaux ni de caractères n\'appartenant pas à l\'alphabet latin', 'error'); return false; } @@ -522,7 +522,12 @@ public function process_payment($order_id) 'payment_method' => 'helloasso' )); - helloasso_refresh_token_asso(); + $tokenExpires = get_option('helloasso_token_expires_in_asso'); + $accessToken = get_option('helloasso_access_token_asso'); + if (!$accessToken || !$tokenExpires || time() >= (int) $tokenExpires) { + helloasso_refresh_token_asso(); + } + $order = wc_get_order($order_id); if (!$order) { @@ -828,7 +833,8 @@ public function process_payment($order_id) 'error' => $response->get_error_message(), 'error_code' => $response->get_error_code() )); - echo 'Erreur : ' . esc_html($response->get_error_message()); + wc_add_notice('Une erreur est survenue lors de la connexion à HelloAsso. Veuillez réessayer.', 'error'); + return array('result' => 'failure'); } $response_body = wp_remote_retrieve_body($response); @@ -846,6 +852,8 @@ public function process_payment($order_id) 'response_code' => $response_code, 'response_body' => $response_body )); + wc_add_notice('Une erreur est survenue lors de la création du paiement HelloAsso (code ' . $response_code . '). Veuillez réessayer.', 'error'); + return array('result' => 'failure'); } $response_data = json_decode($response_body); @@ -856,6 +864,8 @@ public function process_payment($order_id) 'response_body' => $response_body, 'response_code' => $response_code )); + wc_add_notice('Réponse inattendue de HelloAsso. Veuillez réessayer.', 'error'); + return array('result' => 'failure'); } helloasso_log_info('Paiement traité avec succès', array(