435 Avenue du Pylône
06600 Antibes
07 63 86 87 10

435 Avenue du Pylône - 06600 Antibes

Déclararion de confidentialité

Cette déclaration de confidentialité a été mise à jour le 09/10/2024 et s’applique aux citoyens et aux résidents permanents légaux de l’Espace économique européen et de la Suisse.

Dans cette déclaration de confidentialité, nous expliquons ce que nous faisons avec les données que nous obtenons à votre sujet via https://www.warriorpaintball.fr. Nous vous recommandons de lire attentivement cette déclaration. Lors de notre traitement, nous nous conformons aux exigences de la législation sur la confidentialité. Cela signifie, entre autres, que :

  • nous indiquons clairement dans quelles finalités nous traitons les données personnelles. Nous faisons cela au moyen de cette déclaration de confidentialité ;
  • nous visons à limiter notre recueil de données personnelles uniquement aux données personnelles nécessaires à des finalités légitimes;
  • nous demandons d’abord votre consentement explicite pour traiter vos données personnelles dans les cas nécessitant votre consentement;
  • nous prenons des mesures de sécurité appropriées afin de protéger vos données personnelles, et nous en demandons autant des parties traitant des données personnelles pour nous;
  • nous respectons votre droit de consulter, corriger ou supprimer vos données personnelles si vous en formulez la demande.

Si vous avez des questions ou souhaitez savoir exactement quelles données nous conservons, veuillez nous contacter.

1. Finalité, données et durée de conservation

Nous pouvons collecter ou recevoir des informations personnelles pour un certain nombre de raisons liées à nos activités commerciales, notamment les suivantes : (cliquez pour déplier)

2. Cookies

Notre site web utilise des cookies. Pour plus d’informations sur les cookies, veuillez vous référer à notre Politique de cookies

3. Pratiques de divulgation

Nous divulguons des informations personnelles si nous y sommes tenus par la loi ou par une ordonnance du tribunal, en réponse à un organisme d’application de la loi, dans la mesure permise par d’autres dispositions de la loi, pour fournir des informations, ou pour une enquête sur une question liée à la sécurité publique.

Si notre site web ou notre organisation est repris, vendu ou impliqué dans une fusion ou une acquisition, vos données peuvent être divulguées à nos conseillers et à tout acheteur potentiel et seront transmises aux nouveaux propriétaires.

Nous avons conclu un accord de traitement des données avec Google.

4. Sécurité

Nous nous engageons à la sécurité des données personnelles. Nous prenons les mesures de sécurité appropriées pour limiter les abus et l’accès non autorisé aux données personnelles. Cela garantit que seules les personnes nécessaires ont accès à vos données, que l’accès aux données est protégé et que nos mesures de sécurité sont régulièrement revues.

5. Sites web tierces parties

Cette déclaration de confidentialité ne s’applique pas aux sites web de tierces parties connectés par des liens sur notre site web. Nous ne pouvons garantir que ces tierces parties gèrent vos données personnelles de manière fiable ou sécurisée. Nous vous recommandons de lire les déclarations de confidentialité de ces sites web avant de les utiliser.

6. Modifications apportées à cette déclaration de confidentialité

Nous nous réservons le droit de modifier la présente déclaration de confidentialité. Il est recommandé de consulter régulièrement cette déclaration de confidentialité afin de prendre connaissance de toute modification éventuelle. De plus, nous vous informerons activement dans la mesure du possible.

7. Accéder à vos données et les modifier

Si vous avez des questions ou souhaitez savoir quelles sont les données personnelles que nous avons à votre sujet, veuillez nous contacter. Vous pouvez nous contacter en utilisant les informations ci-dessous. Vous avez les droits suivants:

  • Vous avez le droit de savoir pourquoi vos données personnelles sont nécessaires, ce qui leur arrivera et combien de temps elles seront conservées.
  • Droit d’accès : vous avez le droit d’accéder à vos données personnelles que nous connaissons.
  • Droit de rectification : vous avez le droit à tout moment de compléter, corriger, faire supprimer ou bloquer vos données personnelles.
  • Si vous nous donnez votre consentement pour le traitement de vos données, vous avez le droit de révoquer ce consentement et de faire supprimer vos données personnelles.
  • Droit de transférer vos données : vous avez le droit de demander toutes vos données personnelles au responsable du traitement et de les transférer dans leur intégralité à un autre responsable du traitement.
  • Droit d’opposition : vous pouvez vous opposer au traitement de vos données. Nous obtempérerons, à moins que certaines raisons ne justifient ce traitement.

