hlavtox/qr-payment-string-generator

Generates Slovak PAY by square, Czech QR Platba and EPC payment strings.

Maintainers

Package info

github.com/Hlavtox/qr-payment-string-generator

Homepage

pkg:composer/hlavtox/qr-payment-string-generator

Transparency log

Statistics

Installs: 2

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.2 2026-08-05 13:06 UTC

This package is auto-updated.

Last update: 2026-08-05 13:08:12 UTC


README

QR Payment String Generator is a pure-PHP library for generating the payment strings stored inside payment QR codes. It supports three formats:

  • Slovak PAY by square
  • Czech QR Platba (SPD 1.0)
  • EPC / SEPA credit transfer QR codes

The package creates only the payment payload, not a QR image. Pass the generated string to any QR code renderer that fits your application. There are many good libraries and services available for that purpose.

The project was created because the available PHP implementations either required some external libraries to be installed in the system, required commonly blocked functions like proc_open or or did not produce a scannable PAY by square code. This is deliberately dependency-free and implemented entirely in PHP.

Compatibility

  • PHP 7.4 through PHP 8.5
  • No libraries, no frameworks, no extra services - just PHP
  • Requires only the common mbstring PHP extension for UTF-8 length validation, which every hosting on earth should have enabled

Required fields and supported data

Format Required fields Practical minimum Supported setters
Slovak PAY by square IBAN, beneficiary name IBAN, amount, beneficiary name, variable symbol, payment note setBic, setCurrency, setDueDate, setVariableSymbol, setConstantSymbol, setSpecificSymbol, setOriginatorsReferenceInformation, setPaymentNote, setInvoiceId, setBeneficiaryAddressLine1, setBeneficiaryAddressLine2
Czech QR Platba IBAN IBAN, amount, variable symbol setAmount, setBeneficiaryName, setCurrency, setDueDate, setVariableSymbol, setConstantSymbol, setSpecificSymbol, setPaymentNote, setPaymentType
EPC / SEPA QR IBAN, beneficiary name IBAN, amount, beneficiary name, payment reference or payment note setAmount, setBic, setPaymentNote, setOriginatorsReferenceInformation, setPurpose, setInformation

All formats expose the same fluent API. You may call every setter on any generator; values not supported by the selected format are safely ignored.

Complete setter support matrix

Setter Example data PAY by square Czech QR Platba EPC / SEPA
setIban() 'SK8075000000004022466192' Required Required Required
setAmount() '125.50' Used if set Used if set Used if set
setBeneficiaryName() 'Example company s.r.o.' Required Used if set Required
setBic() 'CEKOSKBX' Used if set Ignored Used if set
setCurrency() 'EUR' or 'CZK' Used if set Used if set Ignored; EPC is always EUR
setDueDate() '2026-08-15' Used if set Used if set Ignored
setVariableSymbol() '001234' Used if set Used if set Ignored
setConstantSymbol() '0558' Used if set Used if set Ignored
setSpecificSymbol() '1234567890' Used if set Used if set Ignored
setOriginatorsReferenceInformation() '202600123' Used if set Ignored Ignored
setStructuredReference() 'RF18539007547034' Ignored Ignored Used if set; payment note is ignored
setPaymentNote() 'Invoice 202600123' Used if set Used if set Used as unstructured remittance information
setInvoiceId() '202600123' Used if set Ignored Ignored
setBeneficiaryAddressLine1() / setBeneficiaryAddressLine2() 'Main Street 1' Used if set Ignored Ignored
setPaymentType() 'IP' Ignored Used if set Ignored
setPurpose() 'GDDS' Ignored Ignored Used if set
setInformation() 'Thank you' Ignored Ignored Used if set

Note

For EPC, setStructuredReference() is a structured creditor reference (a structured payment reference for the recipient): a standardized machine-readable reference beginning with RF, for example RF18539007547034. setPaymentNote() is unstructured remittance information (a free-text payment reference for the recipient), such as Invoice 202600123. When both are set, the structured reference takes precedence and the payment note is ignored. setInformation() is beneficiary-to-originator information (a message from the recipient to the payer).

How to pass data

