PHPackages                             4vplacek/qr-payment - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Payment Processing](/categories/payments)
4. /
5. 4vplacek/qr-payment

ActiveLibrary[Payment Processing](/categories/payments)

4vplacek/qr-payment
===================

Multiformátový generátor platebních QR kódů pro CZ (SPAYD), SK (Payment Link / Payme v2) a EU/SEPA (EPC QR / GiroCode).

1.0.0(today)01↑2900%MITPHPPHP &gt;=8.1CI passing

Since Jun 27Pushed todayCompare

[ Source](https://github.com/4vplacek/qr-payment)[ Packagist](https://packagist.org/packages/4vplacek/qr-payment)[ RSS](/packages/4vplacek-qr-payment/feed)WikiDiscussions main Synced today

READMEChangelog (1)Dependencies (3)Versions (2)Used By (0)

qr-payment
==========

[](#qr-payment)

Multiformátový generátor platebních QR kódů nad jedním sdíleným datovým modelem.

FormátRegionVýstupStandard**SPAYD**🇨🇿 ČR`SPD*1.0*...`Czech Banking Association**Payment Link (Payme v2)**🇸🇰 SK`https://payme.sk/2/...`SBA Payment Link Standard 2.0**EPC QR (GiroCode)**🇪🇺 EU/SEPA`BCD\n002\n...`EPC069-12- QR kód dle ISO/IEC 18004, error correction level **M** (15 %)
- ASCII normalizace jmen/zpráv (odstranění diakritiky)
- **Žádné zaokrouhlování částek** — vstup jako string nebo int (centy), nikdy float
- **Okamžitá platba** u CZ QR ve výchozím stavu (SPAYD `PT:IP`)

Instalace
---------

[](#instalace)

```
composer require 4vplacek/qr-payment
```

Vyžaduje PHP ≥ 8.1 a rozšíření `mbstring`, `intl`, `gd`.

Použití
-------

[](#použití)

```
use Vplacek\QrPayment\PaymentData;
use Vplacek\QrPayment\Serializer\SpaydSerializer;
use Vplacek\QrPayment\Serializer\PaymentLinkSerializer;
use Vplacek\QrPayment\Serializer\EpcQrSerializer;
use Vplacek\QrPayment\Qr\QrRenderer;
use Vplacek\QrPayment\Qr\QrLabelOutput;

$payment = (new PaymentData())
    ->setIban('CZ6508000000192000145399')
    ->setAmount('250.00')          // string nebo int (centy) — NIKDY float
    ->setCurrency('CZK')
    ->setVariableSymbol('123456')
    ->setRecipientName('Petr Novák')
    ->setMessage('Faktura 2026/001');
```

### CZ — SPAYD

[](#cz--spayd)

```
echo (new SpaydSerializer())->serialize($payment);
// SPD*1.0*ACC:CZ6508000000192000145399*AM:250.00*CC:CZK*MSG:FAKTURA 2026/001*PT:IP*RN:PETR NOVAK*X-VS:123456
// PT:IP = okamžitá platba (viz níže), přidává se automaticky

file_put_contents('qr.png', QrRenderer::fromSpayd($payment)->png());
echo QrRenderer::fromSpayd($payment)->svg();

// Brandovaný SVG: rámeček + nápis „QR platba" (oficiální branding ČBA)
use Vplacek\QrPayment\Qr\BrandedSvgOutput;
use Vplacek\QrPayment\Serializer\SpaydSerializer;

$svg = BrandedSvgOutput::qrPlatba((new SpaydSerializer())->serialize($payment))->svg();
```

### SK — Payment Link / Payme v2

[](#sk--payment-link--payme-v2)

Vyžaduje měnu **EUR** a jméno příjemce. `type` určuje povinnost ostatních polí (`p` = P2P, `m` = POI dynamic, `e` = e-commerce, `q` = POI static/donation).

```
$sk = (new PaymentData())
    ->setIban('SK3112000000198742637541')
    ->setAmount('99.90')
    ->setCurrency('EUR')
    ->setVariableSymbol('1234567890')
    ->setRecipientName('Janko Hraško');

echo (new PaymentLinkSerializer(PaymentLinkSerializer::TYPE_P2P))->serialize($sk);
// https://payme.sk/2/p/PME?IBAN=SK...&CN=Janko+Hrasko&AM=99.90&CC=EUR&PI=%2FVS1234567890

// Brandovaný SVG s Payme logem pod QR kódem
$svg = BrandedSvgOutput::payme((new PaymentLinkSerializer())->serialize($sk))->svg();
```

### EU/SEPA — EPC QR / GiroCode

[](#eusepa--epc-qr--girocode)

Vyžaduje měnu **EUR** a jméno příjemce. Payload je omezen na 331 bytů.

```
$eu = (new PaymentData())
    ->setIban('DE71110220330123456789')
    ->setBic('BHBLDEHHXXX')
    ->setAmount('12.50')
    ->setCurrency('EUR')
    ->setRecipientName('Franz Mustermann')
    ->setMessage('Rechnung 123');

echo (new EpcQrSerializer())->serialize($eu);

// EPC/GiroCode nemá vlastní branding — holý QR
$svg = BrandedSvgOutput::plain((new EpcQrSerializer())->serialize($eu))->svg();
```

Datový model
------------

[](#datový-model)

VlastnostSPAYDPayment LinkEPC QR`setIban()``ACC``IBAN`řádek 7`setBic()``ACC+BIC`—řádek 5`setAmount()``AM``AM`řádek 8 (`EUR12.50`)`setCurrency()``CC`jen `EUR`jen `EUR``setRecipientName()``RN` (35)`CN` (70)řádek 6 (70)`setMessage()``MSG` (60)`MSG` (140)řádek 10 (140)`setVariableSymbol()``X-VS``PI=/VS`—`setSpecificSymbol()``X-SS``PI=/SS`—`setConstantSymbol()``X-KS``PI=/KS`—`setPaymentReference()``RF``PI`řádek 10 (strukturovaná)`setInstantPayment()``PT:IP`——`setPaymentType()``PT`——`setPurpose()`——řádek 9 (SEPA purpose)`setDueDate()``DT``DT` (jen `p`)—### Okamžitá platba (CZ)

[](#okamžitá-platba-cz)

Okamžitá platba (SPAYD `PT:IP`) je **zapnutá ve výchozím stavu** — dnes je běžnější než zadávat datum splatnosti. Banka ji provede, pokud to umožňuje. Ovlivňuje pouze SPAYD; Payment Link ani EPC takové pole nemají.

```
$payment->setInstantPayment(false);     // klasická (neokamžitá) úhrada
$payment->setPaymentType('STD');        // ruční přepis pole PT (přebije default)
```

### Částky a zaokrouhlování

[](#částky-a-zaokrouhlování)

`setAmount()` přijímá **string** (`'250.00'`) nebo **int v centech** (`25000`). Float se vědomě nepřijímá — knihovna nikdy nezaokrouhluje. Více než 2 desetinná místa vyhodí `InvalidPaymentDataException`.

### Validace IBAN

[](#validace-iban)

Defaultně zapnutá (formát + mod-97 checksum). Vypnutí pro hraniční případy:

```
$payment->setValidateIban(false)->setIban('...');
```

Nette / Latte
-------------

[](#nette--latte)

V presenteru předáme do šablony surová data QR kódu:

```
public function renderDetail(): void
{
    $payment = (new PaymentData())
        ->setIban('CZ6508000000192000145399')
        ->setAmount('250.00')
        ->setVariableSymbol('123456')
        ->setRecipientName('Petr Novák');

    // PNG binárka pro filtr |dataStream
    $this->template->qrPng = QrRenderer::fromSpayd($payment)->png();

    // nebo rovnou inline SVG s brandingem „QR platba"
    $this->template->qrSvg = BrandedSvgOutput::qrPlatba(
        (new SpaydSerializer())->serialize($payment),
    )->svg();
}
```

V šabloně Latte:

```
{* PNG přes vestavěný filtr |dataStream → data:image/png;base64,... *}

{* Inline SVG (vektor) — vykreslí se přímo do stránky *}
{$qrSvg|noescape}
```

Filtr `dataStream` zakóduje binární data do `data:` URI (MIME se detekuje automaticky, případně `{$qrPng|dataStream:'image/png'}`). Alternativně lze v presenteru rovnou předat hotové `data:` URI metodami knihovny `->pngDataUri()` / `->svgDataUri()`:

```
$this->template->qrUri = QrRenderer::fromSpayd($payment)->pngDataUri();
```

```

```

Vývoj
-----

[](#vývoj)

```
composer install
composer test       # PHPUnit
composer phpstan    # PHPStan level max
```

Branding
--------

[](#branding)

`BrandedSvgOutput` vykresluje QR jako vlastní SVG (vektor) s brandingem dle formátu:

PresetFormátVzhled`qrPlatba()`CZtenká černá čára kolem quiet zone + „QR platba" (Arial Bold) — dle grafického manuálu ČBA`payme()`SKvložené Payme logo pod QR kódem`plain()`EU/ostatníholý QR bez brandinguPro PNG popisek bez vektoru je k dispozici `QrLabelOutput` (vestavěný GD font, volitelně TTF jako DejaVu Sans / Liberation Sans → nulové licenční riziko fontu).

### Payme logo

[](#payme-logo)

`resources/payme-logo.svg` je ochranná známka provozovatele standardu Payme (payme.sk / Slovenská banková asociácia). Je přibaleno výhradně pro označení QR kódu příslušným platebním standardem; práva náleží jeho vlastníkovi.

Licence
-------

[](#licence)

MIT

###  Health Score

39

—

LowBetter than 85% of packages

Maintenance100

Actively maintained with recent releases

Popularity2

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity42

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

0d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/57271776?v=4)[4vplacek](/maintainers/4vplacek)[@4vplacek](https://github.com/4vplacek)

---

Top Contributors

[![4vplacek](https://avatars.githubusercontent.com/u/57271776?v=4)](https://github.com/4vplacek "4vplacek (1 commits)")

---

Tags

qrpaymentsepaIBANspaydepcpaymegirocode

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/4vplacek-qr-payment/health.svg)

```
[![Health](https://phpackages.com/badges/4vplacek-qr-payment/health.svg)](https://phpackages.com/packages/4vplacek-qr-payment)
```

###  Alternatives

[rikudou/skqrpayment

QR payment library for Slovak accounts

36820.4k2](/packages/rikudou-skqrpayment)[rikudou/czqrpayment

QR payment library for Czech accounts

29449.3k9](/packages/rikudou-czqrpayment)[rikudou/euqrpayment

QR payment library for European Union according to EPC standard version 2

18346.1k1](/packages/rikudou-euqrpayment)[ccharz/laravel-epc-qr

Laravel EPC-QR-Code Generator for sepa payments

1017.2k](/packages/ccharz-laravel-epc-qr)[paypayopa/php-sdk

PHP SDK for PayPay Open Payment API

18304.2k4](/packages/paypayopa-php-sdk)[kilylabs/qr-payment-php

Генерация QR-кодов для оплаты на базе ГОСТ Р 56042-2014 для PHP

1318.8k](/packages/kilylabs-qr-payment-php)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
