byrokrat/autogiro

读取和写入瑞典直接借记系统autogirot的文件

1.1.0 2020-12-25 23:14 UTC

README

byrokrat

Autogiro

Packagist Version Build Status Quality Score

读取和写入瑞典直接借记系统autogirot的文件。

有关可以将autogiro文件转换为XML的命令行工具,请参阅autogiro2xml

安装

composer require byrokrat/autogiro

目录

  1. Autogiro规范
  2. 生成autogiro请求文件
  3. 解析autogiro文件
  4. 使用访问者访问节点
  5. 从节点树生成XML
  6. 黑客攻击

Autogiro规范

此库是根据2016年12月13日修订的直接借记系统(autogirot)的技术手册(瑞典语)开发的。有关此文档的较新版本,请参阅Bankgirocentralen

生成autogiro请求文件

通过向WriterFactory提供您的银行账户号码BGC客户号码来创建一个写入器。

$writer = (new \byrokrat\autogiro\Writer\WriterFactory)->createWriter(
    '123456',
    (new \byrokrat\banking\BankgiroFactory)->createAccount('1111-1119')
);

对写入器执行操作并生成文件。

$writer->deleteMandate('1234567890');
$rawFile = $writer->getContent();
echo $rawFile;

将输出类似以下内容

0120180114AUTOGIRO                                            1234560011111119  
0300111111190000001234567890                                                    

解析autogiro文件

使用ParserFactory创建一个解析器。

$factory = new \byrokrat\autogiro\Parser\ParserFactory;
$parser = $factory->createParser();

默认情况下,创建的解析器将解析和验证货币金额账户号码识别号码。使用访问者常量之一来禁用此功能。

$factory->createParser(\byrokrat\autogiro\Parser\ParserFactory::VISITOR_IGNORE_OBJECTS);

解析文件创建一个节点对象。

use byrokrat\autogiro\Tree\Node;

/** @var Node */
$node = $parser->parse($rawFile);

访问特殊对象

AccountAmountStateIdDate节点是嵌套结构,其中子节点Object包含构造的PHP对象。使用类似以下方式访问:

$money = $node->getChild(Node::AMOUNT)->getObjectValue();

遍历解析树

这样做的一种更简单的方法是使用访问者。见下文。

通过调用hasChild()getChild()getChildren()来遍历树。

echo $node->getChild(Node::MANDATE_REQUEST_SECTION)
    ->getChild(Node::DELETE_MANDATE_REQUEST)
    ->getChild(Node::PAYER_NUMBER)
    ->getValue();

或访问所有Node::DELETE_MANDATE_REQUEST节点。

$mandateRequests = $node->getChild(Node::MANDATE_REQUEST_SECTION);

foreach ($mandateRequests->getChildren(Node::DELETE_MANDATE_REQUEST) as $deleteRequest) {
    // process...
}

尝试访问不存在的子节点将返回一个NullNode

echo $node->getChild('this-does-not-exist')
    ->getChild('and-neither-does-this')
    ->isNull();

使用访问者访问节点

使用访问者可以根据名称或类型访问节点。

class MyVisitor extends \byrokrat\autogiro\Visitor\Visitor {
    function beforeDeleteMandateRequest($node) {
        echo "Delete mandate request found!";
    }
}

$visitor = new MyVisitor;

$node->accept($visitor);

这也可以动态完成。

$visitor = new \byrokrat\autogiro\Visitor\Visitor;

$visitor->before(Node::DELETE_MANDATE_REQUEST, function ($node) {
    echo "Delete mandate request found!";
});

查找授权响应

$visitor->before(Node::MANDATE_RESPONSE, function ($node) {
    if ($node->hasChild(Node::CREATED_FLAG)) {
        // Mandate successfully created
    }
    if ($node->hasChild(Node::DELETED_FLAG)) {
        // Mandate successfully deleted
    }
    if ($node->hasChild(Node::ERROR_FLAG)) {
        // Mandate error state
    }
});

查找支付响应

$visitor->before(Node::SUCCESSFUL_INCOMING_PAYMENT_RESPONSE, function ($node) {
    // successfull payment..
});

$visitor->before(Node::FAILED_INCOMING_PAYMENT_RESPONSE, function ($node) {
    // failed payment..
});

从节点树生成XML

使用此功能可以帮助您了解解析器如何解释各种布局。

$xmlWriter = (new \byrokrat\autogiro\Xml\XmlWriterFactory)->createXmlWriter();

echo $xmlWriter->asXml(
    $parser->parse($rawFile)
);

黑客攻击

如果已将composer作为composer安装

make

或者使用类似的方法

make COMPOSER_CMD=./composer.phar