Appearance
Payment SDK
Fingermark Payment SDK Architecture
Overview
Fingermark Payment SDKs have been designed to handle 3rd party consumption, as well as Supersonic integration.
This is achieved through using a ports and adapters or hexagonal architecture pattern where payment integrations (@fingermarkglobal/adyen) expose ports to be used, while @fingermarkglobal/transactions acts as the adapter to bring them into the Supersonic ecosystem.
Ports (Payment Integration)
A payment integration must expose the following interface.
js
const { pay, refund, settle } = new PaymentIntegration();pay
The main payment function. This will receive payment information such as
amount
refund
The main refund function. This will receive refund information such as
transactionId
settle
The "settlement" or "confirmation" function. This will confirm payment/s has completed to the pinpad or integration service.
Each of these functions must return a running XState machine with the current state of the operation. The machine must contain the following states:
- loading
- failure
- success
This is to ensure payment processes work across all client UIs.
Adapter (Payment SDK)
The @fingermarkglobal/transactions SDK exposes a buildPaymentHandlers function that exposes the ports pay, refund and settle requests. This is so the Payment SDK can link the provider integration into the Supersonic ecosystem
- KAS settings intergration
- UI payment polymorphism (UI's can switch payment providers without any code changes)
- Metadata capturing (Attatching Supersonic logging events to machines)
Diagram

Additional Resources
- https://fingermark.notion.site/Payment-SDK-756e04f4a8f74dd49376ef0301373798
- https://gist.github.com/keezeden/d8b001c127e67e69b1b4fa9816f36ffe
- https://medium.com/idealo-tech-blog/hexagonal-ports-adapters-architecture-e3617bcf00a0
Outstanding
- Migrate to typescript for easier enforcment and self documentation of interfaces
- Add more ports for other dependencies (database calls, settings providers etc)