PHPackages                             pkglt/sylius-everypay-plugin - 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. pkglt/sylius-everypay-plugin

ActiveSylius-plugin[Payment Processing](/categories/payments)

pkglt/sylius-everypay-plugin
============================

EveryPay payment gateway for Sylius 2 - card and Baltic bank-link payments (SEB, LHV, Swedbank / LHV Paytech) via the hosted payment page.

v0.6.0(2w ago)023[1 PRs](https://github.com/pkglt/sylius-everypay-plugin/pulls)MITPHPPHP ^8.2CI passing

Since Jul 5Pushed 2w agoCompare

[ Source](https://github.com/pkglt/sylius-everypay-plugin)[ Packagist](https://packagist.org/packages/pkglt/sylius-everypay-plugin)[ Docs](https://github.com/pkglt/sylius-everypay-plugin)[ RSS](/packages/pkglt-sylius-everypay-plugin/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (8)Dependencies (69)Versions (11)Used By (0)

Sylius EveryPay Plugin
======================

[](#sylius-everypay-plugin)

[![Build](https://github.com/pkglt/sylius-everypay-plugin/actions/workflows/build.yaml/badge.svg)](https://github.com/pkglt/sylius-everypay-plugin/actions/workflows/build.yaml)[![Version](https://camo.githubusercontent.com/fdc87574f540035dcac61d53914587cfe0a11f370868e57e4af9738549355031/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f706b676c742f73796c6975732d65766572797061792d706c7567696e2e737667)](https://packagist.org/packages/pkglt/sylius-everypay-plugin)[![Downloads](https://camo.githubusercontent.com/ece1369ee0215ed085cf47cdbcbfaaf25fc7bb6034e3ab665d543f6452ca6005/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f706b676c742f73796c6975732d65766572797061792d706c7567696e2e737667)](https://packagist.org/packages/pkglt/sylius-everypay-plugin)[![License](https://camo.githubusercontent.com/8bb50fd2278f18fc326bf71f6e88ca8f884f72f179d3e555e20ed30157190d0d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e2e737667)](LICENSE)

[EveryPay](https://every-pay.com) payment gateway for **Sylius 2.x**. EveryPay is the LHV Paytech e-commerce platform used by the Baltic partner banks **SEB, LHV and Swedbank** - one integration gives you card payments, Open Banking bank links (all major Baltic banks), Apple Pay and Google Pay through EveryPay's hosted payment page.

Built on the modern Sylius **PaymentRequest** pipeline (`sylius/payment-bundle`) - no legacy Payum. The architecture follows Sylius' official Stripe and PayPal plugins; see [docs/architecture.md](docs/architecture.md).

EveryPay themselves offer no official Sylius integration and none is planned (confirmed by EveryPay support, September 2025) - this community plugin fills that gap.

> Not to be confused with everypay.gr (a Greek PSP with the same name).

Features
--------

[](#features)

- **One-off payments** via the EveryPay hosted payment page (cards, bank links, wallets)
- **In-shop payment method buttons** (optional): show the bank/card grid with EveryPay's own logos directly in your store and send customers straight to their bank's payment page - or keep the classic redirect (default)
- **Credential verification on save** - definitively wrong API credentials are rejected in the admin form; an unreachable EveryPay never blocks saving
- **Server-to-server callbacks** - unauthenticated callbacks are never trusted; the payment state is always re-read from the EveryPay API (the single source of truth)
- **Idempotent state synchronization** - customer return and callbacks may arrive in any order, any number of times
- **Full refunds** from the standard Sylius admin Refund button, executed transactionally (a failed EveryPay refund never leaves a payment marked refunded)
- **Portal-initiated refund detection** - a refund made in the EveryPay merchant portal syncs back without triggering a second refund API call; an admin refund rejected because the portal already refunded the payment reconciles against the live EveryPay state instead of failing
- **Chargeback visibility** - a disputed payment shows up in the admin navbar notifications with a link to the merchant portal, instead of only in the logs
- **Retry-friendly checkout** - a customer who bounces off the hosted page can pay again; failed attempts get a fresh Sylius payment automatically
- **Encrypted credentials** - gateway config is encrypted at rest by Sylius
- Admin form in **English, Lithuanian, Estonian, Latvian**

With the in-shop method buttons enabled, customers pick their bank or card without leaving the store (methods grouped by country, the customer's own country first):

[![In-shop payment method grid](docs/images/method-grid.png)](docs/images/method-grid.png)

Requirements
------------

[](#requirements)

VersionPHP8.2+Sylius2.2+Works with the standard Sylius shop frontend out of the box, and with headless/API-only stores (see [Headless checkouts](#headless--api-checkouts)).

Installation
------------

[](#installation)

### 1. Require the package

[](#1-require-the-package)

```
composer require pkglt/sylius-everypay-plugin
```

### 2. Register the bundle

[](#2-register-the-bundle)

```
// config/bundles.php
return [
    // ...
    Pkg\SyliusEveryPayPlugin\PkgSyliusEveryPayPlugin::class => ['all' => true],
];
```

### 3. Import the plugin configuration

[](#3-import-the-plugin-configuration)

```
# config/packages/pkg_sylius_everypay.yaml
imports:
    - { resource: '@PkgSyliusEveryPayPlugin/config/config.yaml' }
```

This registers the gateway validation groups and the admin form Twig hooks. No database migrations are needed - the plugin only uses core Sylius entities (`sylius_payment`, `sylius_payment_request`, `sylius_gateway_config`).

### 4. Create the payment method

[](#4-create-the-payment-method)

In the Sylius admin: *Payment methods -&gt; Create*, choose the **EveryPay (cards &amp; bank payments)** gateway, and fill in:

FieldWhere to find itAPI username / API secretEveryPay merchant portal -&gt; *Merchant settings -&gt; General*Processing accounte.g. `EUR3D1` - shown in the portal; fixes the currency and available methodsEnvironmentDemo (`igw-demo.every-pay.com`) or Live (`pay.every-pay.eu`)Checkout appearanceRedirect to EveryPay (default), or show the payment method buttons in the shopMerchant portal addressOptional. Banks white-label the merchant portal under their own address (e.g. SEB: `portal.ecommerce.sebgroup.com`); admin pages link there instead of `portal.every-pay.eu`[![EveryPay gateway configuration form](docs/images/admin-gateway-config.png)](docs/images/admin-gateway-config.png)

Credentials are verified against the EveryPay API when you save the form - a wrong secret or an unknown processing account fails validation with a clear message (network problems never block saving).

Because no Payum factory named `everypay` exists, Sylius automatically stores `use_payum = 0` on the gateway config and routes checkout through the PaymentRequest pipeline - no extra configuration needed.

### 5. Set the callback URL in the EveryPay portal

[](#5-set-the-callback-url-in-the-everypay-portal)

In the merchant portal under *E-shop settings -&gt; Payments*, set the callback (notification) URL to the Sylius payment method notify endpoint:

```
https:///payment-methods/

```

Keep **"Additional notifications via callback"** enabled so refund/void/chargeback events are delivered too, and leave the `order_reference` uniqueness validation on (the plugin generates unique references per payment attempt).

If your shop sits behind a CDN/WAF (e.g. Cloudflare), make sure `/payment-methods/*` is neither cached nor bot-challenged - a challenge page would silently eat the server-to-server callback.

Headless / API checkouts
------------------------

[](#headless--api-checkouts)

With `sylius/shop-bundle` installed, the customer return URL (`customer_url`) defaults to the shop's `/order/after-pay/{hash}` route - nothing to configure.

In headless stores (or for API-created payment requests in hybrid apps), pass the return URL of your frontend in the payment request payload instead:

```
{ "after_pay_url": "https://spa.example/checkout/thank-you" }
```

An explicit `after_pay_url` always wins over the shop route. Remember that EveryPay rejects URLs with a dotless host (plain `localhost` fails; `*.localhost`subdomains work). After the customer returns to your frontend, drive the usual Sylius payment-request status flow to settle the payment.

How it works
------------

[](#how-it-works)

FlowTriggerWhat happensCapturecustomer finishes checkout`POST /v4/payments/oneoff` -&gt; customer is redirected (303) to the hosted payment pageStatuscustomer returns to the shoppayment state re-read from the API, Sylius payment transitioned accordinglyNotifyEveryPay server callbackpayment resolved by `payment_reference`, state re-read from the API; non-2xx responses make EveryPay redeliver (6 retries / 72 h)Refundadmin presses Refundrefund payment request + `POST /v4/payments/refund` inside one transaction; a rejected refund reconciles against the re-read payment state (already refunded in the portal -&gt; completes), any other failure rolls everything back and the admin sees an error flashEvery payment row on the admin order page shows the raw EveryPay state and the payment reference (and, for live payments, a link to the merchant portal - the address configured on the gateway, or the standard EveryPay portal when none is set):

[![Admin order payments panel](docs/images/admin-order-payments.png)](docs/images/admin-order-payments.png)

See [docs/architecture.md](docs/architecture.md) for the full design (state mapping table, idempotency and concurrency notes) and [docs/everypay-api.md](docs/everypay-api.md) for the distilled EveryPay API v4 reference.

Local development &amp; testing gotchas
---------------------------------------

[](#local-development--testing-gotchas)

- EveryPay rejects `customer_url` with a dotless host - `http://localhost/...`fails one-off validation, while `.localhost` subdomains (e.g. `http://myshop.localhost`) pass. Point your dev channel hostname at a `.localhost` subdomain.
- Callbacks need a public URL - an `ngrok http 80 --host-header=`tunnel works fine against the demo environment.
- SEB demo test cards are documented publicly at [support.ecommerce.sebgroup.com](https://support.ecommerce.sebgroup.com/en/articles/13459276-test-cards).

Development
-----------

[](#development)

```
composer install
vendor/bin/phpunit --testsuite unit         # pure unit tests (no kernel, no DB)
vendor/bin/phpunit --testsuite functional   # boots the plugin inside sylius/test-application
vendor/bin/phpunit                          # both suites
vendor/bin/behat                            # Gherkin payment-lifecycle scenarios
vendor/bin/phpstan analyse                  # static analysis, level 9
vendor/bin/ecs check                        # coding standard (Sylius Labs)
```

The functional suite runs the plugin inside the official Sylius test application on SQLite with a scripted EveryPay API mock - no database service, browser or frontend build required. It covers container wiring, the notify endpoint (including a settled callback moving a payment through the real state machine), the capture flow on the real payment-request command bus, and the admin gateway form rendering.

This repository is set up for AI-agent-assisted development - see [AGENTS.md](AGENTS.md) for the project map, invariants and conventions.

Roadmap
-------

[](#roadmap)

- Partial refunds via `sylius/refund-plugin` integration (the API client already accepts arbitrary amounts)
- Tokenized/CIT payments (`request_token`)
- Embedded in-shop checkout via the EveryPay **Payment Elements** JS SDK - the element EveryPay's own platform plugins mount in-page (`mobile_payment`one-offs, hosted iframe card form, SAQ A per EveryPay's PCI classification). Blocked until EveryPay confirms/documents the SDK for custom integrations - see [docs/everypay-api.md](docs/everypay-api.md#payment-elements-embedded-checkout)
- In-shop **Apple Pay / Google Pay buttons** - both wallets already work on the hosted payment page with no plugin changes (enable them on the processing account); native buttons inside the store ride on the Payment Elements work above, or on EveryPay's dedicated wallet web clients (`apple-pay-client` / `google-pay-client`), and need Apple Pay merchant domain verification through EveryPay

Contributing &amp; security
---------------------------

[](#contributing--security)

Contributions are welcome - see [CONTRIBUTING.md](CONTRIBUTING.md) and the agent/architecture guide in [AGENTS.md](AGENTS.md). Please report security issues privately per [SECURITY.md](SECURITY.md). Changes are tracked in the [CHANGELOG](CHANGELOG.md).

License
-------

[](#license)

MIT - see [LICENSE](LICENSE).

Verified end-to-end against the EveryPay/SEB demo environment (full pay, refund, callback and failure paths).

*EveryPay is a trademark of its respective owner (EveryPay AS / LHV Paytech). This is an independent community integration, not affiliated with or endorsed by EveryPay, LHV, SEB or Swedbank.*

###  Health Score

41

—

FairBetter than 87% of packages

Maintenance96

Actively maintained with recent releases

Popularity9

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity42

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 97.1% 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

Every ~4 days

Total

9

Last Release

17d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/1830639?v=4)[Alfonsas Cirtautas](/maintainers/acirtautas)[@acirtautas](https://github.com/acirtautas)

---

Top Contributors

[![acirtautas](https://avatars.githubusercontent.com/u/1830639?v=4)](https://github.com/acirtautas "acirtautas (66 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (2 commits)")

---

Tags

balticsecommerceeverypayopen-bankingpayment-gatewaypaymentsphpsyliussylius-pluginsymfonysyliuspaymentgatewaysebsylius-pluginOpen BankingBanklinkSwedbanklhvbalticeverypayevery-pay

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/pkglt-sylius-everypay-plugin/health.svg)

```
[![Health](https://phpackages.com/badges/pkglt-sylius-everypay-plugin/health.svg)](https://phpackages.com/packages/pkglt-sylius-everypay-plugin)
```

###  Alternatives

[shopware/platform

The Shopware e-commerce core

3.4k1.5M3](/packages/shopware-platform)[shopware/core

Shopware platform is the core for all Shopware ecommerce products.

595.8M682](/packages/shopware-core)[sulu/sulu

Core framework that implements the functionality of the Sulu content management system

1.3k1.4M236](/packages/sulu-sulu)[contao/core-bundle

Contao Open Source CMS

1301.7M3.1k](/packages/contao-core-bundle)[flow-php/flow

PHP ETL - Extract Transform Load - Data processing framework

86337.5k](/packages/flow-php-flow)[pimcore/pimcore

Content &amp; Product Management Framework (CMS/PIM/E-Commerce)

3.8k3.9M536](/packages/pimcore-pimcore)

PHPackages © 2026

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