rikudou/euqrpayment

根据EPC标准2版为欧盟提供的二维码支付库

v1.4.0 2021-09-27 22:19 UTC

This package is auto-updated.

Last update: 2024-08-29 04:09:18 UTC


README

Tests Coverage Status Download

用于生成欧盟(EPC标准,在德国也称为GiroCode)二维码支付代码的库。目前在德国、奥地利、荷兰、芬兰和比利时使用。

另请参阅 捷克斯洛伐克匈牙利 账户的二维码支付生成器

安装

通过composer: composer require rikudou/euqrpayment

用法

在构造函数中,您必须提供IBAN,它可以是字符串或 rikudou\EuQrPayment\Iban\IbanInterface 的实例。

字符串示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");

基本IBAN类示例

<?php

use rikudou\EuQrPayment\QrPayment;
use rikudou\EuQrPayment\Iban\IBAN;

$payment = new QrPayment(new IBAN("CZ5530300000001325090010"));

当您想创建一个将本地格式(BBAN)转换为IBAN的适配器时,IbanInterface 是有用的。

此包包含一个用于捷克账户的此类

<?php

use rikudou\EuQrPayment\QrPayment;
use rikudou\EuQrPayment\Iban\CzechIbanAdapter;

$payment = new QrPayment(new CzechIbanAdapter(1325090010, 3030));

设置付款详情

所有付款详情都可以通过setter设置

<?php

use rikudou\EuQrPayment\QrPayment;
use rikudou\EuQrPayment\Sepa\CharacterSet;
use rikudou\EuQrPayment\Sepa\Purpose;

$payment = new QrPayment("CZ5530300000001325090010");
$payment
    ->setCharacterSet(CharacterSet::UTF_8)
    ->setBic("AIRACZPP")
    ->setBeneficiaryName("My Cool Company")
    ->setAmount(100)
    ->setPurpose(Purpose::ACCOUNT_MANAGEMENT)
    ->setRemittanceText("Invoice ID: XXX")
    ->setCreditorReference('RF123456') // setting both creditor reference and remittance text will actually result in exception
    ->setInformation("This is some note")
    ->setCurrency("EUR");

异常

此库抛出 LogicExceptionInvalidArgumentException,以下列出抛出异常的方法及其原因

  • __construct() - InvalidArgumentException - 如果 $iban 参数不是字符串或 rikudou\EuQrPayment\Iban\IbanInterface 的实例
  • setBic()setSwift() - InvalidArgumentException - 如果BIC长度少于8个字符或多于11个字符
  • setCharacterSet() - InvalidArgumentException - 如果字符集不是有效的字符集
  • setBeneficiaryName() - InvalidArgumentException - 如果收款人姓名超过70个字符
  • setAmount() - InvalidArgumentException - 如果金额低于零或超过999,999,999.99
  • setPurpose() - InvalidArgumentException - 如果用途超过4个字符
  • setRemittanceText() - InvalidArgumentException - 如果汇款文本超过140个字符
  • setCreditorReference() - InvalidArgumentException - 如果债权人参考超过35个字符
  • setInformation()setComment() - InvalidArgumentException - 如果注释超过70个字符
  • setCurrency() - InvalidArgumentException - 如果货币不是正好3个字符长
  • getQrString() - LogicException - 如果收款人姓名缺失或生成的字符串超过331字节,或者同时设置了汇款文本和债权人参考
  • getQrImage() - LogicException - 如果未安装 endroid/qr-code

二维码图像

此库通过其姐妹库 rikudou/qr-payment-qr-code-provider 提供了多种二维码图像实现。如果安装了任何受支持的二维码生成库,则 getQrCode() 方法将返回一个 \Rikudou\QrPaymentQrCodeProvider\QrCode 的实例,该实例可用于获取包含生成的二维码支付数据的图像。

<?php

use rikudou\EuQrPayment\QrPayment;
use Endroid\QrCode\QrCode;

$payment = new QrPayment(...);

$qrCode = $payment->getQrCode();

// get the raw image data and display them in the browser
header('Content-Type: image/png');
echo $qrCode->getRawString();

// use in an img html tag
echo "<img src='{$qrCode->getDataUri()}'>";

// write to a file
$qrCode->writeToFile('/tmp/some-file.png');

