digitick/sepa-xml
PHP library for generating SEPA XML payment files. Build pain.001 credit transfers and pain.008 direct debits with a fluent API, supporting batches, groups, and multiple payment methods for European bank payments.
Architecture fit: php-sepa-xml (the library previously referenced as digitick/sepa-xml) remains a plain PHP, stateless, file-oriented XML generator, not a Laravel package. It still fits best as an isolated outbound-payments adapter behind an application-owned interface such as SepaFileGenerator, called from a service or action class rather than from controllers, models, or jobs. Release 3.2.0 does not change that: there is still no service provider, no publishable config, and no framework-native validation. It generates pain.001 credit-transfer and pain.008 direct-debit files; it is not a payment orchestration, mandate-management, reconciliation, or bank-connectivity platform. The surrounding Laravel domain model must continue to own debtor/creditor data, mandates, approval states, idempotency, file retention, and audit trails, with a thin anti-corruption layer mapping internal DTOs into package objects and generated files into storage and delivery workflows.
Integration feasibility: Composer installation remains straightforward. Two changes in 3.2.0 materially improve integration feasibility. First, optional XSD validation (PR #256) lets the application reject schema-invalid files before bank submission, which supports a genuine pre-delivery gate rather than relying on well-formedness alone. Second, ramsey/uuid moved to require-dev (PR #246), reducing the production dependency footprint — but any application code that implicitly relied on ramsey/uuid being installed transitively must now declare it explicitly. Creditor postal address support for pain.008 (PR #250) closes a known gap that some banks and scheme rulebooks expect on direct-debit files. The <PmtTpInf> restoration (PR #245) is a correctness fix: the element was dropped in v3.0, so files generated on 3.0.x and 3.1.x may have been missing Payment Type Information that certain scheme and bank profiles require. Integration effort is still dominated by business-data validation (IBAN/BIC, creditor identifier, mandate references, sequence types, execution dates, currency, batch booking) and by bank certification, not by XML generation. LGPL-3.0 review remains required for distribution or modification.
Technical risk: The release is a net risk reduction but also evidence of a real risk. On the positive side, the project shows sustained maintainer activity, dependency hygiene via Dependabot, documentation restructuring, two new contributors, and — most importantly — a built-in XSD validation option that shifts some correctness burden off the application. On the negative side, the <PmtTpInf> regression shipped in a major release and persisted across two releases before being fixed; that is a concrete precedent that schema-level regressions can reach consumers, which justifies strict version pinning and golden-file regression tests rather than trust in semantic versioning. The protected visibility change (PR #255) is an API-surface adjustment that may affect any code extending package classes, though it should be inert for composition-only usage. A further item to verify: the repository now appears under the php-sepa-xml GitHub organization rather than the original digitick namespace, so the canonical Composer package name, successor-package status, and whether the old name is abandoned or aliased must be confirmed before pinning. Adoption signals remain modest (a few hundred stars, negligible listed dependents), so bus factor and ecosystem validation are still limited. Treat this as a tactical component behind a replaceable adapter.
Key questions:
<PmtTpInf> block match each bank's implementation guide?pain.001), direct debit (pain.008), or both, and are creditor postal addresses now mandatory for the direct-debit banks in scope?php-sepa-xml organization, and is the old digitick package abandoned, aliased, or still maintained?<PmtTpInf>, and were any accepted or rejected?protected?ramsey/uuid transitively, and must it now be declared directly?Stack fit: Keep the library inside a Laravel service or action class behind an internal PaymentFileGenerator contract, with config/payments.php holding creditor name, creditor identifier, default account, scheme, and bank profile. Use Laravel validation for pre-generation business rules, queued jobs for generation, an encrypted private filesystem disk, and metadata-only logging (never full IBANs, mandates, or file contents). With 3.2.0, add a second gate: run the package's optional XSD validation inside the adapter and treat a failure as a hard stop, distinct from bank acceptance. Keep a feature flag and kill switch so the adapter can be disabled without redeploy.
Migration path: Pin to 3.2.x explicitly rather than floating. For any environment on 3.0.x or 3.1.x, treat the upgrade as a correctness fix and regenerate and diff affected fixtures — specifically watching for the newly present <PmtTpInf> block, any pain.008 postal-address fields, and any output changes from the visibility refactor. Where a bank previously accepted 3.0/3.1 output, re-run sandbox validation rather than assuming the added element is harmless. If a manual CSV or portal process exists, continue parallel running for a limited payment run and compare against bank acceptance. Do not expose package classes in domain code, so replacement with another generator or a bank API stays contained. Maintain a golden-file test suite with versioned XML fixtures and turn on XSD validation in CI.
Compatibility: Verify PHP constraints against the current Laravel version and confirm DOM, SimpleXML, libxml, and mbstring availability, since XSD validation now depends on libxml behaviour. Confirm that enabling XSD validation does not require schema files to be fetched at runtime; bundle and govern them locally. Declare ramsey/uuid directly if used, since it is no longer a production requirement of this package. Confirm no internal class extends package classes affected by the protected visibility change. Test character encoding, line endings, batch limits, and mandate/sequence types. Complete LGPL-3.0 review for the intended deployment model. Keep Composer pinning and CI checks so an upstream release cannot silently alter output.
Sequencing:
pain.008 file with creditor postal address.Maintenance: Activity has improved — dependency automation, documentation restructuring, and two new contributors — but there is still no commercial vendor and the maintainer pool is small. The <PmtTpInf> regression that survived two releases means upgrades must be tested, not assumed safe. Pin the version, subscribe to releases and security advisories, and own the golden-file tests internally. Prefer contributing upstream over forking; any fork or modification must satisfy LGPL obligations. Budget for schema changes, bank rule changes, and XSD version updates.
Support: Still no commercial support. The internal team owns the runbook for generation failures, XSD validation failures, bank rejections, duplicate files, and reconciliation breaks. The new XSD gate is operationally valuable but adds a distinct failure class that support staff must be able to triage separately from bank rejection. Document bank-specific rejection codes and the correction-and-resubmission process, and note that a file passing XSD validation is not thereby bank-accepted.
Scaling: Unchanged. XML generation is cheap; constraints come from bank batch limits, memory on very large batches, queue throughput, storage, and delivery reliability. Generate in queued jobs, chunk to bank limits, and store immutable files with checksums. XSD validation adds CPU and memory per file, so validate large batches after chunking rather than on a single monolithic document. The package remains unsuitable for real-time or per-transaction payment initiation without an architectural layer around it.
Failure modes: Invalid IBAN/BIC or creditor identifiers, malformed mandates, unsupported or missing schema elements (the <PmtTpInf> case is the live example), encoding errors, XSD validation failures, bank-side rejection, duplicate submissions, partial batch generation, delivery failure over SFTP or portal, and sensitive-data exposure in logs or temp files. Mitigate with pre-generation validation, an XSD gate, idempotency keys, checksums, explicit file states, approval gates, encrypted storage, retention policies, and reconciliation against bank acknowledgements. Track the specific upstream version that produced each submitted file, so a format regression can be traced and reissued.
Ramp-up: A Laravel/PHP developer can still produce a happy-path file in one to three days. Production hardening now includes an XSD validation step, fixture regeneration against 3.2.0, and postal-address handling for direct debits, so allow one to two weeks or more, excluding bank certification lead time. Operations and finance users need training on file approval, XSD-versus-bank rejection handling, and retention. Position the package as a tactical accelerator for SEPA XML generation — now with better validation support and a healthier maintenance signal — behind a replaceable adapter, not as the foundation of a payments platform.
How can I help you explore Laravel packages today?