Assurez-vous de toujours indiquer clairement qui vous êtes, afin que nous puissions être certains de ne pas modifier ni supprimer les données de la mauvaise personne.

8. Déposer une plainte

Si vous n’êtes pas satisfait de la manière dont nous traitons (une réclamation concernant) le traitement de vos données personnelles, vous avez le droit de déposer une réclamation auprès de l’autorité de protection des données.

9. Coordonnées

ANGIE SAS
435 avenue du pylône
06600 ANTIBES
France
Site web : https://www.warriorpaintball.fr
E-mail : contact@warriorpaintball.fr
Phone number: 0763868710

10. Demandes de données

Pour les demandes les plus fréquentes, nous vous offrons également la possibilité d’utiliser notre formulaire de demande de données.

×

Contacter Warrior PaintBall Antibes

En soumettant ce formulaire vous acceptez que WarriorPaintBall Antibes, en sa qualité de responsable de traitement, collecte vos données afin de pouvoir répondre à votre message. Pour connaitre et exercer vos droits , notamment de retrait de votre consentement à l’utilisation de données collectées par ce formulaire, veuillez consulter notre politique  de  confidentialité

Vous avez désormais la possibilité de vos restaurez sur place. Si toutefois vous êtes un groupe nous vous recommandons de nous le mentionner dans la réservation afin de faciliter la préparation pour le jour J. Il est toujours possible de ramener votre propre picnic.

Les packs avec gâteaux incluent bonbons et boissons.
Nous nous occuperons des assiettes, couverts et serviettes que si nous gérons le gâteau et des gobelets que si nous gérons les boissons.
Vous pouvez emporter des éléments supplémentaires ou de la décoration sans aucun problème.

Nous vous conseillons de rajouter des options pour rendre l’activité encore plus immersive.
Les fumigènes sont exceptionnels pour les parties comme la capture du drapeau ou la prise de position.

Pour les groupes de + de 10 personnes ou + de 20 personnes vous bénéficiez de billes offertes ou de réductions.
D’avril à Octobre découvrez le pack combo Paintball et Ninja Warrior Antibes.

Nous sélectionnons toujours le type de lanceur en fonction de l’âge du plus jeune joueur du groupe.

Vous souhaitez jouer au paintball ou organiser un événement particulier ?
Sélectionnez un évènement …

Traitement en cours...

Veuillez patienter nous interrogeons votre banque

Paiement non abouti

Détails de l'erreur : Chargement...

Informations incomplètes

Sélectionnez un Pack

Pour voir les options

Sélectionnez un lanceur

Pour voir les tarifs

Sélectionnez un évènement

Pour voir les lanceurs

Offrez l'Aventure
Bon Cadeau
Warrior Paintball

À la recherche du cadeau parfait ?

Surprenez vos proches avec une séance de paintball, chargée d’adrénaline et de stratégie !
Idéal pour les anniversaires, les occasions spéciales ou juste pour le plaisir.

Un moment inoubliable garanti !

Bon cadeau validé

Félicitations ! Votre bon cadeau a été créé avec succès.
Nous avons envoyé une copie du bon à votre adresse email ainsi qu’à celle du bénéficiaire. Le bon peut être utilisé selon les préférences du destinataire.

Nous sommes impatients d’accueillir le bénéficiaire et restons à votre disposition pour toute question ou information complémentaire.
N’hésitez pas à nous contacter.

[pdfjs-viewer url="https://www.warriorpaintball.fr/wp-content/uploads/2022/08/Anniversaire-Paintball.pdf?ver=1715153916"]
[pdfjs-viewer url="https://www.warriorpaintball.fr/wp-content/uploads/2022/08/Anniversaire-Paintball.pdf?ver=1715153916"]
[pdfjs-viewer url="https://www.warriorpaintball.fr/wp-content/uploads/2022/08/Anniversaire-Paintball.pdf?ver=1715153916"]

Lanceur

INCLUS

Billes

INCLUS

Masque

INCLUS

Plastron

INCLUS

Combinaison

INCLUS

Gants

OPTION

Protège cou

OPTION

Fumigène

OPTION

Nourriture et boissons

OPTION

Espace de réception

À DISPOSITION

gotcha

De 7 à 9 ans

Le Gotcha est le plus simple et le plus adapté aux jeunes joueurs de paintball. Plus lent à utiliser car il doit être manuellement recharger il s’apparente à un fusil à pompe et sûr pour les enfants de 7 ans et plus.
Ergonomie
Puissance
Cadence