Pass the values in their business form. The generators normalize IBAN and BIC whitespace and letter case, validate format-specific limits, and throw InvalidArgumentException when a value is invalid.

$generator
    ->setIban('SK80 7500 0000 0040 2246 6192') // string; spaces are accepted
    ->setBic('CEKOSKBX') // string; Czech QR Platba safely ignores it
    ->setBeneficiaryName('Řehoř Žížala') // UTF-8 string
    ->setAmount('125.50') // exact decimal string, never a float
    ->setVariableSymbol('001234') // string to preserve leading zeroes
    ->setDueDate('2026-08-15'); // YYYY-MM-DD string or DateTimeInterface

Why is the amount a string?

Payment QR formats require an exact decimal representation with a period as the decimal separator. PHP floats cannot safely represent many decimal values: for example, 0.1 + 0.2 can internally become 0.30000000000000004. Pass an exact string such as '125.50' instead.

If your application stores money in minor units, for example 12550 cents, convert it to an exact decimal string at the application boundary before calling setAmount(). Do not pass a value formatted with a comma, currency symbol, or thousands separator.

Formatting summary

Setter Type Accepted format
setIban() string IBAN; spaces are accepted and removed.
setBic() string or null BIC / SWIFT; spaces are accepted and removed.
setAmount() string or null Decimal number with .; never a float.
setBeneficiaryName() / setPaymentNote() string Plain UTF-8 text; do not URL-encode it yourself.
setVariableSymbol() / setConstantSymbol() / setSpecificSymbol() string or null Digits only; use strings to preserve leading zeroes.
setDueDate() string, DateTimeInterface, or null YYYY-MM-DD when passing a string.

Install

composer require hlavtox/qr-payment-string-generator

Slovak PAY by square

use Hlavtox\QrPaymentStringGenerator\PayBySquarePaymentStringGenerator;

$payload = (new PayBySquarePaymentStringGenerator())
    ->setIban('SK8075000000004022466192')
    ->setAmount('49.00')
    ->setBeneficiaryName('Example company s.r.o.')
    ->setBic('CEKOSKBX')
    ->setVariableSymbol('202600123')
    ->setPaymentNote('Invoice 202600123')
    ->setDueDate('2026-08-15')
    ->generate();

Czech QR Platba

use Hlavtox\QrPaymentStringGenerator\CzechQrPaymentStringGenerator;

$payload = (new CzechQrPaymentStringGenerator())
    ->setIban('CZ330100000000002970297')
    ->setAmount('555.55')
    ->setVariableSymbol('202600123')
    ->generate();

EPC / SEPA QR

use Hlavtox\QrPaymentStringGenerator\EpcQrPaymentStringGenerator;

$payload = (new EpcQrPaymentStringGenerator())
    ->setIban('SK8075000000004022466192')
    ->setAmount('49.00')
    ->setBeneficiaryName('Example company s.r.o.')
    ->setBic('CEKOSKBX')
    ->setPaymentNote('Invoice 202600123')
    ->generate();

Common e-commerce usage

// Store the recipient details once in application configuration.
$shopConfiguration = [
    'iban' => 'SK8075000000004022466192',
    'bic' => 'CEKOSKBX',
    'beneficiaryName' => 'Example company s.r.o.',
];

// Take payment-specific data from the order or invoice.
$orderInformation = [
    'amount' => '49.00',
    'currency' => 'EUR',
    'orderNumber' => '202600123',
];

// Slovak EUR payments:
// $generator = new PayBySquarePaymentStringGenerator();

// Czech CZK payments:
// $generator = new CzechQrPaymentStringGenerator();

// EUR SEPA payments:
$generator = new EpcQrPaymentStringGenerator();

$payload = $generator
    ->setIban($shopConfiguration['iban'])
    ->setBic($shopConfiguration['bic'])
    ->setBeneficiaryName($shopConfiguration['beneficiaryName'])
    ->setAmount($orderInformation['amount'])
    ->setCurrency($orderInformation['currency'])
    ->setVariableSymbol($orderInformation['orderNumber'])
    ->setPaymentNote('Order ' . $orderInformation['orderNumber'])
    ->generate();