rikudou / euqrpayment
根据EPC标准2版为欧盟提供的二维码支付库
Requires
- php: ^7.3|^8.0
- ext-mbstring: *
- rikudou/qr-payment-interface: ^1.0
- rikudou/qr-payment-qr-code-provider: ^1.0
Requires (Dev)
- endroid/qr-code: ^3.2
- friendsofphp/php-cs-fixer: ^2.13
- php-coveralls/php-coveralls: ^2.1
- phpoffice/phpspreadsheet: ^1.5
- phpstan/phpstan: ^0.12.40
- phpunit/phpunit: ^9.5
Suggests
- endroid/qr-code: For generating QR code image
README
用于生成欧盟(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");
异常
此库抛出 LogicException
和 InvalidArgumentException
,以下列出抛出异常的方法及其原因
__construct()
-InvalidArgumentException
- 如果$iban
参数不是字符串或rikudou\EuQrPayment\Iban\IbanInterface
的实例setBic()
和setSwift()
-InvalidArgumentException
- 如果BIC长度少于8个字符或多于11个字符setCharacterSet()
-InvalidArgumentException
- 如果字符集不是有效的字符集setBeneficiaryName()
-InvalidArgumentException
- 如果收款人姓名超过70个字符setAmount()
-InvalidArgumentException
- 如果金额低于零或超过999,999,999.99setPurpose()
-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
实例,您可以通过 IbanInterface
的 asString()
方法或通过将对象转换为字符串来获取 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,以便在使用此包进行生产时无需进行远程文件下载等操作。
生成类后,应检查是否存在错误,因为生成它的代码可能不是完全可靠的。