Bonjour,

j'ai une petite application qui teste un code IBAN, et me dis si celui-ci est correct, s'il y a des erreurs et propose des suggestions.
J'ai utilisé la librairie suivante: https://packagist.org/packages/globalcitizen/php-iban

J'essaie d'ajouter un Webservice, qui transforme le code IBAN en ancien format de numéro de compte BBAN (Belge), via ce Webservice.
http://www.ibanbic.be/IBANBIC.asmx?op=getBelgianBBAN

Je débute avec les API, c'est pourquoi, j'ai lu et regardé quelque vidéos avant de m'y coller.

Voici où j'en suis dans mon code. Dans traitement.php, j'ai ajouté une fonction qui fait appel au Webservice et lui passe le code IBAN.
Le Webservice est sensé me renvoyer un XML

J'ai cette erreur "Erreur d’analyse XML : mal formé
Emplacement : http://localhost/ibanV2/index.php
Numéro de ligne 1, Colonne 6 :"

Et je ne trouve pas pourquoi...

index.php
Code html : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><!---rend responsive bootstrap-->
    <meta charset="UTF-8">
    <title>Iban Validator</title>
    <!--feuille de style propre à Bootstrap, doit venir avant mes propores feuilles de style-->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
    <link rel="stylesheet" href="css/style.css" type="text/css">
</head>
<body>
 
    <div class="container">
        <!--div pour les message renvoyé par le server-->
        <div id="errormessage" class="alert alert-danger"></div>
        <div id="successmessage" class="alert alert-success"></div>
        <h2>IBAN Validator</h2>
        <div class="card text-white bg-secondary mb-3">
            <form method="POST" action="traitement.php" id="formiban">
                <div class="form-group">
                    <label for="iban">Entrez votre code IBAN</label>
                    <input name="iban" type="text" class="form-control" placeholder="votre IBAN">
                </div>
 
                <div class="col text-center">
                    <input type="submit" name="submit" value="Submit" class="btn btn-primary">
                </div>
             </form>
        </div>
        <div id="bban" class="alert alert-primary"></div>
    </div>
 
 
    <!--à placer avant la balise fermante body-->
    <!--cdn JQuery, indispensable pour l'utilisation de Bootstrap-->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <!--cdn popper, indispensable pour la dernière version de Bootstrap-->
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <!--plugin js de Bootstrap-->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
    <script  src="script.js"></script>
</body>
</html>

script.js
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
"use strict";
 
$(document).ready(function(){
    //au clic sur le boutton submit, envoi des données du formulaire vers le server et récupère les messages renvoyé par le server.
    $('#formiban').on('submit', function(e){
        e.preventDefault();//evite le comportement par defaut, l'envoi du formulaire.
 
        //cache les messages d'alert précédent lors de l'envoi du formulaire et je met un text vide
        $('.alert').text('').hide().stop();//stop annule l'annimation et un comportement bizzare si je clic plusieurs fois sur le boutton.
 
        var url = $(this).attr('action');//renvoi vers le fichier qui est dans le action du formulaire
        var method = $(this).attr('method');//même chose pour la method du formulaire
        var data = $(this).serialize();//je récupère les données du formulaire grace à serialize, elles seront déjà formatée
        //console.log(data);
 
        //ajax pour la validation IBAN, erreur ou suggestions.
        $.ajax({
            url: url,
            type: method,
            data: data,//données envoyées au server
            dataType: 'json',//type de donnée en retour du server
            success: function(response){//en cas de succès, je prends la réponse du server
                console.log(response);
                if(response.success){
                    //affiche avec un slide vers le bas, la div avec le message de succès avec un délais de 2 sec
                    $('#successmessage').text(response.success).slideDown().delay(5000).slideUp();
                    $('form').get(0).reset();//réinitialise le formulaire, efface son contenu.
                }
                if(response.errors){
                    var errorString = '';//je stock les erreurs dans une variable
                    //je boucle dans le tableau d'erreur renvoyé par le server
                    $.each(response.errors, function(key, value){
                        errorString += '<p>'+value+'</p>';//et je mets les erreur dans ma variable
                    });
                    //affiche avec un slide vers le bas, la div avec les messages d'erreurs avec un délais de 2 sec
                    $('#errormessage').html(errorString).slideDown().delay(5000).slideUp();
                    //.html à la différence de .text va interpreter les balise <p> ci-dessus
                }
            },
            error: function(message) {//en cas d'erreur renvoyée par le server, hors erreur dans les champs du formulaire, ex: erreur de syntax
                console.log(message);
            }
        });
 
        //ajax pour le code BBAN
        $.ajax({
            url: url,
            type: method,
            data: data,//données envoyées au server
            dataType: 'xml',//type de donnée en retour du server
            success: function(bban){
                console.log(bban);
                if(bban.success){
 
                }
                    //$('#bban').text(response.success).slideDown().delay(5000).slideUp();
            },
        });
    });
});

traitement.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
namespace iban;
require_once __DIR__ . '/vendor/autoload.php';
use IBAN;
//use WebService;
 
if(!empty($_POST))
{
    //extract($_POST);//extrait les données du POST et permet de les pouvoir appeler les variables contenuent dans le POST $variable
    $iban = $_POST['iban'];
    $myIban = new IBAN($iban);
 
    $errors = [];//Tableau qui contiendra les erreurs s'il y en a.
 
    //si le champs IBAN est vide, je mets le message d'erreur dans le tableau des erreurs
    if(empty($iban)){
        array_push($errors, 'Vous devez rentrer votre IBAN!');
    }
 
    //Vérifiez un numéro IBAN. Tolère les espaces, les préfixes "IBAN ...", les tirets, les entrées en minuscules, etc.
    if(!$myIban->Verify()) {
        array_push($errors, 'IBAN invalide! Mauvais format!');
    }
 
    //Vérifier la somme de contrôle d'un IBAN - code modifié à partir de la classe Validate_Finance PEAR
    if(!$myIban->VerifyChecksum()) {
        array_push($errors, 'IBAN invalide! Erreur checksum!');
    }
 
    //Suggestion ou double suggestion si erreur ça dépend des cas et ça ne fonctionne pas toujours
    $suggestions = $myIban->MistranscriptionSuggestions($iban);
    if (is_array($suggestions)) {
        if (count($suggestions) == 1) {
            array_push($errors, "Vous voulez dire: " . $suggestions[0] . " ?");
        } elseif (count($suggestions) > 1) {
            array_push($errors, "ou peut-être: ");
            $done = 0;
            foreach ($suggestions as $suggestion) {
                if ($done > 0) {
                    array_push($errors, "ou");
                }
                array_push($errors, "'" . $suggestion . "'");
                $done++;
            }
        }
    }
 
    function getBelgianBBAN($iban)
    {
        $bban = 'http://www.ibanbic.be/IBANBIC.asmx/getBelgianBBAN?Value=' . $iban;
        json_encode($bban);//j'encode la réponse au format JSON avant de l'envoyée au navigateur.
        return $bban;
    }
 
    //$ws = new WebService();
    $bban = getBelgianBBAN($iban);
    //var_dump('bban= ' . $bban);
    echo $bban;
 
    //s'il y a des erreurs, je les stock dans une variable $response qui sera envoyée au navigateur
    if(count($errors)){
        $response = ['errors'=>$errors];
        echo json_encode($response);//j'encode la réponse au format JSON
        exit;
    }
 
    $response = ['success'=>'IBAN valide'];//S'il n'y a pas d'erreur
 
    echo json_encode($response);exit;//j'encode la réponse au format JSON avant de l'envoyée au navigateur.
 
}