// get the raw object from the underlying system
$raw = $qrCode->getRawObject();
// let's assume we're using endroid/qr-code v4
assert($raw instanceof QrCode);
// do some custom transformations
$raw->setLabelFontSize(15);
// the object is still referenced by the adapter, meaning we can now render it the same way as before
echo "<img src='{$qrCode->getDataUri()}'>";

公共方法列表

构造函数

参数

  • string|IbanInterface $iban - IBAN

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");

getIban()

返回 IbanInterface 实例,您可以通过 IbanInterfaceasString() 方法或通过将对象转换为字符串来获取 IBAN 的字符串表示。

返回

rikudou\EuQrPayment\Iban\IbanInterface

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");
$iban = $payment->getIban(); // holds instance of rikudou\EuQrPayment\Iban\IBAN
$ibanAsString = $payment->getIban()->asString();
$ibanAsString = (string) $payment->getIban();

getCharacterSet()

返回根据规范的字符集作为整数。您可以将其与 rikudou\EuQrPayment\Sepa\CharacterSet 常量进行比较。默认值为 1 (utf-8)。

返回

int

示例

<?php

use rikudou\EuQrPayment\QrPayment;
use rikudou\EuQrPayment\Sepa\CharacterSet;

$payment = new QrPayment("CZ5530300000001325090010");

switch ($payment->getCharacterSet()) {
    case CharacterSet::UTF_8:
        echo "UTF-8";
        break;
    case CharacterSet::ISO_8859_1:
        echo "ISO-8859-1";
        break;
    case CharacterSet::ISO_8859_2:
        echo "ISO-8859-2";
        break;
    case CharacterSet::ISO_8859_4:
        echo "ISO-8859-4";
        break;
    case CharacterSet::ISO_8859_5:
        echo "ISO-8859-5";
        break;
    case CharacterSet::ISO_8859_7:
        echo "ISO-8859-7";
        break;
    case CharacterSet::ISO_8859_10:
        echo "ISO-8859-10";
        break;
    case CharacterSet::ISO_8859_15:
        echo "ISO-8859-15";
        break;
    default:
        echo "I'm afraid that this character set does not exist, sir";
}

getBic() 或 getSwift()

返回付款的 BIC (SWIFT)。 getSwift()getBic() 的别名。默认为空字符串。

返回

string

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");

var_dump($payment->getSwift());
var_dump($payment->getBic());

getBeneficiaryName()

返回受益人的姓名。默认为空字符串。

返回

string

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");
$payment->getBeneficiaryName();

getAmount()

返回付款金额。默认为 0.0

返回

float

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");

$payment->getAmount();

getPurpose()

返回用途文本,您可以通过 rikudou\EuQrPayment\Sepa\Purpose 常量进行检查。默认为空字符串。

返回

string

示例

<?php

use rikudou\EuQrPayment\QrPayment;
use rikudou\EuQrPayment\Sepa\Purpose;

$payment = new QrPayment("CZ5530300000001325090010");
if($payment->getPurpose() === Purpose::ACCOUNT_MANAGEMENT) {
    // do something related to account management
} else if($payment->getPurpose() === Purpose::ALIMONY_PAYMENT) {
    // handle alimony payment
} else {
    // etc.
}

getRemittanceText()

返回汇款文本,例如付款参考。默认为空字符串。

返回

string

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");

$payment->getRemittanceText();

getCreditorReference()

返回结构化债权人参考。默认为空字符串。

返回

string

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");
$payment->setCreditorReference('RF123456');
// do other stuff
echo $payment->getCreditorReference();

getInformation() 或 getComment()

返回付款的信息(注释)。getComment()getInformation() 的别名。默认为空字符串。

返回

string

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");

$payment->getInformation();
$payment->getComment();

getCurrency()

返回付款的货币。默认为 EUR

返回

string

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");

if($payment->getCurrency() === "EUR") {
    // do something
}

setCharacterSet()

设置字符集。

参数

  • int $characterSet - rikudou\EuQrPayment\Sepa\CharacterSet 支持的字符集中之一

返回

$this

示例

<?php

use rikudou\EuQrPayment\QrPayment;
use rikudou\EuQrPayment\Sepa\CharacterSet;

$payment = new QrPayment("CZ5530300000001325090010");
$payment->setCharacterSet(CharacterSet::UTF_8);

