Cześć,
zapiąłem to w prostą klasę bo potrzbowałem na już. Oczywiście można ją rozbudować o wiele ale do moich celów mi wystarcza.
Kody rozliczeniowe wziąłem z NBP:
http://www.nbp.pl/home.aspx?f=/banki_w_pol.../ewidencja.htmlPo odpowiednim przewormatowaniu pliku
http://www.nbp.pl/banki_w_polsce/ewidencja/dz_bank_jorg.txt można
tablicę zrobić trochę inaczej niż poniżej, dodając np nr telefonu, adres banku itp. Ale to już onanizm intelektualny.
Trochę na kolanie więc bądżcie łaskawi za styl :-) Nr rachunku jest prawdziwy, prześlijcie coś na piwko za poświęcony czas :-)
<?php
/**
* Klasa walidacji nr rachunku bankowego wg NRB
* autor: Darek Wapiński darek@wapinski.us 2014
*
* Jak używać:
*
* <?php
*
* // nr konta w konstruktorze mozemy podac w dowolnym formatowaniu
* // spacje zostaną usuniete
*
* header("Content-type: text/plain");
* $nrb = new NRB("37114020040000310242321556");
*
* if ($nrb->poprawny()) {
* echo $nrb->formatuj();
* echo "\n";
* echo $nrb->dekodujNazwe();
* } else {
* echo "\n$nrb->blad: ".$nrb->formatuj();
* }
* ?>
*
* wynik:
*
* 37 1140 2004 0000 3102 4232 1556
* mBank SA - O. Bankowości Detalicznej
*
* jak widać powyżej, nr rachunku zostanie odpowiedni sformatowany
*/
class NRB {
public $numerRachunku;
public $numerRachunkuSformatowany;
public $nazwaBanku;
public $status;
public $blad;
/**
* __construct($string)
* Kontruktor klasy
* Funkcja pobiera nr rachunku i usuwa zbędne znaki z numeru
* @param string $nrRachunku
*/
function __construct ($nrRachunku) {
echo "Brak nr rachunku przy inicjalizacji klasy: ".__CLASS__
; } else {
$this->numerRachunku = $nrRachunku;
/* usuwamy zbędne znaki */
$puste = array(' ', '-', '_', '.', ',','/', '|'); /* pozostawiamy wielkie litery i cyfry */
/* Jeżeli na początku są cyfry, to dopisujemy PL, inne kraje muszą być jawnie wprowadzone
if (($temp{0} <= '9') && ($temp{1}<='9')) {
$this->numerRachunku = 'PL'.$temp;
}
- pomijam, do późniejszego rozwoju funkcji */
$this->numerRachunku = $temp;
$this->blad = "";
}
}
/**
* formatuj()
* Funkcja formatuje string z numerek konta do postaci:
* ## #### #### #### #### #### ####
* @return string
*/
public function formatuj() {
$suma = substr ($this->numerRachunku, 0
, 2
); // 2 cyfry $nr_roz1 = substr ($this->numerRachunku, 2
, 4
); // pierwsze 4 cyfry $nr_roz2 = substr ($this->numerRachunku, 6
, 4
); // drugie 4 cyfry $nr_rach1 = substr ($this->numerRachunku, 10
, 4
); // pierwsze 4 cyfry $nr_rach2 = substr ($this->numerRachunku, 14
, 4
); // drugie 4 cyfry $nr_rach3 = substr ($this->numerRachunku, 18
, 4
); // trzecie 4 cyfry $nr_rach4 = substr ($this->numerRachunku, 22
, 4
); // czwarte 4 cyfry $this->numerRachunkuSformatowany = $suma.' '.$nr_roz1.' '.$nr_roz2.' '.$nr_rach1.' '.$nr_rach2.' '.$nr_rach3.' '.$nr_rach4;
return $this->numerRachunkuSformatowany;
}
public function poprawny()
{
/* usuwamy zbędne znaki */
$puste = array(' ', '-', '_', '.', ',','/', '|'); // Sprawdzenie czy przekazany numer zawiera 26 znaków
$i = strlen($this->numerRachunku); $this->blad = "Rachunek nie zawiera 26 cyfr: $nrb->numerRachunku (zawiera $i cyfr)";
return false;
}
// Zdefiniowanie tablicy z wagami poszczególnych cyfr
$aWagiCyfr = array(1
, 10
, 3
, 30
, 9
, 90
, 27
, 76
, 81
, 34
, 49
, 5
, 50
, 15
, 53
, 45
, 62
, 38
, 89
, 17
, 73
, 51
, 25
, 56
, 75
, 71
, 31
, 19
, 93
, 57
); // Dodanie kodu kraju (w tym przypadku dodajemy kod PL)
$iNRB = $iNRB.'2521';
// Wyzerowanie zmiennej
$iSumaCyfr = 0;
// Pętla obliczająca sumę cyfr w numerze konta
for ($i = 0; $i < 30; $i++) {
$iSumaCyfr += $iNRB[29 - $i] * $aWagiCyfr[$i];
}
// Sprawdzenie czy modulo z sumy wag poszczegolnych cyfr jest rowne 1
return ($iSumaCyfr % 97 == 1);
}
public function dekodujNazwe()
{
/* tablica nr rozliczeniowy -> nazwa => ograniczylem sie do mBank i Millenium poniewaz dluższy kod nie wejdzie we wpisie. */
$bank['11401977'] = 'mBank SA - II O. Korporacyjny Warszawa';
$bank['11401980'] = 'mBank SA - XIX F. w Łodzi (O.Korporacyjny Łódź)';
$bank['11401993'] = 'mBank SA - O. Korporacyjny Kalisz';
$bank['11402004'] = 'mBank SA - O. Bankowości Detalicznej';
$bank['11402017'] = 'mBank SA - O. Bankowości Detalicznej';
$bank['11402020'] = 'mBank SA - O. Korporacyjny Kielce';
$bank['11402059'] = 'mBank SA - F. Nr 3 (O. Bankowości Detalicznej)';
$bank['11402062'] = 'mBank SA - III O. Korporacyjny Warszawa';
$bank['11402075'] = 'mBank SA - O.Korporacyjny Nowy Sącz';
$bank['11402088'] = 'mBank SA - O. Korporacyjny Toruń';
$bank['11402091'] = 'mBank SA - O. Korporacyjny Wałbrzych';
$bank['11402105'] = 'mBank SA - IV Oddział Korporacyjny Warszawa';
$bank['11402118'] = 'mBank SA - O. Korporacyjny Koszalin';
$bank['11402121'] = 'mBank SA - Oddział Bankowości Detalicznej';
$bank['11420008'] = 'mBank SA - Oddział Bankowości Detalicznej';
$bank['11600006'] = 'Bank Millennium SA - Centrala';
$bank['11602202'] = 'Bank Millennium SA - Millennium - Centrum Rozliczeniowe';
/* .... tutaj kolejne banki */
/* mapowanie nr_rozliczeniowy -> nazwa */
$nr_rozliczeniowy = substr($this->numerRachunku, 2
, 8
); $nazwa_banku = $bank[''.$nr_rozliczeniowy.''] !== NULL ? $bank[''.$nr_rozliczeniowy.''] : $this->blad = "Nie odnalazłem nazwy banku";
$this->nazwaBanku = $nazwa_banku;
return $this->nazwaBanku;
}
}
header("Content-type: text/plain"); $nrb = new NRB("37114020040000310242321556");
if ($nrb->poprawny()) {
echo $nrb->dekodujNazwe(); } else {
echo "\n$nrb->blad: ".$nrb->formatuj(); }
korzystajcie dowolnie.
Darek Wapiński
darek@wapinski.us