Dla jednej z moich aplikacji tworzę rozwiązanie, które pozwala użytkownikom przelać pieniądze bezpośrednio na konto. Ponieważ wszystkie moje aplikacje są tworzone na międzynarodowy rynek, padł pomysł, aby numer konta podawać w formacie IBAN. Wszystko fajnie, ale ten numer pasowałoby jeszcze zweryfikować, czy przypadkiem użytkownik nie popełnił błędu przy wpisywaniu. I tutaj pojawiły się małe schody, które postanowiłem opisać w tym blogpoście.

Czym jest numer IBAN?

Numer IBAN (International Bank Account Number) jest międzynarodowym standardem numerowania kont bankowych. W uproszczeniu mówiąc jest to numer naszego konta poprzedzony kodem kraju, czyli w przypadku Polski będzie on wyglądać tak: PL10105000997603123456789123.

Weryfikacja numeru IBAN w Invision Community

Samo Invision Community nie posiada w swoim repo walidatora numeru IBAN, którym można by się było posiłkować zmuszony byłem zrobić to sam.

Jak wspominałem wcześniej we wstępie, jedna z moich aplikacji a dokładniej (SD) Sales Portal Pro w nowej wersji będzie miała opcję płacenia przelewem na konto użytkownika. W związku z tym dodałem obsługę takiego pola w formularzu. Sam kod inputa wygląda tak:

            new \IPS\Helpers\Form\Text( "sd_salespro_offer_iban", $item ? $item->iban : null, \IPS\Settings::i()->sd_salespro_iban_require, array( 'placeholder' => \IPS\Member::loggedIn()->language()->addToStack( 'sd_salespro_iban_placeholder' ) ), function( $val )
            {
                if( !$val )
                {
                    return true;
                }

                if( \IPS\sdsalespro\Offer::validateIBANAcountNumber( $val ) )
                {
                    return true;
                }

                throw new \InvalidArgumentException( 'sd_salespro_offer_bad_iban' );
            } );

Powyższy kod sprawdza, czy została podana wartość. Jeśli nie, to uznajemy, że pole jest prawidłowo zwalidowane.

Jeśli wartość jest podana, używamy metody validateIBANAccountNumber do weryfikacji numeru. Metoda ta ma następującą postać:

    /**
     * Validate IBAN account number
     *
     * @param string $accountNumber
     * @return bool
     */
    public static function validateIBANAcountNumber( $accountNumber )
    {
        $accountNumber = mb_strtoupper( str_replace( ' ', '', $accountNumber ) );

        if( preg_match( '/^[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}$/', $accountNumber ) )
        {
            $country = mb_substr( $accountNumber, 0, 2 );
            $check   = (int) mb_substr( $accountNumber, 2, 2 );
            $account = mb_substr( $accountNumber, 4 );
            $search  = range( 'A', 'Z' );

            foreach( range( 10, 35 ) as $tmp )
            {
                $replace[] = (string) $tmp;
            }

            $numstr   = str_replace( $search, $replace, $account . $country . '00' );
            $checksum = (int) mb_substr( $numstr, 0, 1 );

            for( $pos = 1, $posMax = mb_strlen( $numstr ); $pos < $posMax; $pos++ )
            {
                $checksum *= 10;
                $checksum += (int) mb_substr( $numstr, $pos, 1 );
                $checksum %= 97;
            }

            return ( ( 98 - $checksum ) == $check );
        }

        return false;
    }

Metoda najpierw usuwa wszystkie spacje, następnie zamienia cały ciąg na duże litery, a następnie oblicza sumę kontrolną dla numeru konta.

Jeśli metoda zwróci nam true, uznajemy, że numer konta jest prawidłowy. Jeśli nie, formularz zgłosi błąd nieprawidłowej wartości.

Write A Comment

 

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.