Skip to content

Instantly share code, notes, and snippets.

@malja
Last active July 17, 2023 18:23
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save malja/4fbe9b69878fc81dd2dd77c57fc059a9 to your computer and use it in GitHub Desktop.
Save malja/4fbe9b69878fc81dd2dd77c57fc059a9 to your computer and use it in GitHub Desktop.
Validace čísla bankovního účtu pro Českou republiku v PHP.
<?php
/**
* Funkce pro kontrolu čísla bankovního účtu v ČR.
* @param $number string Řetězec obsahující číslo bankovního účtu ve formátu:
* [prefix]-základní část/kód bank.
* Prefix je volitelná část obsahující až šest čísel. Od
* základní části je oddělen pomlčnou.
* Základní část se skládá ze dvou až deseti čísel.
* Poslední částí je kód banky. Ten je složen ze čtyř čísel
* oddělených od základní části lomenem.
*
* @param $return_bank_name boolean True pro vrácení jména banky v případně úspěšné
* validace místo výchozí hodnoty true.
*
* @return boolean V případě úspěšné validace vrací true, nebo jméno banky (viz.
* parametr $return_bank_name). Při neúspěchu vrací vždy false.
*
* @note Více o algoritmu na validaci čísla bankovního účtu je možné najít v
* dokumentu na adrese: http://www.cnb.cz/cs/platebni_styk/iban/download/TR201.pdf
* Konkrétně od strany 48 dál.
*
* @note Seznam všech aktuálně působících bank je možné najít ve formátu
* CSV na stránce: https://www.cnb.cz/cs/platebni_styk/ucty_kody_bank
*
* Changelog:
*
* - 20230211 - Aktualizován seznam bank, děkuji @Dacesilian.
*/
function CheckBankAccountNumber( $number, $return_bank_name = false ) {
// Váhy pro kontrolu prefixu
$prefix_weights = [ 10, 5, 8, 4, 2, 1 ];
// Váhy pro kontrolu základní části čísla
$base_weights = [ 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ];
// Výpis všech bank působících v ČR k datu 11. 02. 2023
$banks = [
"0100" => "Komerční banka, a.s.",
"0300" => "Československá obchodní banka, a. s.",
"0600" => "MONETA Money Bank, a.s.",
"0710" => "ČESKÁ NÁRODNÍ BANKA",
"0800" => "Česká spořitelna, a.s.",
"2010" => "Fio banka, a.s.",
"2060" => "Citfin, spořitelní družstvo",
"2070" => "TRINITY BANK a.s.",
"2100" => "Hypoteční banka, a.s.",
"2200" => "Peněžní dům, spořitelní družstvo",
"2220" => "Artesa, spořitelní družstvo",
"2250" => "Banka CREDITAS a.s.",
"2260" => "NEY spořitelní družstvo",
"2275" => "Podnikatelská družstevní záložna",
"2600" => "Citibank Europe plc, organizační složka",
"2700" => "UniCredit Bank Czech Republic and Slovakia, a.s.",
"3030" => "Air Bank a.s.",
"3050" => "BNP Paribas Personal Finance SA, odštěpný závod",
"3060" => "PKO BP S.A., Czech Branch",
"3500" => "ING Bank N.V.",
"4000" => "Max banka a.s.",
"4300" => "Národní rozvojová banka, a.s.",
"5500" => "Raiffeisenbank a.s.",
"5800" => "J&T BANKA, a.s.",
"6000" => "PPF banka a.s.",
// Do 31. 12. 2021 Equa Bank a.s.
"6100" => "Raiffeisenbank a.s.",
"6200" => "COMMERZBANK Aktiengesellschaft, pobočka Praha",
"6210" => "mBank S.A., organizační složka",
"6300" => "BNP Paribas S.A., pobočka Česká republika",
"6700" => "Všeobecná úverová banka a.s., pobočka Praha",
"6800" => "Sberbank CZ, a.s. v likvidaci",
"7910" => "Deutsche Bank Aktiengesellschaft Filiale Prag, organizační složka",
"7950" => "Raiffeisen stavební spořitelna a.s.",
"7960" => "ČSOB Stavební spořitelna, a.s.",
"7970" => "MONETA Stavební Spořitelna, a.s.",
"7990" => "Modrá pyramida stavební spořitelna, a.s.",
"8030" => "Volksbank Raiffeisenbank Nordoberpfalz eG pobočka Cheb",
"8040" => "Oberbank AG pobočka Česká republika",
"8060" => "Stavební spořitelna České spořitelny, a.s.",
"8090" => "Česká exportní banka, a.s.",
"8150" => "HSBC Continental Europe, Czech Republic",
"8190" => "Sparkasse Oberlausitz-Niederschlesien",
"8198" => "FAS finance company s.r.o.",
"8199" => "MoneyPolo Europe s.r.o.",
"8200" => "PRIVAT BANK der Raiffeisenlandesbank Oberösterreich Aktiengesellschaft, pobočka Česká republika",
"8220" => "Payment execution s.r.o.",
"8230" => "ABAPAY s.r.o.",
"8240" => "Družstevní záložna Kredit, v likvidaci",
"8250" => "Bank of China (CEE) Ltd. Prague Branch",
"8255" => "Bank of Communications Co., Ltd., Prague Branch odštěpný závod",
"8265" => "Industrial and Commercial Bank of China Limited, Prague Branch, odštěpný závod",
"8270" => "Fairplay Pay s.r.o.",
"8280" => "B-Efekt a.s.",
"8293" => "Mercurius partners s.r.o.",
"8299" => "BESTPAY s.r.o.",
"8500" => "Multitude Bank p.l.c.",
];
// Kontrola formátu.
if(!preg_match('/^(([0-9]{0,6})-)?([0-9]{2,10})\/([0-9]{4})$/', $number, $parts)) {
return false;
}
// Kontrola prefixu
if ( !empty( $parts[2] ) ) {
// Doplnění na 6 číslic nulami zleva
$prefix = str_pad( $parts[2], 6, "0", STR_PAD_LEFT );
// Suma všech čísel pronásobených jejich váhami
$sum = 0;
for( $i = 0; $i < 6; $i++ ) {
$sum += intval( $prefix[ $i ] ) * $prefix_weights[ $i ];
}
// Kontrola na dělitelnost 11
if ( $sum % 11 != 0 ) {
return false;
}
}
// Doplnění na 10 číslic nulami zleva
$base = str_pad( $parts[3], 10, "0", STR_PAD_LEFT );
// Suma všech číslic pronásobených jejich vahami
$sum = 0;
for( $i = 0; $i < 10; $i++ ) {
$sum += intval( $base[ $i ] ) * $base_weights[ $i ];
}
// Kontrola na dělitelnost 11
if ( $sum % 11 != 0 ) {
return false;
}
// Kontrola bankovního čísla
$code = $parts[4];
if ( empty( $banks[ $code ] ) ) {
return false;
}
if ( $return_bank_name ) {
return $banks[ $code ];
} else {
return true;
}
}
///////////////////////////////////////////////////////////////////////////////
// Příklad použití
///////////////////////////////////////////////////////////////////////////////
var_dump( CheckBankAccountNumber( "19-2000145399/0800", true ) );
var_dump( CheckBankAccountNumber( "145254386/2100", false ) );
?>
@holantomas
Copy link