Précision

De 10 à 17 ans

Ce lanceur semi-automatique de calibre .50 est une excellente option pour les débutants et les adolescents. Son mécanisme permet une fluidité de tir et une stabilité sans pareil. Léger et équilibré, le Précision est l’allié des joueurs recherchant la perfection sur le terrain.
Ergonomie
Puissance
Cadence

BT4 Combat

À partir de 15 ans

Le Lanceur Combat est le compagnon idéal pour les amateurs d’action qui cherchent un équipement fiable et puissant. Le BT4 est le tank du paintball, conçu pour ceux qui aiment être en première ligne. Robuste et fiable, il peut résister aux conditions les plus difficiles
Ergonomie
Puissance
Cadence

Emek

À partir de 16 ans

L’Emek est une combinaison parfaite adaptée à tous les styles de jeu grâce à son système de tir pneumatique offrant une précision et une cadence de tir incroyablement efficaces et extrêmement fiables.
Ergonomie
Puissance
Cadence
logo noir warrior paintball antibes

ANGIE
435  avenue du Pylône
06600 ANTIBES

Quantité

Description

PU HT

Montant HT

Fumigène(s)

Déguisement(s)

Coupes et médailles

Photos et vidéos

Remise exceptionnelle (-10%)

Total HT

TVA (20%)

TVA (10 %)

Total TTC

Angie SAS
RCS Antibes 883 659 518
N° de TVA Intracommunautaire FR91883659518

Réservation Enregistrée

Votre réservation est enregistrée, vous allez recevoir dans votre email la confirmation de votre réservation et un rappel du rendez-vous avec les détails de votre réservation.

Nous sommes ravis de vous accueillir !
Si vous avez la moindre question ou besoin de plus d’infos, n’hésitez surtout pas à nous contacter.

Temps et terrains
temps de parcours et map warrior paintball antibes

Lanceur

INCLUS

Billes

INCLUS

Masque

INCLUS

Plastron

INCLUS

Combinaison

INCLUS

Gants

OPTION

Protège cou

OPTION

Fumigène

OPTION

Nourriture et boissons

OPTION

Espace de réception

À DISPOSITION

gotcha

De 7 à 9 ans

Le Gotcha est le plus simple et le plus adapté aux jeunes joueurs de paintball. Plus lent à utiliser car il doit être manuellement recharger il s’apparente à un fusil à pompe et sûr pour les enfants de 7 ans et plus.
Ergonomie
Puissance
Cadence
Description

Précision

De 10 à 17 ans

Ce lanceur semi-automatique de calibre .50 est une excellente option pour les débutants et les adolescents. Son mécanisme permet une fluidité de tir et une stabilité sans pareil. Léger et équilibré, le Précision est l’allié des joueurs recherchant la perfection sur le terrain.
Ergonomie
Puissance
Cadence

Lanceur

INCLUS

Billes

INCLUS

Masque

INCLUS

Plastron

INCLUS

Combinaison

INCLUS

Gants

OPTION

Protège cou

OPTION

Fumigène

OPTION

Nourriture et boissons

OPTION

Espace de réception

À DISPOSITION

temps de parcours et map warrior paintball antibes
Description

BT4 Combat

À partir de 15 ans

Le Lanceur Combat est le compagnon idéal pour les amateurs d’action qui cherchent un équipement fiable et puissant. Le BT4 est le tank du paintball, conçu pour ceux qui aiment être en première ligne. Robuste et fiable, il peut résister aux conditions les plus difficiles
Ergonomie
Puissance
Cadence

Lanceur

INCLUS

Billes

INCLUS

Masque

INCLUS

Plastron

INCLUS

Combinaison

INCLUS

Gants

OPTION

Protège cou

OPTION

Fumigène

OPTION

Nourriture et boissons

OPTION

Espace de réception

À DISPOSITION

temps de parcours et map warrior paintball antibes
Description

Emek

À partir de 16 ans

L’Emek est une combinaison parfaite adaptée à tous les styles de jeu grâce à son système de tir pneumatique offrant une précision et une cadence de tir incroyablement efficaces et extrêmement fiables.
Ergonomie
Puissance
Cadence

Lanceur

INCLUS

Billes

INCLUS

Masque

INCLUS

Plastron

INCLUS

Combinaison

INCLUS

Gants

OPTION

Protège cou

OPTION

Fumigène

OPTION

Nourriture et boissons

