Téléchargements
Portails Captifs
4 designs disponibles avec prévisualisation
Portails Captifs Personnalisés
Mikhmon
📚 Documentation
Guide d'utilisation, installation, dépannage et FAQ
Un abonnement actif est nécessaire pour accéder à cette fonctionnalité.
Le Service VPN ne supporte pas les espaces ni caractères spéciaux.
Actuel :
Lettres, chiffres, - et _ uniquement · min. 3 caractères
La page sera rechargée après le renommage. Utilisez le nouveau pseudo à la prochaine connexion.
Nom du portail
Paiement unique • Accès à vie • Mises à jour incluses
Ce code intercepte le formulaire de connexion de votre portail captif et redirige l'utilisateur vers la page de paiement/vérification OTP avant de se connecter au hotspot.
Importez votre fichier login.html et laissez-nous faire le travail !
ou cliquez pour parcourir
Fichiers acceptés : .html, .htm<!-- ============================================
EVISIONS CONNECT - INTÉGRATION OTP
Formulaire caché pour la redirection
============================================ -->
<!-- Formulaire caché pour soumission MikroTik (après OTP) -->
<form name="sendin" action="$(link-login-only)" method="post" style="display:none">
<input type="hidden" name="username" />
<input type="hidden" name="password" />
<input type="hidden" name="dst" value="$(link-orig)" />
<input type="hidden" name="popup" value="true" />
</form>
<!-- Script MD5 requis pour CHAP -->
<script src="/md5.js"></script>
Copiez ce code et collez-le juste après la balise <body> de votre
page login.html
Assurez-vous que le fichier md5.js est présent à la racine de votre
hotspot
<!-- ============================================
EVISIONS CONNECT - INTÉGRATION OTP
Script de redirection vers paiement
============================================ -->
<script>
// =============================================
// CONFIGURATION - VOS PARAMÈTRES EVISIONS
// =============================================
const EVISIONS_CONFIG = {
adminId: '%%ADMIN_ID%%',
paymentUrl: '%%PAYMENT_URL%%',
dnsName: '%%DNS_NAME%%'
};
// =============================================
// FONCTION D'INTERCEPTION DU LOGIN
// =============================================
function doLogin() {
// Chercher le champ username visible (pas le hidden)
const usernameField = document.getElementById('inputUser')
|| document.querySelector('input[name="username"]:not([type="hidden"])')
|| document.querySelector('form:not([name="sendin"]) input[name="username"]')
|| document.login?.username;
if (!usernameField) {
console.error('EVISIONS: Champ username non trouvé');
return true;
}
const username = usernameField.value ? usernameField.value.trim() : '';
// Mode ticket: password = username si pas de champ password séparé
const passwordField = document.querySelector('input[name="password"]:not([type="hidden"])');
const password = passwordField ? passwordField.value : username;
if (!username) {
alert('Veuillez entrer votre code de connexion.');
return false;
}
let targetUrl = EVISIONS_CONFIG.paymentUrl
+ '?mode=display'
+ '&user=' + encodeURIComponent(username)
+ '&password=' + encodeURIComponent(password);
if (EVISIONS_CONFIG.adminId) {
targetUrl += '&adminId=' + encodeURIComponent(EVISIONS_CONFIG.adminId);
}
if (EVISIONS_CONFIG.dnsName) {
targetUrl += '&dnsName=' + encodeURIComponent(EVISIONS_CONFIG.dnsName);
}
console.log('EVISIONS: Redirection vers', targetUrl);
window.location.href = targetUrl;
return false;
}
// =============================================
// CONNEXION AUTOMATIQUE (callback après OTP)
// =============================================
function evisions_autoLogin(username, password) {
if (typeof hexMD5 === 'function' && document.sendin) {
document.sendin.username.value = username;
document.sendin.password.value = hexMD5('$(chap-id)' + password + '$(chap-challenge)');
document.sendin.submit();
} else if (document.login) {
document.login.username.value = username;
if (document.login.password) document.login.password.value = password;
document.login.submit();
}
}
// =============================================
// INITIALISATION AU CHARGEMENT
// =============================================
document.addEventListener('DOMContentLoaded', function() {
const params = new URLSearchParams(window.location.search);
const autoUsername = params.get('username');
const autoPassword = params.get('password');
if (autoUsername && autoPassword) {
setTimeout(function() {
evisions_autoLogin(autoUsername, autoPassword);
}, 500);
return;
}
// Attachement aux formulaires (éviter sendin)
if (document.login) {
document.login.onsubmit = function() { return doLogin(); };
}
const loginForm = document.getElementById('loginForm');
if (loginForm) {
loginForm.onsubmit = function(e) { e.preventDefault(); return doLogin(); };
}
// Chercher tout formulaire avec un champ username visible
document.querySelectorAll('form').forEach(function(form) {
if (form.name === 'sendin') return; // Ignorer le formulaire caché
const usernameInput = form.querySelector('input[name="username"]:not([type="hidden"])');
if (usernameInput) {
form.onsubmit = function(e) { e.preventDefault(); return doLogin(); };
}
});
});
</script>
Collez ce code juste avant la balise </body> de votre page
login.html
Les valeurs adminId, paymentUrl et dnsName
sont déjà remplies avec vos paramètres
Si votre formulaire utilise des sélecteurs différents, modifiez les lignes de récupération du username/password
<!-- ============================================================
EVISIONS CONNECT - CODE D'INTÉGRATION OTP COMPLET
⚠️ IMPORTANT - AVANT DE COLLER CE CODE :
Supprimez d'abord le code existant suivant de votre fichier login.html :
<form name="sendin" action="$(link-login-only)" method="post">
<input type="hidden" name="username" />
<input type="hidden" name="password" />
<input type="hidden" name="dst" value="$(link-orig)" />
<input type="hidden" name="popup" value="true" />
</form>
<script type="text/javascript" src="/md5.js"></script>
<script type="text/javascript">
<!--
function doLogin() {
document.sendin.username.value = document.login.username.value;
document.sendin.password.value = hexMD5('$(chap-id)' + document.login.username.value + '$(chap-challenge)');
document.sendin.submit();
return false;
}
//-->
</script>
Instructions:
- Le formulaire caché : collez après <body>
- Le script : collez avant </body>
============================================================ -->
<!-- ========== PARTIE 1 : FORMULAIRE CACHÉ (après <body>) ========== -->
<form name="sendin" action="$(link-login-only)" method="post" style="display:none">
<input type="hidden" name="username" />
<input type="hidden" name="password" />
<input type="hidden" name="dst" value="$(link-orig)" />
<input type="hidden" name="popup" value="true" />
</form>
<script src="/md5.js"></script>
<!-- ========== PARTIE 2 : SCRIPT PRINCIPAL (avant </body>) ========== -->
<script>
// EVISIONS CONNECT - CONFIGURATION
const EVISIONS_CONFIG = {
adminId: '%%ADMIN_ID%%',
paymentUrl: '%%PAYMENT_URL%%',
dnsName: '%%DNS_NAME%%'
};
function doLogin() {
// Chercher le champ username visible (pas le hidden du formulaire sendin)
const usernameField = document.getElementById('inputUser')
|| document.querySelector('input[name="username"]:not([type="hidden"])')
|| document.querySelector('form:not([name="sendin"]) input[name="username"]')
|| document.login?.username;
if (!usernameField) return true;
const username = usernameField.value ? usernameField.value.trim() : '';
const passwordField = document.querySelector('input[name="password"]:not([type="hidden"])');
const password = passwordField ? passwordField.value : username;
if (!username) {
alert('Veuillez entrer votre code de connexion.');
return false;
}
let targetUrl = EVISIONS_CONFIG.paymentUrl
+ '?mode=display'
+ '&user=' + encodeURIComponent(username)
+ '&password=' + encodeURIComponent(password);
if (EVISIONS_CONFIG.adminId) {
targetUrl += '&adminId=' + encodeURIComponent(EVISIONS_CONFIG.adminId);
}
if (EVISIONS_CONFIG.dnsName) {
targetUrl += '&dnsName=' + encodeURIComponent(EVISIONS_CONFIG.dnsName);
}
window.location.href = targetUrl;
return false;
}
function evisions_autoLogin(username, password) {
if (typeof hexMD5 === 'function' && document.sendin) {
document.sendin.username.value = username;
document.sendin.password.value = hexMD5('$(chap-id)' + password + '$(chap-challenge)');
document.sendin.submit();
} else if (document.login) {
document.login.username.value = username;
if (document.login.password) document.login.password.value = password;
document.login.submit();
}
}
document.addEventListener('DOMContentLoaded', function() {
const params = new URLSearchParams(window.location.search);
const autoUsername = params.get('username');
const autoPassword = params.get('password');
if (autoUsername && autoPassword) {
setTimeout(function() { evisions_autoLogin(autoUsername, autoPassword); }, 500);
return;
}
if (document.login) {
document.login.onsubmit = function() { return doLogin(); };
}
const loginForm = document.getElementById('loginForm');
if (loginForm) {
loginForm.onsubmit = function(e) { e.preventDefault(); return doLogin(); };
}
// Ignorer le formulaire sendin
document.querySelectorAll('form').forEach(function(form) {
if (form.name === 'sendin') return;
const usernameInput = form.querySelector('input[name="username"]:not([type="hidden"])');
if (usernameInput) {
form.onsubmit = function(e) { e.preventDefault(); return doLogin(); };
}
});
});
</script>
N'oubliez pas d'ajouter votre domaine de paiement dans la configuration Walled Garden de votre routeur MikroTik pour que la redirection fonctionne correctement.
Avant de coller le code d'intégration, vous devez supprimer le
formulaire sendin
et la fonction doLogin() existants dans votre fichier login.html.
Ces éléments seront remplacés par notre version compatible OTP.
<form name="sendin" action="$(link-login-only)" method="post">
<input type="hidden" name="username" />
<input type="hidden" name="password" />
<input type="hidden" name="dst" value="$(link-orig)" />
<input type="hidden" name="popup" value="true" />
</form>
<script type="text/javascript" src="/md5.js"></script>
<script type="text/javascript">
<!--
function doLogin() {
document.sendin.username.value = document.login.username.value;
document.sendin.password.value = hexMD5('$(chap-id)' + document.login.username.value + '$(chap-challenge)');
document.sendin.submit();
return false;
}
//-->
</script>
Recherchez et supprimez le formulaire sendin et la fonction
doLogin() existants (voir ci-dessus)
Utilisez le bouton "Copier Tout" ci-dessus
Le formulaire caché après <body>, le script avant
</body>
Ajoutez votre domaine de paiement dans la configuration MikroTik
Connectez-vous à votre hotspot et vérifiez que la redirection fonctionne