byrokrat/banking

瑞典银行系统中的账户数据类型

2.2.3 2020-12-07 18:42 UTC

This package is auto-updated.

Last update: 2024-08-29 03:41:59 UTC


README

byrokrat

银行

Packagist Version Build Status Quality Score

瑞典银行系统、Handelsbanken、ICA-banken、Nordea、SEB、Skandiabanken、Swedbank、PlusGirot、Bankgirot 等银行账户的数据类型和工厂。

介绍

Banking 提供了一种解析和验证瑞典银行系统中的银行账户号码的方法。它验证清算号码、账户号码的结构以及校验位。它还定义了账户号码的值对象,具有格式化能力和访问账户号码不同部分以及识别账户所属银行的方法。

安装

composer require byrokrat/banking

Banking 没有用户依赖。

使用方法

主要入口点是 AccountFactory,用于创建 AccountNumber 对象。

$accountFactory = new \byrokrat\banking\AccountFactory;
$account = $accountFactory->createAccount('50001111116');
// Prints a formatted version of the validated number (5000,111111-6)
echo $account->getNumber();

标准工厂会尽力识别不同的号码格式。

  1. 空格、破折号和点将被忽略。
  2. 在清算号和序列号之间可以使用可选的 , 分隔符。
  3. 放置错误的清算-序列分隔符将被忽略。

以下账户号码都是有效的,被认为是前一个示例账户号码相等。

// Prints 111111
echo $accountFactory->createAccount('5000,1111116')->equals($account);
echo $accountFactory->createAccount('5000-1111116')->equals($account);
echo $accountFactory->createAccount('5000,111111-6')->equals($account);
echo $accountFactory->createAccount('5000,111 111-6')->equals($account);
echo $accountFactory->createAccount('5000000001111116')->equals($account);
echo $accountFactory->createAccount('5000,000001111116')->equals($account);

使工厂更严格

对于只允许数字和正确放置的清算-序列分隔符(,)的工厂,将 StrictFactory 实例作为第一个参数传递给 AccountFactory::__construct()

$accountFactory = new \byrokrat\banking\AccountFactory(new \byrokrat\banking\StrictFactory);

// Will throw an exception as '-' is not a valid character in strict mode
$accountFactory->createAccount('5000-1111116');

重写

当解析账户号码失败时,标准工厂会尝试重写它以查看是否可以生成有效的账户号码。

  1. 它尝试将序列号的第一位数字解释为清算校验位。
  2. 它尝试从序列号中删除左侧的零。
  3. 它尝试将清算号码 3300 预先附加,以查看账户号码是否是有效的 Nordea 个人账户号码。

如果重写(或重写的任何组合)成功,则使用重写后的号码。通过将空 RewriterContainer 作为第二个参数传递给 AccountFactory::__construct() 来退出此行为。

$accountFactory = new \byrokrat\banking\AccountFactory(
    new \byrokrat\banking\StrictFactory,
    new \byrokrat\banking\Rewriter\RewriterContainer
);

// Will throw an exception as the serial number is too long and can not be trimmed.
$accountFactory->createAccount('5000,01111116');

Swedbank 账户的清算号校验位

8 开头的 Swedbank 账户号码可以指定第五个清算号校验位。清算号校验位是可选的,但如果存在,解析器将使用它来验证清算号。

$swedbank = $accountFactory->createAccount('8105-9,744202466');
echo $accountFactory->createAccount('81059,744202466')->equals($swedbank);

请注意,如果清算校验位是 0 且没有使用逗号(,)来分隔清算号和序列号,则解析器可能无法理解 0 是清算号的一部分,从而导致数据丢失。因此,始终使用逗号分隔清算号和序列号是一个好习惯。

捕获解析器错误

当解析失败时,会抛出异常。检查异常消息以获取解析阶段和错误发生位置的详细描述。

try {
    $accountFactory->createAccount('8105-8,744202464');
} catch (\byrokrat\banking\Exception $e) {
    echo $e->getMessage();
}

输出类似以下内容

Unable to parse account 8105-8,744202464 using format Swedbank:
 * Clearing number 8105 is within range 8000 to 8999
 * [FAIL] Invalid check digit 4, expected 6
 * [FAIL] Invalid clearing number check digit 8, expected 9
 * Valid serial length 8

解析 Bankgiro 和 PlusGiro 账户

使用 BankgiroFactoryPlusgiroFactory 来解析 bankgiro 和 plusgiro 账户号码。(从版本 2.0 开始,不再可以使用常规的 AccountFactory 来解析 bankgiro 或 plusgiro 账户号码。)

请注意,在解析Bankgiro和PlusGiro账号时,-分隔符是可选的。省略它时,可能无法确定原始数字是否确实是Bankgiro或PlusGiro账号:5805-6201是一个有效的Bankgiro账号,而5805620-1是一个有效的PlusGiro账号。

$account = (new \byrokrat\banking\PlusgiroFactory)->createAccount('58056201');
echo $account->getBankName() == \byrokrat\banking\BankNames::BANK_PLUSGIRO;
$account = (new \byrokrat\banking\BankgiroFactory)->createAccount('58056201');
echo $account->getBankName() == \byrokrat\banking\BankNames::BANK_BANKGIRO;

创建一个可以解析普通账号和Bankgiro或PlusGiro账号的工厂

使用DelegatingFactory创建一个工厂,该工厂将一个或多个工厂的功能集成到单个对象中。

$factory = new \byrokrat\banking\DelegatingFactory(
    new \byrokrat\banking\AccountFactory,
    new \byrokrat\banking\BankgiroFactory
);

$account = $factory->createAccount('58056201');
echo $account->getBankName() == \byrokrat\banking\BankNames::BANK_BANKGIRO;

AccountNumber API

创建的账号对象实现了AccountNumber接口,该接口定义了以下API。

getBankName()

获取数字所属银行的名称(有关银行标识符的列表,请参阅BankNames)。

echo $account->getBankName();
echo $account->getBankName() == \byrokrat\banking\BankNames::BANK_SEB;

getRawNumber()

获取原始且未格式化的数字。

echo $account->getRawNumber();

getNumber()

获取账号的格式化排列。使用PHP的魔术__tostring()方法内部调用getNumber()

echo $account->getNumber();
echo $account;

prettyprint()

获取带有更多装饰的格式化账号排列。

echo $account->prettyprint();

get16()

获取由BGC定义的通用16位格式。

echo $account->get16();

getClearingNumber()getClearingCheckDigit()getSerialNumber()getCheckDigit()

获取提取的账号部分。

echo $account->getClearingNumber();
echo $account->getClearingCheckDigit();
echo $account->getSerialNumber();
echo $account->getCheckDigit();

equals()

验证两个账号对象是否代表相同的数字。

echo $account->equals($account);