OPTION

Espace de réception

À DISPOSITION

temps de parcours et map warrior paintball antibes
// ==================================================== // PIOTNET STRIPE - GESTION UX PAIEMENT - v3.2.0 // Fix : réutilisation transaction_id si paiement non abouti // Fix : détection bloqueur popup + statut ABANDONED // ==================================================== document.addEventListener('DOMContentLoaded', function () { console.log('[PIOTNET-STRIPE] Initialisation v3.2.0'); (function () { 'use strict'; /* ============================ * CONFIGURATION * ============================ */ const THEME_CONFIG = { buttonColor: '#C97064', overlayOpacity: 0.8 }; const CONFIG = { ERROR_CHECK_INTERVAL: 500, MAX_WAIT_TIME: 45000, // Délai adaptatif mobile/desktop LOADING_DELAY: /Mobi|Android/i.test(navigator.userAgent) ? 800 : 350, DEBUG_MODE: true, SERVER_LOGGING: true, LOG_ENDPOINT: '/wp-admin/admin-ajax.php?action=stripe_payment_log', // ✅ v3.2.0 : Clé sessionStorage pour persister l'ID de transaction SESSION_TXN_KEY: 'stripe_pending_txn_id', SESSION_TXN_EMAIL_KEY: 'stripe_pending_txn_email' }; window.PIOTNET_CONFIG = CONFIG; /* ============================ * ÉTAT GLOBAL * ============================ */ let errorCheckInterval = null; let timeoutTimer = null; let isMonitoring = false; let isProcessingPayment = false; let currentTransactionId = null; function debugLog(msg, data = null) { if (CONFIG.DEBUG_MODE) console.log('[PAYMENT-UX]', msg, data ?? ''); } /* ============================ * GESTION DU TRANSACTION ID ← NOUVEAU v3.2.0 * * Principe : si un paiement a été tenté (clic) mais n'a jamais abouti * (pas de succès, pas d'erreur confirmée), on RÉUTILISE le même ID * pour le prochain clic au lieu d'en générer un nouveau. * Cela regroupe les multiples clics dus au bloqueur de popup en * une seule transaction dans le dashboard. * ============================ */ function getOrCreateTransactionId(email) { const existingId = sessionStorage.getItem(CONFIG.SESSION_TXN_KEY); const existingEmail = sessionStorage.getItem(CONFIG.SESSION_TXN_EMAIL_KEY); // Réutiliser si même email et transaction pas encore conclue if (existingId && existingEmail === email) { debugLog('♻️ Réutilisation du transaction_id existant (popup bloquée probable):', existingId); return existingId; } // Nouveau ID const newId = 'txn_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9); sessionStorage.setItem(CONFIG.SESSION_TXN_KEY, newId); sessionStorage.setItem(CONFIG.SESSION_TXN_EMAIL_KEY, email || ''); debugLog('🆔 Nouveau transaction_id généré:', newId); return newId; } function clearTransactionId() { sessionStorage.removeItem(CONFIG.SESSION_TXN_KEY); sessionStorage.removeItem(CONFIG.SESSION_TXN_EMAIL_KEY); debugLog('🗑️ Transaction ID effacé (paiement conclu)'); } /* ============================ * DÉTECTION DU MODE STRIPE * ============================ */ function detectPaymentMode() { if (typeof window.STRIPE_MODE_DETECTED !== 'undefined') { return window.STRIPE_MODE_DETECTED; } const scripts = document.querySelectorAll('script'); for (const script of scripts) { const c = script.textContent || script.innerHTML; if (c.includes('pk_test_')) return 'test'; if (c.includes('pk_live_')) return 'live'; } const stripeEls = document.querySelectorAll('[data-stripe-publishable-key],[data-pafe-stripe-key]'); for (const el of stripeEls) { const key = el.getAttribute('data-stripe-publishable-key') || el.getAttribute('data-pafe-stripe-key'); if (key?.startsWith('pk_test_')) return 'test'; if (key?.startsWith('pk_live_')) return 'live'; } return 'live'; } /* ============================ * EXTRACTION DONNÉES CLIENT * ============================ */ function extractClientData() { const data = {}; const emailField = document.querySelector('input[type="email"],input[name*="email"],input[id*="email"]'); if (emailField?.value) data.email = emailField.value; const nameFields = document.querySelectorAll('input[name*="nom"],input[name*="name"],input[id*="nom"],input[id*="name"]'); let fullName = ''; nameFields.forEach(f => { if (f.value && !f.type.match(/email|tel|number/)) fullName += (fullName ? ' ' : '') + f.value; }); if (fullName) data.customerName = fullName.trim(); const phoneField = document.querySelector('input[type="tel"],input[name*="phone"],input[name*="telephone"],input[id*="phone"],input[id*="tel"]'); if (phoneField?.value) data.phone = phoneField.value; data.userAgent = navigator.userAgent; data.screenResolution = `${window.screen.width}x${window.screen.height}`; data.viewportSize = `${window.innerWidth}x${window.innerHeight}`; const ua = navigator.userAgent.toLowerCase(); data.deviceType = /mobile|android|iphone|ipod|blackberry|iemobile|opera mini/i.test(ua) ? 'mobile' : /tablet|ipad/i.test(ua) ? 'tablet' : 'desktop'; data.referrer = document.referrer || 'direct'; const urlParams = new URLSearchParams(window.location.search); const utmParams = {}; ['utm_source','utm_medium','utm_campaign','utm_term','utm_content'].forEach(p => { if (urlParams.has(p)) utmParams[p] = urlParams.get(p); }); if (Object.keys(utmParams).length) data.utmParams = utmParams; if (!sessionStorage.getItem('stripe_session_id')) { sessionStorage.setItem('stripe_session_id', 'session_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9)); } data.sessionId = sessionStorage.getItem('stripe_session_id'); data.timestamp = Date.now(); return data; } /* ============================ * DÉTECTION TYPE ERREUR * ============================ */ function detectErrorType(msg) { const m = msg.toLowerCase(); if (m.includes('declined') || m.includes('refus')) return 'Carte refusée'; if (m.includes('insufficient') || m.includes('fonds')) return 'Fonds insuffisants'; if (m.includes('expired') || m.includes('expir')) return 'Carte expirée'; if (m.includes('cvc') || m.includes('cvv') || m.includes('security code')) return 'Code CVC incorrect'; if (m.includes('invalid number')|| m.includes('numéro invalide')) return 'Numéro invalide'; if (m.includes('authentication')|| m.includes('3d secure')) return 'Authentification 3DS échouée'; if (m.includes('popup') || m.includes('bloqué') || m.includes('blocked')) return 'Popup bloquée'; if (m.includes('timeout') || m.includes('délai')) return 'Timeout'; if (m.includes('network') || m.includes('réseau') || m.includes('connection')) return 'Erreur réseau'; return 'Autre erreur'; } /* ============================ * LOGGING SERVEUR * ============================ */ function serverLog(level, message, context = null, extraData = {}) { debugLog(`[${level.toUpperCase()}] ${message}`, context); if (!CONFIG.SERVER_LOGGING) return; const logData = { level, message, context, timestamp: new Date().toISOString(), url: window.location.href, userAgent: navigator.userAgent, transactionId: currentTransactionId, ...extraData }; fetch(CONFIG.LOG_ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, body: JSON.stringify(logData), keepalive: true }).catch(err => console.error('[PAYMENT-UX] Erreur logging:', err)); } /* ============================ * DÉTECTION BLOQUEUR POPUP * ============================ */ function isPopupBlocked() { try { const w = window.open('', '_blank', 'width=1,height=1,left=-9999,top=-9999'); if (!w || w.closed) return true; w.close(); return false; } catch (e) { debugLog('Exception test popup:', e.message); return true; } } /* ============================ * CSS * ============================ */ function addStyles() { if (document.getElementById('piotnet-responsive-styles')) return; const style = document.createElement('style'); style.id = 'piotnet-responsive-styles'; style.textContent = ` @keyframes fadeInCenter{0%{opacity:0;transform:translate(-50%,-50%) scale(.9)}100%{opacity:1;transform:translate(-50%,-50%) scale(1)}} @keyframes fadeOutCenter{0%{opacity:1;transform:translate(-50%,-50%) scale(1)}100%{opacity:0;transform:translate(-50%,-50%) scale(.9)}} @keyframes spin{to{transform:rotate(360deg)}} .piotnet-popup-overlay{position:fixed;inset:0;background:rgba(0,0,0,${THEME_CONFIG.overlayOpacity});z-index:999998;display:flex;align-items:center;justify-content:center;padding:20px;box-sizing:border-box} .piotnet-popup{background:#fff;border-radius:16px;box-shadow:0 10px 30px rgba(0,0,0,.25);max-width:520px;width:100%;max-height:90vh;overflow:hidden;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);animation:fadeInCenter .25s ease-out} .piotnet-popup.closing{animation:fadeOutCenter .2s ease-in} .piotnet-popup-header{padding:22px 26px 14px;border-bottom:1px solid #eee;text-align:center;position:relative} .piotnet-popup-title{font-family:Arial,sans-serif;font-size:18px;font-weight:bold;color:#222;margin:0;text-transform:uppercase;letter-spacing:.4px} .piotnet-popup-close{position:absolute;top:12px;right:16px;background:none;border:none;font-size:22px;color:#888;cursor:pointer;padding:6px;width:34px;height:34px;display:flex;align-items:center;justify-content:center;border-radius:50%} .piotnet-popup-close:hover{background:#f4f4f4;color:#333} .piotnet-popup-content{padding:22px 24px 26px;text-align:center} .piotnet-popup-content p{margin:0 0 16px;font-family:Arial,sans-serif;font-size:15px;color:#555;line-height:1.55} .piotnet-loading-spinner{width:56px;height:56px;margin:18px auto;position:relative} .piotnet-loading-spinner::before{content:"";position:absolute;inset:0;border:4px solid #e3e3e3;border-top-color:#3498db;border-radius:50%;animation:spin 1s linear infinite} .piotnet-loading-spinner::after{content:"";position:absolute;top:8px;left:8px;right:8px;bottom:8px;border:4px solid transparent;border-top-color:#27ae60;border-radius:50%;animation:spin 1.25s linear infinite reverse} .piotnet-error-details{background:#f8f9fa;border:1px solid #dee2e6;border-radius:10px;padding:14px;margin:18px 0;text-align:left} .piotnet-error-details h4{margin:0 0 6px;font-size:14px;color:#333} .piotnet-error-details p{margin:0;font-size:14px;color:#666} .piotnet-popup-warning{background:#fff8e1;border:1px solid #ffe082;border-radius:10px;padding:14px;margin:18px 0;text-align:left} .piotnet-popup-warning h4{margin:0 0 6px;font-size:14px;color:#f57c00} .piotnet-popup-warning p{margin:0;font-size:13px;color:#795548;line-height:1.5} .piotnet-popup-warning ol{margin:8px 0 0 16px;padding:0;font-size:13px;color:#795548;line-height:1.8} .piotnet-popup-buttons{display:flex;gap:12px;justify-content:center;flex-wrap:wrap} .piotnet-popup .piotnet-popup-button{background:#fff;border:1px solid ${THEME_CONFIG.buttonColor};color:${THEME_CONFIG.buttonColor};padding:10px 20px;border-radius:10px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s;text-transform:uppercase;text-decoration:none} .piotnet-popup .piotnet-popup-button.primary:hover{background:${THEME_CONFIG.buttonColor};color:#fff} .piotnet-hide-native-error{display:none !important} @media(max-width:600px){ .piotnet-popup{max-width:95%;border-radius:12px} .piotnet-popup-buttons{flex-direction:column} .piotnet-popup-button{width:100%} } `; document.head.appendChild(style); } /* ============================ * TRADUCTIONS STRIPE * ============================ */ const STRIPE_TRANSLATIONS = { 'Your card was declined.' : 'Votre carte a été refusée.', 'Your card has insufficient funds.' : 'Fonds insuffisants.', 'Your card has expired.' : 'Votre carte a expiré.', "Your card's security code is incorrect." : 'Code de sécurité incorrect.', 'An error occurred while processing your card.': 'Une erreur est survenue lors du traitement.', 'Your card number is incorrect.' : 'Numéro de carte incorrect.', 'Your card is not supported.' : "Votre carte n'est pas supportée.", 'Processing error' : 'Erreur de traitement' }; function translateError(message) { return STRIPE_TRANSLATIONS[message] || message; } /* ============================ * HELPERS * ============================ */ function findParentForm(el) { let cur = el; while (cur && cur !== document.body) { if (cur.tagName === 'FORM') return cur; cur = cur.parentElement; } return null; } function isPaymentButtonEnabled(btn) { return btn && !btn.disabled && !btn.classList.contains('pafe-form-builder-button-disabled'); } function areStripeElementsComplete() { const fields = document.querySelectorAll('.StripeElement'); if (!fields.length) return true; for (const f of fields) { if (f.classList.contains('StripeElement--empty') || f.classList.contains('StripeElement--invalid')) return false; } return true; } function isElementVisible(el) { if (!el) return false; const s = window.getComputedStyle(el); if (s.display === 'none' || s.visibility === 'hidden' || s.opacity === '0') return false; const r = el.getBoundingClientRect(); return !(r.width === 0 && r.height === 0); } // Sélecteur élargi — cible tous les boutons Piotnet/PAFE/Elementor const PAYMENT_BUTTON_SELECTORS = [ '[data-pafe-form-builder-stripe-submit]', '.pafe-form-builder-button', '.elementor-button.pafe-form-builder-button' ].join(','); function getPaymentButton(el) { return el.closest(PAYMENT_BUTTON_SELECTORS); } function isFormValid(form) { const required = form.querySelectorAll('[required],[aria-required="true"]'); for (const f of required) { if (f.closest('.StripeElement')) continue; const empty = (f.type === 'checkbox' || f.type === 'radio') ? !f.checked : !f.value.trim(); if (empty) { f.scrollIntoView({ behavior: 'smooth', block: 'center' }); if (f.reportValidity) f.reportValidity(); else f.focus(); return false; } } return true; } /* ============================ * GESTION DES POPUPS * ============================ */ function removeAllPopups() { document.querySelectorAll('.piotnet-popup-overlay').forEach(o => o.remove()); } function createLoadingPopup() { removeAllPopups(); const overlay = document.createElement('div'); overlay.className = 'piotnet-popup-overlay'; overlay.innerHTML = `

