{"id":39821,"date":"2025-03-04T15:32:32","date_gmt":"2025-03-04T20:32:32","guid":{"rendered":"https:\/\/dormalab.com\/?page_id=39821"},"modified":"2025-03-04T15:33:47","modified_gmt":"2025-03-04T20:33:47","slug":"paiement-securise","status":"publish","type":"page","link":"https:\/\/dormalab.com\/fr\/paiement-securise\/","title":{"rendered":"Paiement S\u00e9curis\u00e9"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"fr\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>D\u00e9tails de la facture<\/title>\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/sweetalert2@11\"><\/script>\n    <style>\n        body {\n            font-family: Arial, sans-serif;\n            background-color: #fff;\n            margin: 0;\n            padding: 70px;\n        }\n\n        .container {\n            max-width: 1000px;\n            margin: 0 auto;\n            background: #fff;\n            padding: 30px;\n        }\n\n        .flex-container {\n            display: flex;\n            gap: 20px;\n            \/* flex-wrap: wrap; *\/\n        }\n\n        .section {\n            flex: 1;\n            min-width: 300px;\n            margin: 20px;\n        }\n\n        .invoice {\n            background-color: transparent;\n            box-shadow: none;\n            padding: 0;\n        }\n\n        .payment-form {\n            background-color: #fff;\n            padding: 20px;\n            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n        }\n\n        .section h2 {\n            margin-top: 0;\n        }\n\n        .invoice p {\n            margin: 5px 0;\n        }\n\n        .invoice-summary {\n            margin-top: 20px;\n            padding-top: 10px;\n            border-top: 1px solid #ddd;\n        }\n\n        .summary-row {\n            display: flex;\n            justify-content: space-between;\n            margin: 8px 0;\n        }\n\n        .summary-row.total span {\n            font-weight: bold;\n        }\n\n        .form-group {\n            margin-bottom: 20px;\n        }\n\n        .form-group label {\n            display: block;\n            margin-bottom: 5px;\n        }\n\n        .form-group input {\n            width: 100%;\n            padding: 8px;\n            box-sizing: border-box;\n            border: 1px solid black;\n            border-radius: 4px;\n            font-size: 14px;\n        }\n\n        .btn {\n            background-color: #007BFF;\n            color: #fff;\n            border: none;\n            padding: 10px 20px;\n            cursor: pointer;\n        }\n\n        .btn-pay {\n            margin-top: 25px;\n        }\n\n        .btn:hover {\n            background-color: #0050a7;\n        }\n\n        .error-message {\n            display: none;\n            color: red;\n            font-size: 0.85em;\n            margin-top: 5px;\n        }\n\n        .was-validated input:invalid {\n            border: 2px solid red;\n        }\n\n        .card-info {\n            display: flex;\n            flex-direction: column;\n            gap: 5px;\n            margin-top: 5px;\n            margin-bottom: 15px;\n        }\n\n        .card-number-container {\n            display: flex !important;\n            flex-direction: column !important;\n            align-items: flex-start !important;\n            border: none;\n            padding: 0;\n        }\n\n        .expiration-cvv-container {\n            display: flex;\n            gap: 10px;\n        }\n\n        .card-number-container input,\n        .expiration-cvv-container input {\n            font-family: Arial, sans-serif;\n            flex: 1;\n            outline: none;\n        }\n\n        p {\n            margin: 3px 0;\n        }\n\n        .visit-info {\n            margin-top: 30px;\n            margin-bottom: 30px;\n        }\n\n        .products-list {\n            margin-bottom: 30px;\n        }\n\n        .save-payment-label {\n            font-size: 14px;\n        }\n\n        .save-payment-label input[type=\"checkbox\"] {\n            width: auto;\n            margin: 0;\n        }\n\n        .invalid-input {\n            border: 2px solid red !important;\n        }\n\n        .spinner {\n            border: 4px solid #f3f3f3;\n            border-top: 4px solid #007BFF;\n            border-radius: 50%;\n            width: 40px;\n            height: 40px;\n            animation: spin 1s linear infinite;\n            margin: 0 auto 10px;\n        }\n\n        @keyframes spin {\n            0% {\n                transform: rotate(0deg);\n            }\n\n            100% {\n                transform: rotate(360deg);\n            }\n        }\n\n        .btn:disabled {\n            background-color: rgb(182, 182, 182);\n            opacity: 0.7;\n        }\n\n        @media (max-width: 768px) {\n            body {\n                padding: 10px;\n            }\n\n            .flex-container {\n                flex-direction: column;\n                gap: 10px;\n                align-items: center;\n            }\n\n            .section {\n                margin: 10px 0;\n                width: 90%;\n                max-width: 400px;\n            }\n        }\n\n        @media (max-width: 480px) {\n            .section {\n                width: 95%;\n                max-width: none;\n            }\n\n            body {\n                font-size: 14px;\n            }\n        }\n    <\/style>\n<\/head>\n\n<body>\n    <div class=\"container\">\n        <div class=\"flex-container\">\n\n            <div class=\"section invoice\">\n                <h2>D\u00e9tails de la facture<\/h2>\n                <div id=\"alreadyPaidMessage\" style=\"display: none; color: green; font-weight: bold; margin-bottom: 20px;\"><\/div>\n                <p id=\"total-due-header\" style=\"font-weight: bold; font-size: x-large;\">$0.00<\/p>\n\n                <div id=\"dataErrorMessage\" style=\"display: none; color: red; margin-top: 20px; font-size: 16px;\"><\/div>\n\n                <div id=\"visit-info\" class=\"visit-info\">\n                    <p style=\"font-weight: bold;\">D\u00e9tails de la visite<\/p>\n                    <p id=\"visit-name\"><\/p>\n                    <p id=\"visit-date\"><\/p>\n                <\/div>\n\n                <div id=\"products-list\" class=\"products-list\">\n                    <p style=\"font-weight: bold;\">Produit(s)<\/p>\n                <\/div>\n\n                <div class=\"invoice-summary\">\n                    <div class=\"summary-row total\">\n                        <span>Total<\/span>\n                        <span id=\"total-due\">$0.00<\/span>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"section payment-form\">\n                <h2>Informations de paiement<\/h2>\n                <form id=\"paymentForm\" action=\"\" method=\"post\" autocomplete=\"off\" novalidate>\n                    <input type=\"hidden\" id=\"opportunityIdHidden\" name=\"opportunityIdHidden\" \/>\n                    <div class=\"form-group\">\n                        <label for=\"first_name\">Pr\u00e9nom<\/label>\n                        <input type=\"text\" id=\"first_name\" name=\"first_name\" required>\n                        <div class=\"error-message\" data-custom=\"\"><\/div>\n                    <\/div>\n                    <div class=\"form-group\">\n                        <label for=\"last_name\">Nom<\/label>\n                        <input type=\"text\" id=\"last_name\" name=\"last_name\" required>\n                        <div class=\"error-message\" data-custom=\"\"><\/div>\n                    <\/div>\n                    <div class=\"form-group\">\n                        <label for=\"email\">Email<\/label>\n                        <input type=\"email\" id=\"email\" name=\"email\" placeholder=\"name@example.com\" required>\n                        <div class=\"error-message\" data-custom=\"Veuillez entrer un email valide\"><\/div>\n                    <\/div>\n\n                    <div class=\"form-group card-info\">\n                        <label for=\"card_number\">Informations de la carte<\/label>\n                        <div class=\"card-number-container\">\n                            <input type=\"text\" id=\"card_number\" name=\"card_number\" placeholder=\"1234 1234 1234 1234\"\n                                required>\n                            <div class=\"error-message\" data-custom=\"\"><\/div>\n                        <\/div>\n\n                        <div class=\"expiration-cvv-container\">\n                            <input type=\"text\" id=\"expiration_date\" name=\"expiration_date\" placeholder=\"MM \/ YY\"\n                                pattern=\"^(0[1-9]|1[0-2])\\s*\\\/\\s*([0-9]{2})$\" required>\n                            <div class=\"error-message\" data-custom=\"\"><\/div>\n                            <input type=\"text\" id=\"cvv\" name=\"cvv\" placeholder=\"CVV\" pattern=\"^\\d{3,4}$\" required>\n                            <div class=\"error-message\" data-custom=\"\"><\/div>\n                        <\/div>\n\n                        <div id=\"cardDeclinedError\" style=\"display: none; color: red; margin-top:10px; font-size: 16px;\"><\/div>\n                    <\/div>\n\n                    <div class=\"form-group\">\n                        <label class=\"save-payment-label\">\n                            <input type=\"checkbox\" id=\"savePaymentInfo\" name=\"savePaymentInfo\">\n                            Sauvegarder mes informations de paiement.\n                        <\/label>\n                    <\/div>\n\n                    <div class=\"btn-pay\">\n                        <button type=\"submit\" class=\"btn\">Payer<\/button>\n                    <\/div>\n\n                    <!-- <div id=\"formErrorMessage\" style=\"display: none; color: red; margin-top: 15px; font-size: 16px;\"><\/div> -->\n                <\/form>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div id=\"loadingOverlay\"\n        style=\"display:none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(255,255,255,0.8); z-index: 9999; text-align: center;\">\n        <div style=\"position: relative; top: 40%;\">\n            <div class=\"spinner\"><\/div>\n            <span>Traitement en cours&#8230;<\/span>\n        <\/div>\n    <\/div>\n\n    <div id=\"successMessage\"\n        style=\"display:none; position: fixed; top:50%; left:50%; transform: translate(-50%, -50%); background-color: #d4edda; padding:20px; border:1px solid #c3e6cb; z-index:10000; width: 400px; text-align: center;\">\n        <p style=\"font-size: 20px;\">Paiement r\u00e9ussi!<\/p>\n    <\/div>\n\n    <script>\n        let globalTotalDue = 0;\n        const BASE_URL = 'https:\/\/api.summittravelhealthdev.com\/v1';\n    <\/script>\n\n    <script>\n        document.getElementById('paymentForm').addEventListener('submit', async function (event) {\n            event.preventDefault();\n\n            const form = event.target;\n            const payButton = this.querySelector('button[type=\"submit\"]');\n            const isFormValid = form.checkValidity();\n\n            let inputs = form.querySelectorAll('input:not([type=\"hidden\"])');\n            inputs.forEach(function (input) {\n                let errorElement = input.parentElement.querySelector('.error-message');\n                if (!errorElement) return;\n\n                if (!input.checkValidity()) {\n                    let customMessage = errorElement.getAttribute('data-custom');\n                    if (customMessage && customMessage.trim().length > 0) {\n                        errorElement.innerText = customMessage;\n                    } else {\n                        errorElement.innerText = 'This field is required.';\n                    }\n                    errorElement.style.display = 'block';\n                } else {\n                    errorElement.innerText = '';\n                    errorElement.style.display = 'none';\n                }\n            });\n\n            if (!isFormValid) {\n                form.classList.add('was-validated');\n                return;\n            }\n\n            payButton.disabled = true;\n            document.getElementById('loadingOverlay').style.display = 'block';\n\n            const opportunityId = document.getElementById('opportunityIdHidden').value;\n            const firstName = document.getElementById('first_name').value.trim();\n            const lastName = document.getElementById('last_name').value.trim();\n            const email = document.getElementById('email').value.trim();\n            const cardNumber = document.getElementById('card_number').value.replace(\/\\s+\/g, '');\n            const expiration = document.getElementById('expiration_date').value.trim();\n            const cvv = document.getElementById('cvv').value.trim();\n            const [expMonth, expYearShort] = expiration.split('\/').map(s => s.trim());\n            const currentYear = new Date().getFullYear();\n            const expYear = expYearShort.length === 2 ? ('20' + expYearShort) : expYearShort;\n            const amount = globalTotalDue;\n            const saveCreditCard = document.getElementById(\"savePaymentInfo\").checked;\n\n            if (saveCreditCard) {\n                const paymentInfo = {\n                    firstName,\n                    lastName,\n                    email,\n                    cardNumber,\n                    expirationDate: expiration,\n                    cvv\n                };\n                console.log(\"savePaymentInfo:\", paymentInfo);\n                localStorage.setItem(\"paymentInfo\", JSON.stringify(paymentInfo));\n            }\n\n            const paymentData = {\n                opportunityId,\n                cardNumber,\n                expMonth,\n                expYear,\n                cvv,\n                firstName,\n                lastName,\n                email,\n                amount,\n                saveCreditCard\n            };\n\n            console.log(\"paymentData :\", paymentData);\n\n            try {\n                const response = await fetch(`${BASE_URL}\/visit\/payForVisit`, {\n                    method: 'POST',\n                    headers: {\n                        'Content-Type': 'application\/json'\n                    },\n                    body: JSON.stringify(paymentData)\n                });\n\n                const result = await response.json();\n\n                function translateError(errorMsg) {\n                    if (errorMsg.toLowerCase().includes(\"card declined\")) {\n                        return \"Carte refus\u00e9e: CARTE INVALIDE\";\n                    } else if (errorMsg.toLowerCase().includes(\"invalid card number\")) {\n                        return \"Carte refus\u00e9e: NUM\u00c9RO DE CARTE INVALIDE\";\n                    }\n                    return errorMsg;\n                }\n\n                if (response.ok) {\n                    console.log('Paiement r\u00e9ussi! Transaction ID: ' + result.transactionId);\n                    document.getElementById('loadingOverlay').style.display = 'none';\n                    document.getElementById('successMessage').style.display = 'block';\n                } else {\n                    console.log('Erreur lors du paiement: ' + (result.error || 'Erreur inconnue'));\n                    payButton.disabled = false;\n                    payButton.innerText = \"Pay\";\n                    document.getElementById('loadingOverlay').style.display = 'none';\n                    \/\/ document.getElementById('errorMessage').style.display = 'block';\n\n                    console.log('R\u00e9ponse API en cas d\u2019erreur:', result);\n                    const errorMessage = result.errorMessage || result.error || 'Erreur inconnue';\n                    const errorMessageFr = translateError(errorMessage);\n\n                    Swal.fire({\n                        icon: 'warning',\n                        title: 'Paiement \u00e9chou\u00e9',\n                        html: `<p>Le paiement a \u00e9chou\u00e9. Veuillez r\u00e9essayer.<\/p>\n                            <p>${errorMessageFr}<\/p>`,\n                        confirmButtonText: 'OK',\n                        confirmButtonColor: '#007BFF'\n                    });\n                }\n            } catch (error) {\n                console.error('Erreur lors de la communication avec le serveur:', error);\n                console.error('Erreur de communication avec le serveur.');\n                payButton.disabled = false;\n                payButton.innerText = \"Pay\";\n                document.getElementById('loadingOverlay').style.display = 'none';\n            }\n        });\n\n        window.addEventListener('load', function () {\n            const storedPaymentInfo = localStorage.getItem(\"paymentInfo\");\n            if (storedPaymentInfo) {\n                const paymentInfo = JSON.parse(storedPaymentInfo);\n\n                document.getElementById(\"first_name\").value = paymentInfo.firstName || \"\";\n                document.getElementById(\"last_name\").value = paymentInfo.lastName || \"\";\n                document.getElementById(\"email\").value = paymentInfo.email || \"\";\n                document.getElementById(\"card_number\").value = paymentInfo.cardNumber || \"\";\n                document.getElementById(\"expiration_date\").value = paymentInfo.expirationDate || \"\";\n                document.getElementById(\"cvv\").value = paymentInfo.cvv || \"\";\n                document.getElementById(\"savePaymentInfo\").checked = true;\n\n                document.getElementById(\"card_number\").dispatchEvent(new Event('input'));\n                document.getElementById(\"expiration_date\").dispatchEvent(new Event('input'));\n            }\n        });\n    <\/script>\n\n    <script>\n        const savePaymentInfoCheckbox = document.getElementById(\"savePaymentInfo\");\n        savePaymentInfoCheckbox.addEventListener(\"change\", function (event) {\n            if (!event.target.checked) {\n                document.getElementById(\"first_name\").value = \"\";\n                document.getElementById(\"last_name\").value = \"\";\n                document.getElementById(\"email\").value = \"\";\n                document.getElementById(\"card_number\").value = \"\";\n                document.getElementById(\"expiration_date\").value = \"\";\n                document.getElementById(\"cvv\").value = \"\";\n                localStorage.removeItem(\"paymentInfo\");\n            }\n        });\n    <\/script>\n\n    <script>\n        window.addEventListener('load', async function () {\n            const urlParams = new URLSearchParams(window.location.search);\n            const salesforceId = urlParams.get('salesforceId');\n            if (!salesforceId) {\n                console.error(\"Aucun salesforceId fourni dans l'URL\");\n                document.querySelector('.btn').disabled = true;\n                const dataErrorMessage = document.getElementById('dataErrorMessage');\n                dataErrorMessage.textContent = \"Impossible de r\u00e9cup\u00e9rer les d\u00e9tails de la visite ou les produits. Veuillez r\u00e9essayer.\";\n                dataErrorMessage.style.display = 'block';\n                return;\n            }\n\n            try {\n                const response = await fetch(`${BASE_URL}\/visit\/${salesforceId}\/getVisitDetails`);\n                if (response.ok) {\n                    const data = await response.json();\n                    const visit = data.visit;\n                    const products = data.products;\n\n                    globalOpportunityId = visit.id;\n                    document.getElementById('opportunityIdHidden').value = visit.id;\n\n                    \/\/ const totalDue = products.reduce((sum, product) => sum + parseFloat(product.totalPrice), 0);\n                    const totalDue = parseFloat(visit.amountOutstanding);\n                    globalTotalDue = totalDue;\n                    document.getElementById('total-due-header').textContent = `$${totalDue.toFixed(2)}`;\n                    document.getElementById('total-due').textContent = `$${totalDue.toFixed(2)}`;\n\n                    if (totalDue === 0) {\n                        const payButton = document.querySelector('.btn');\n                        payButton.disabled = true;\n\n                        const alreadyPaidMsg = document.getElementById('alreadyPaidMessage');\n                        alreadyPaidMsg.style.display = 'block';\n                        alreadyPaidMsg.textContent = 'Cette facture a d\u00e9j\u00e0 \u00e9t\u00e9 pay\u00e9e.';\n                    }\n\n                    document.getElementById('visit-name').textContent = (visit.name);\n                    const visitDate = new Date(visit.date);\n                    document.getElementById('visit-date').textContent = visitDate.toLocaleDateString();\n\n                    const productsList = document.getElementById('products-list');\n                    products.forEach(product => {\n                        const productElem = document.createElement('p');\n                        productElem.textContent = `${product.name} - $${parseFloat(product.totalPrice).toFixed(2)}`;\n                        productsList.appendChild(productElem);\n                    });\n\n                    console.log('D\u00e9tails de la visite :', visit)\n                    console.log('Produits :', products)\n                } else {\n                    console.log(\"Erreur\", await response.json());\n                    const dataError = document.getElementById('dataErrorMessage');\n                    dataError.textContent = 'Impossible de r\u00e9cup\u00e9rer les d\u00e9tails de la visite ou les produits. Veuillez r\u00e9essayer.';\n                    dataError.style.display = 'block';\n                    document.querySelector('.btn').disabled = true;\n                }\n            } catch (error) {\n                console.error(\"Erreur lors de la r\u00e9cup\u00e9ration des d\u00e9tails :\", error);\n                const dataError = document.getElementById('dataErrorMessage');\n                dataError.textContent = 'Impossible de r\u00e9cup\u00e9rer les d\u00e9tails de la visite ou les produits. Veuillez r\u00e9essayer.';\n                dataError.style.display = 'block';\n                document.querySelector('.btn').disabled = true;\n            }\n        });\n\n    <\/script>\n\n    <script>\n        document.getElementById('paymentForm').addEventListener('submit', function (event) {\n            let form = event.target;\n            let inputs = form.querySelectorAll('input');\n            let valid = true;\n\n            inputs.forEach(function (input) {\n                let errorElement = input.parentElement.querySelector('.error-message');\n                if (!input.checkValidity()) {\n                    let customMessage = errorElement.getAttribute('data-custom');\n\n                    if (customMessage && customMessage.trim().length > 0) {\n                        errorElement.innerText = customMessage;\n                        errorElement.style.display = 'block';\n                    } else {\n                        errorElement.innerText = '';\n                        errorElement.style.display = 'none';\n                    }\n                    valid = false;\n                } else {\n                    errorElement.innerText = '';\n                    errorElement.style.display = 'none';\n                }\n            });\n\n            if (!valid) {\n                event.preventDefault();\n                form.classList.add('was-validated');\n            }\n        });\n\n        window.addEventListener('load', function () {\n            let today = new Date();\n            let month = today.getMonth() + 1;\n            let year = today.getFullYear();\n            if (month < 10) {\n                month = '0' + month;\n            }\n            let minDate = year + '-' + month;\n            document.getElementById('expiration_date').setAttribute('min', minDate);\n        });\n\n        document.getElementById('card_number').addEventListener('input', function () {\n            let digits = this.value.replace(\/\\D\/g, '');\n            let formatted = digits.replace(\/(.{4})\/g, '$1 ').trim();\n            this.value = formatted;\n        });\n\n        document.getElementById('card_number').addEventListener('blur', function () {\n            const cardInput = this;\n            const errorElement = cardInput.parentElement.querySelector('.error-message');\n            const rawNumber = cardInput.value.replace(\/\\s+\/g, '');\n\n            if (rawNumber.length !== 15 &#038;&#038; rawNumber.length !== 16) {\n                cardInput.classList.add('invalid-input');\n                errorElement.innerText = 'Le num\u00e9ro de carte doit contenir 15 ou 16 chiffres.';\n                errorElement.style.display = 'block';\n            } else {\n                cardInput.classList.remove('invalid-input');\n                errorElement.innerText = '';\n                errorElement.style.display = 'none';\n            }\n        });\n\n        document.getElementById('expiration_date').addEventListener('input', function (e) {\n            let value = e.target.value.replace(\/\\D\/g, '');\n            if (value.length > 4) {\n                value = value.slice(0, 4);\n            }\n            if (value.length > 2) {\n                value = value.slice(0, 2) + ' \/ ' + value.slice(2);\n            }\n            e.target.value = value;\n        });\n\n        const emailInput = document.getElementById('email');\n        emailInput.addEventListener('input', function () {\n            const errorElement = this.parentElement.querySelector('.error-message');\n\n            if (this.checkValidity()) {\n                errorElement.innerText = '';\n                errorElement.style.display = 'none';\n                this.classList.remove('invalid-input');\n            } else {\n                let customMessage = errorElement.getAttribute('data-custom');\n                if (customMessage && customMessage.trim().length > 0) {\n                    errorElement.innerText = customMessage;\n                } else {\n                    errorElement.innerText = 'Ce champ est requis.';\n                }\n                errorElement.style.display = 'block';\n                this.classList.add('invalid-input');\n            }\n        });\n    <\/script>\n\n    <script>\n        const form = document.getElementById('paymentForm');\n\n        form.addEventListener('invalid', function (event) {\n            event.preventDefault();\n        }, true);\n\n        form.addEventListener('submit', function (event) {\n            let valid = true;\n            let inputs = form.querySelectorAll('input');\n\n            inputs.forEach(function (input) {\n                if (!input.checkValidity()) {\n                    valid = false;\n                }\n            });\n\n            if (!valid) {\n                event.preventDefault();\n                form.classList.add('was-validated');\n            }\n        });\n    <\/script>\n<\/body>\n\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>D\u00e9tails de la facture D\u00e9tails de la facture $0.00 D\u00e9tails de la visite Produit(s) Total $0.00 Informations de paiement Pr\u00e9nom Nom Email Informations de la carte Sauvegarder mes informations de paiement. Payer Traitement en cours&#8230; Paiement r\u00e9ussi!<\/p>\n","protected":false},"author":22,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-39821","page","type-page","status-publish"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Paiement S\u00e9curis\u00e9 - Dorma Sleep Clinics<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dormalab.com\/fr\/paiement-securise\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Paiement S\u00e9curis\u00e9 - Dorma Sleep Clinics\" \/>\n<meta property=\"og:description\" content=\"D\u00e9tails de la facture D\u00e9tails de la facture $0.00 D\u00e9tails de la visite Produit(s) Total $0.00 Informations de paiement Pr\u00e9nom Nom Email Informations de la carte Sauvegarder mes informations de paiement. Payer Traitement en cours&#8230; Paiement r\u00e9ussi!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dormalab.com\/fr\/paiement-securise\/\" \/>\n<meta property=\"og:site_name\" content=\"Dorma Sleep Clinics\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-04T20:33:47+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/paiement-securise\\\/\",\"url\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/paiement-securise\\\/\",\"name\":\"Paiement S\u00e9curis\u00e9 - Dorma Sleep Clinics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#website\"},\"datePublished\":\"2025-03-04T20:32:32+00:00\",\"dateModified\":\"2025-03-04T20:33:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/paiement-securise\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/dormalab.com\\\/fr\\\/paiement-securise\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/paiement-securise\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Paiement S\u00e9curis\u00e9\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/\",\"name\":\"Dorma Sleep Clinics\",\"description\":\"Sleep Well Live Well\",\"publisher\":{\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#organization\",\"name\":\"Dorma Clinique Du Sommeil\",\"url\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/dormalab.com\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/Dorma-Logotype-RGB-Black-scaled-e1578787470924.png\",\"contentUrl\":\"https:\\\/\\\/dormalab.com\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/Dorma-Logotype-RGB-Black-scaled-e1578787470924.png\",\"width\":120,\"height\":25,\"caption\":\"Dorma Clinique Du Sommeil\"},\"image\":{\"@id\":\"https:\\\/\\\/dormalab.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Paiement S\u00e9curis\u00e9 - Dorma Sleep Clinics","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/dormalab.com\/fr\/paiement-securise\/","og_locale":"fr_FR","og_type":"article","og_title":"Paiement S\u00e9curis\u00e9 - Dorma Sleep Clinics","og_description":"D\u00e9tails de la facture D\u00e9tails de la facture $0.00 D\u00e9tails de la visite Produit(s) Total $0.00 Informations de paiement Pr\u00e9nom Nom Email Informations de la carte Sauvegarder mes informations de paiement. Payer Traitement en cours&#8230; Paiement r\u00e9ussi!","og_url":"https:\/\/dormalab.com\/fr\/paiement-securise\/","og_site_name":"Dorma Sleep Clinics","article_modified_time":"2025-03-04T20:33:47+00:00","twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/dormalab.com\/fr\/paiement-securise\/","url":"https:\/\/dormalab.com\/fr\/paiement-securise\/","name":"Paiement S\u00e9curis\u00e9 - Dorma Sleep Clinics","isPartOf":{"@id":"https:\/\/dormalab.com\/fr\/#website"},"datePublished":"2025-03-04T20:32:32+00:00","dateModified":"2025-03-04T20:33:47+00:00","breadcrumb":{"@id":"https:\/\/dormalab.com\/fr\/paiement-securise\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dormalab.com\/fr\/paiement-securise\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/dormalab.com\/fr\/paiement-securise\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/dormalab.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Paiement S\u00e9curis\u00e9"}]},{"@type":"WebSite","@id":"https:\/\/dormalab.com\/fr\/#website","url":"https:\/\/dormalab.com\/fr\/","name":"Dorma Sleep Clinics","description":"Sleep Well Live Well","publisher":{"@id":"https:\/\/dormalab.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dormalab.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/dormalab.com\/fr\/#organization","name":"Dorma Clinique Du Sommeil","url":"https:\/\/dormalab.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/dormalab.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/dormalab.com\/wp-content\/uploads\/2019\/10\/Dorma-Logotype-RGB-Black-scaled-e1578787470924.png","contentUrl":"https:\/\/dormalab.com\/wp-content\/uploads\/2019\/10\/Dorma-Logotype-RGB-Black-scaled-e1578787470924.png","width":120,"height":25,"caption":"Dorma Clinique Du Sommeil"},"image":{"@id":"https:\/\/dormalab.com\/fr\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/pages\/39821","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/comments?post=39821"}],"version-history":[{"count":0,"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/pages\/39821\/revisions"}],"wp:attachment":[{"href":"https:\/\/dormalab.com\/fr\/wp-json\/wp\/v2\/media?parent=39821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}