setBic() 或 setSwift()

设置付款的 BIC (SWIFT)。setSwift()setBic() 的别名。

参数

  • string $bic - 您银行的 BIC (SWIFT)

返回

$this

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");
$payment->setBic("AIRACZPP");
$payment->setSwift("AIRACZPP");

setBeneficiaryName()

设置受益人的姓名,此参数是必需的。

参数

  • string $beneficiaryName - 受益人的姓名

返回

$this

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");
$payment->setBeneficiaryName("My Cool Company");

setAmount()

设置付款金额。

参数

  • float $amount - 金额

返回

$this

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");
$payment->setAmount(10);

setPurpose()

根据 SEPA 规范设置用途,使用类 rikudou\EuQrPayment\Sepa\Purpose

参数

  • string $purpose - 用途

返回

$this

示例

<?php

use rikudou\EuQrPayment\QrPayment;
use rikudou\EuQrPayment\Sepa\Purpose;

$payment = new QrPayment("CZ5530300000001325090010");
$payment->setPurpose(Purpose::TRUST_FUND);

setRemittanceText()

付款参考,最多 140 个字符。

注意:您不能同时设置汇款文本和债权人参考

参数

  • string $remittanceText - 汇款文本

返回

$this

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");
$payment->setRemittanceText("Invoice ID: ###");

setCreditorReference()

结构化债权人参考(ISO 11649),最多 35 个字符。

注意:您不能同时设置汇款文本和债权人参考

参数

  • string $creditorReference - 汇款文本

返回

$this

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");
$payment->setCreditorReference("RF123456");

setInformation() 或 setComment()

付款的注释,最多 70 个字符。setComment()setInformation() 的别名。

参数

  • string $information - 信息文本

返回

$this

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");
$payment->setInformation("QR PAYMENT");
$payment->setComment("QR PAYMENT");

setCurrency()

设置付款的货币,必须是 ISO 4217 字符串。

参数

  • string $currency - 根据 ISO 4217 的货币

返回

$this

示例

<?php

use rikudou\EuQrPayment\QrPayment;

$payment = new QrPayment("CZ5530300000001325090010");
$payment->setCurrency("EUR");

getQrString()

返回应编码在 QR 图像中的字符串。

返回

string

示例

<?php

use rikudou\EuQrPayment\QrPayment;
use rikudou\EuQrPayment\Sepa\CharacterSet;
use rikudou\EuQrPayment\Sepa\Purpose;

$payment = new QrPayment("CZ5530300000001325090010");
$payment
    ->setCharacterSet(CharacterSet::UTF_8)
    ->setBic("AIRACZPP")
    ->setBeneficiaryName("My Cool Company")
    ->setAmount(100)
    ->setPurpose(Purpose::ACCOUNT_MANAGEMENT)
    ->setRemittanceText("Invoice ID: XXX")
    ->setInformation("This is some note")
    ->setCurrency("EUR");

var_dump($payment->getQrString());

/*
Output:

string(109) "BCD
002
1
SCT
AIRACZPP
My Cool Company
CZ5530300000001325090010
EUR100
ACCT

Invoice ID: XXX
This is some note"
 */

getQrImage()

通过第三方库返回 QR 代码。

返回

\Endroid\QrCode\QrCode

示例

<?php

use rikudou\EuQrPayment\QrPayment;
use rikudou\EuQrPayment\Sepa\CharacterSet;
use rikudou\EuQrPayment\Sepa\Purpose;

$payment = new QrPayment("CZ5530300000001325090010");
$payment
    ->setCharacterSet(CharacterSet::UTF_8)
    ->setBic("AIRACZPP")
    ->setBeneficiaryName("My Cool Company")
    ->setAmount(100)
    ->setPurpose(Purpose::ACCOUNT_MANAGEMENT)
    ->setRemittanceText("Invoice ID: XXX")
    ->setInformation("This is some note")
    ->setCurrency("EUR");

header("Content-Type: image/png");
echo $payment->getQrImage()->writeString();

用途类

该类通过脚本 createLists.php 生成,因为它下载了记录所有用途字符串的 XLS 文件。该类提交到 git,以便在使用此包进行生产时无需进行远程文件下载等操作。

生成类后,应检查是否存在错误,因为生成它的代码可能不是完全可靠的。