Traitement en cours...

Veuillez patienter, nous interrogeons votre banque.

`; document.body.appendChild(overlay); } function createErrorPopup(errorMessage) { removeAllPopups(); const overlay = document.createElement('div'); overlay.className = 'piotnet-popup-overlay'; overlay.innerHTML = `

Paiement non abouti

Détails de l'erreur

${translateError(errorMessage)}

`; document.body.appendChild(overlay); const close = () => { overlay.querySelector('.piotnet-popup').classList.add('closing'); setTimeout(() => { overlay.remove(); resetAfterError(); }, 200); }; overlay.querySelector('.piotnet-popup-close').addEventListener('click', close); overlay.querySelector('.piotnet-retry-button').addEventListener('click', close); } function createPopupBlockedWarning() { removeAllPopups(); const overlay = document.createElement('div'); overlay.className = 'piotnet-popup-overlay'; overlay.innerHTML = `

Action requise

⚠️ Votre navigateur bloque les fenêtres de paiement

La fenêtre de saisie de votre carte bancaire ne peut pas s'ouvrir.
Pour finaliser votre abonnement, veuillez autoriser les popups pour ce site :

  1. Cliquez sur l'icône 🔒 ou ⚙️ dans la barre d'adresse
  2. Sélectionnez "Autoriser les popups" pour ce site
  3. Rechargez la page et réessayez
`; document.body.appendChild(overlay); overlay.querySelector('.piotnet-popup-close').addEventListener('click', () => { overlay.remove(); isProcessingPayment = false; }); overlay.querySelector('.piotnet-popup-close-btn').addEventListener('click', () => { overlay.remove(); isProcessingPayment = false; }); } /* ============================ * RÉINITIALISATION * ============================ */ function resetAfterError() { stopMonitoring(); isProcessingPayment = false; // NE PAS effacer le transaction_id : réutilisé si l'utilisateur réessaie document.querySelectorAll('.piotnet-hide-native-error').forEach(el => { el.classList.remove('piotnet-hide-native-error'); }); } /* ============================ * SURVEILLANCE * ============================ */ function stopMonitoring() { if (errorCheckInterval) { clearInterval(errorCheckInterval); errorCheckInterval = null; } if (timeoutTimer) { clearTimeout(timeoutTimer); timeoutTimer = null; } isMonitoring = false; } function checkForSuccess() { const selectors = [ '.elementor-message-success', '.pafe-form-builder-success', '.pafe-success-message', '[data-pafe-form-builder-success]' ]; for (const sel of selectors) { const el = document.querySelector(sel); if (el && isElementVisible(el) && el.textContent.trim()) { const clientData = extractClientData(); const paymentMode = detectPaymentMode(); serverLog('info', 'Paiement réussi - Succès détecté', { selector: sel, message: el.textContent.trim(), currentUrl: window.location.href, pageTitle: document.title }, { email: clientData.email || 'non-capturé', paymentMode }); clearTransactionId(); // Paiement conclu — effacer l'ID stopMonitoring(); return true; } } return false; } function checkForErrors() { if (checkForSuccess()) return false; const errorSelectors = [ '.elementor-message-danger', '.pafe-form-builder-error', '.stripe-error', '.card-errors', '[data-pafe-form-builder-error]', '.pafe-error-message' ]; for (const sel of errorSelectors) { const el = document.querySelector(sel); if (el && isElementVisible(el) && el.textContent.trim().length >= 5) { const errorText = el.textContent.trim(); const clientData = extractClientData(); const errorType = detectErrorType(errorText); const paymentMode = detectPaymentMode(); serverLog('error', 'Erreur de paiement détectée', { selector: sel, errorMessage: errorText, currentUrl: window.location.href, pageTitle: document.title }, { ...clientData, error_type: errorType, error_details: errorText, paymentMode }); clearTransactionId(); // Erreur confirmée — prochain paiement = nouvel ID el.classList.add('piotnet-hide-native-error'); stopMonitoring(); createErrorPopup(errorText); return true; } } const invalidField = document.querySelector('.StripeElement--invalid'); if (invalidField && isElementVisible(invalidField)) { clearTransactionId(); stopMonitoring(); createErrorPopup('Veuillez vérifier les informations de votre carte.'); return true; } return false; } function startSurveillance() { if (isMonitoring) return; isMonitoring = true; // Surveillance démarrée AVANT la popup (erreurs rapides capturées) errorCheckInterval = setInterval(checkForErrors, CONFIG.ERROR_CHECK_INTERVAL); timeoutTimer = setTimeout(() => { if (!isMonitoring) return; const clientData = extractClientData(); const paymentMode = detectPaymentMode(); serverLog('warning', 'Timeout de paiement atteint', { maxWaitTime: CONFIG.MAX_WAIT_TIME, currentUrl: window.location.href }, { email: clientData.email || 'non-capturé', paymentMode, error_type: 'Timeout' }); clearTransactionId(); stopMonitoring(); createErrorPopup('La validation du paiement a pris trop de temps. Veuillez réessayer.'); }, CONFIG.MAX_WAIT_TIME); } /* ============================ * DÉTECTION DES CLICS * ============================ */ function setupPaymentClickDetection() { document.addEventListener('click', function (e) { const btn = getPaymentButton(e.target); if (!btn) return; // Récupérer l'email AVANT de créer/réutiliser le transaction_id const clientData = extractClientData(); const paymentMode = detectPaymentMode(); // ✅ v3.2.0 : Réutiliser l'ID si paiement non conclu pour cet email currentTransactionId = getOrCreateTransactionId(clientData.email || ''); const formElement = btn.closest('form'); serverLog('info', 'Clic sur bouton de paiement', { buttonText: btn.textContent.trim(), buttonId: btn.id || 'non-défini', buttonClass: btn.className || 'non-défini', formId: formElement ? (formElement.id || 'non-défini') : 'aucun-formulaire', currentUrl: window.location.href, pageTitle: document.title }, { email: clientData.email || 'non-capturé', customer_name: clientData.customerName || 'non-capturé', paymentMode }); if (isProcessingPayment) return; // Détection bloqueur de popup AVANT tout traitement if (isPopupBlocked()) { serverLog('warning', 'Popup bloquée - Paiement impossible', { currentUrl: window.location.href, pageTitle: document.title }, { email: clientData.email || 'non-capturé', paymentMode, error_type: 'Popup bloquée' }); createPopupBlockedWarning(); // NE PAS effacer l'ID : prochain clic réutilisera le même return; } setTimeout(() => { if (!isPaymentButtonEnabled(btn)) return; if (!areStripeElementsComplete()) return; const form = findParentForm(btn); if (form && !isFormValid(form)) return; isProcessingPayment = true; serverLog('info', 'Lancement du traitement de paiement', { formValid: true, stripeElementsComplete: true, currentUrl: window.location.href, pageTitle: document.title }, { email: clientData.email || 'non-capturé', customer_name: clientData.customerName || 'non-capturé', paymentMode }); startSurveillance(); // Surveillance AVANT la popup createLoadingPopup(); }, CONFIG.LOADING_DELAY); }, true); } /* ============================ * INITIALISATION * ============================ */ function init() { addStyles(); setupPaymentClickDetection(); debugLog('✅ Script paiement initialisé v3.2.0'); } init(); if (typeof jQuery !== 'undefined') { jQuery(document).on('pafe_ajax_form_success', function () { clearTransactionId(); isProcessingPayment = false; isMonitoring = false; }); } console.log('[PIOTNET-STRIPE] Script v3.2.0 chargé'); })(); });