Classe de contrôle et de validation de RIB français - Apprendre-PHP.com

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

Classe de contrôle et de validation de RIB français

Classe de contrôle et de validation de RIB français

Ce court tutoriel vous présente une classe qui permet de créer des objets encapsulant les données d'un numéro de RIB. Elle peut s'utiliser de deux manières différentes : soit créer des objets RIB ou bien servir comme système de validation des informations bancaires grâce à ses méthodes statiques. Bien que très peu extraordinaire en soit, cette source s'avère particulièrement pratique et efficace dans lors du développement d'applications de comptabilité par exemple.

Présentation de la source

Cette courte et simple classe permet de créer des objets de type RIBValidator pour valider les informations d'un compte bancaire. Comme vous le savez sans doute, un RIB est constitué de quatre composantes : le code unique de la banque, le code unique de l'agence qui tient le compte, le numéro du compte et la clé RIB. Ce que vous ignorez peut-être en revanche, c'est que cette série de chiffres et de lettres n'est pas construite au hasard. En effet, le grand secret d'un RIB réside dans la clé qui est calculée à partir d'un algorithme utilisant les trois autres parties du RIB.

Cette classe s'appuie sur cet algorithme de calcul de clé RIB que vous pouvez découvrir sur Wikipédia à l'adresse suivante : http://fr.wikipedia.org/wiki/Cl%C3%A9_RIB. Entrons dans le vif du sujet et présentons le code de la classe RIB_FR. Nous verrons ensuite quelques exemples d'utilisation.

Code source de la classe RIBValidator

<?php
 
class RIBValidator
{
private $bankCode;
private $agencyCode;
private $accountNumber;
private $ribKey;
 
public function __construct($bankCode, $agencyCode, $accountNumber, $ribKey)
{
$this->bankCode = (int) $bankCode;
$this->agencyCode = (int) $agencyCode;
$this->accountNumber = (string) $accountNumber;
$this->ribKey = (int) $ribKey;
}
 
public function isValid()
{
$account = (int) strtr(strtoupper($this->accountNumber), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '12345678912345678923456789');
 
$key = 97 - ((89 * $this->bankCode + 15 * $this->agencyCode + 3 * $account) % 97);
 
return $key === $this->ribKey;
}
}

Utilisation de la classe

<?php
 
$validator = new RIBValidator('00123', '00123', '000012536ML', '64');
 
if ($validator->isValid()) {
echo 'Account number is valid.';
} else {
echo 'Account number is not valid.';
}

Tests unitaires avec PHPUnit

<?php
 
require __DIR__.'/../RIBValidator.php';
 
class RIBValidatorTest extends PHPUnit_Framework_TestCase
{
/** @dataProvider provideAccountNumbers */
public function testValidAccountNumbers($bank, $agency, $account, $key)
{
$validator = new RIBValidator($bank, $agency, $account, $key);
 
$this->assertTrue($validator->isValid());
}
 
public function testInvalidAccountNumber()
{
$validator = new RIBValidator('00123', '00123', '000012536ML', '65');
 
$this->assertFalse($validator->isValid());
}
 
public function provideAccountNumbers()
{
return array(
// add a list of valid account numbers here...
array('00123', '00123', '000012536ML', '64'),
);
}
}

 



Les commentaires

1. Par Julien le vendredi 26 septembre 2008 à 12:12

bonjour,

J'utilise se bout de code depuis quelques temps maintenant. ( Merci très pratique ).
Mais j'ai eu a plusieur reprise des clé RIB Valide qui ne passait pas.
Je me suis donc penché sur la question. Et j'ai été obligé de transformé une partie du code.
------------------------------------
Code d'origine
------------------------------------
if($iCleRib<0)
{
$sCleRib = '0'. (string)iCleRib;
}
else
{
$sCleRib = (string) $iCleRib;
}
------------------------------------
Code Modifié
------------------------------------
if(strlen($iCleRib ) < 2)
{
$sCleRib = '0'. (string)$iCleRib;
}
else
{
$sCleRib = (string) $iCleRib;
}
------------------------------------
Je pense qu'il y a une partie du code dont je n'ai pas saisi le fonctionnement.
Notamment l'utilisation de $iCleRib
dans se cas de figure. A moins que le test soit fait avec 10 au lieu de 0 pour vérifier que $iCleRib soit composer de 2 caractères.
Merci de m'éclairé.
Bonne continuation.

2. Par RobertVonTagada le mercredi 04 mars 2009 à 10:10

Bonjour !

Merci pour cette class bien utils !

Même problème que Julien, les RIB avec une clef commençant par 0 sont "invalide".

En faite, c'est la comparaison $sCleRib === self::calculerCleRib($sCodeBanque, $sCodeGuichet, $sNumeroCompte) qui n'est pas "bonne".

En gros, les deux valeurs testé n'ont pas le même type, donc soit on cast soit on se contente de tester les valeurs et pas le type par un simple ==

--------------
if($sCleRib == self::calculerCleRib($sCodeBanque, $sCodeGuichet, $sNumeroCompte))
{
$bCorrect = true;
}