Dik, pomohlo, ale tady mas chybu, kod je 8060 zapomnel jsi na nulu.

@malja
Copy link
Author

malja commented May 24, 2018

@holantomas, opraveno, děkuji za upozornění. (y)

@Dacesilian
Copy link

Dacesilian commented Feb 10, 2023

Ahoj, přidávám aktuální seznam bank podle číselníku.

$banks = [
        "0100" => "Komerční banka, a.s.",
        "0300" => "Československá obchodní banka, a. s.",
        "0600" => "MONETA Money Bank, a.s.",
        "0710" => "ČESKÁ NÁRODNÍ BANKA",
        "0800" => "Česká spořitelna, a.s.",
        "2010" => "Fio banka, a.s.",
        "2060" => "Citfin, spořitelní družstvo",
        "2070" => "TRINITY BANK a.s.",
        "2100" => "Hypoteční banka, a.s.",
        "2200" => "Peněžní dům, spořitelní družstvo",
        "2220" => "Artesa, spořitelní družstvo",
        "2250" => "Banka CREDITAS a.s.",
        "2260" => "NEY spořitelní družstvo",
        "2275" => "Podnikatelská družstevní záložna",
        "2600" => "Citibank Europe plc, organizační složka",
        "2700" => "UniCredit Bank Czech Republic and Slovakia, a.s.",
        "3030" => "Air Bank a.s.",
        "3050" => "BNP Paribas Personal Finance SA, odštěpný závod",
        "3060" => "PKO BP S.A., Czech Branch",
        "3500" => "ING Bank N.V.",
        "4000" => "Max banka a.s.",
        "4300" => "Národní rozvojová banka, a.s.",
        "5500" => "Raiffeisenbank a.s.",
        "5800" => "J&T BANKA, a.s.",
        "6000" => "PPF banka a.s.",
        "6100" => "Raiffeisenbank a.s. (do 31. 12. 2021 Equa bank a.s.)",
        "6200" => "COMMERZBANK Aktiengesellschaft, pobočka Praha",
        "6210" => "mBank S.A., organizační složka",
        "6300" => "BNP Paribas S.A., pobočka Česká republika",
        "6700" => "Všeobecná úverová banka a.s., pobočka Praha",
        "6800" => "Sberbank CZ, a.s. v likvidaci",
        "7910" => "Deutsche Bank Aktiengesellschaft Filiale Prag, organizační složka",
        "7950" => "Raiffeisen stavební spořitelna a.s.",
        "7960" => "ČSOB Stavební spořitelna, a.s.",
        "7970" => "MONETA Stavební Spořitelna, a.s.",
        "7990" => "Modrá pyramida stavební spořitelna, a.s.",
        "8030" => "Volksbank Raiffeisenbank Nordoberpfalz eG pobočka Cheb",
        "8040" => "Oberbank AG pobočka Česká republika",
        "8060" => "Stavební spořitelna České spořitelny, a.s.",
        "8090" => "Česká exportní banka, a.s.",
        "8150" => "HSBC Continental Europe, Czech Republic",
        "8190" => "Sparkasse Oberlausitz-Niederschlesien",
        "8198" => "FAS finance company s.r.o.",
        "8199" => "MoneyPolo Europe s.r.o.",
        "8200" => "PRIVAT BANK der Raiffeisenlandesbank Oberösterreich Aktiengesellschaft, pobočka Česká republika",
        "8220" => "Payment execution s.r.o.",
        "8230" => "ABAPAY s.r.o.",
        "8240" => "Družstevní záložna Kredit, v likvidaci",
        "8250" => "Bank of China (CEE) Ltd. Prague Branch",
        "8255" => "Bank of Communications Co., Ltd., Prague Branch odštěpný závod",
        "8265" => "Industrial and Commercial Bank of China Limited, Prague Branch, odštěpný závod",
        "8270" => "Fairplay Pay s.r.o.",
        "8280" => "B-Efekt a.s.",
        "8293" => "Mercurius partners s.r.o.",
        "8299" => "BESTPAY s.r.o.",
        "8500" => "Multitude Bank p.l.c.",
    ];

@malja
Copy link
Author

malja commented Feb 10, 2023

Ahoj, přidávám aktuální seznam bank podle číselníku.

Ahoj @Dacesilian,
děkuji za upozornění. Seznam doplním.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment