Moduł płatności dla NimblePHP.
Na ten moment moduł wspiera:
- modułowy storage transakcji
module_payment_transaction - wspólny flow transakcji modułu z persystencją statusów i payloadów
- wybór systemu płatności przez
NimblePHP\Payments\Payments - system
przelewy24 - provider adapter dla Przelewy24 nad niskopoziomowym gatewayem
- provider-specific DTO dla rejestracji i weryfikacji transakcji
- provider-specific response DTO dla odpowiedzi API
- obsługę callbacków / webhooków operatora
- mapowanie statusów operatora na wspólny status modułu
- budowanie URL checkoutu dla Przelewy24
To nie jest jeszcze w pełni generyczna warstwa dla wielu operatorów. Obecne DTO odzwierciedlają payloady Przelewy24 i są trzymane w:
src/Provider/Przelewy24/DTO/
- PHP
>=8.4 ext-curlnimblephp/framework ^0.4.3nimblephp/migrations ^0.3.2brick/money ^0.12.2
composer require nimblephp/paymentsPo instalacji moduł powinien zostać uwzględniony w aktualizacji projektu, tak aby wykonały się jego migracje.
Moduł trzyma własne migracje w katalogu:
migrations/
Hook NimblePHP\Payments\Module::onUpdate() uruchamia je przez nimblephp/migrations z grupą:
nimblephp-payments
Obecne migracje:
- tworzą tabelę
module_payment_transaction - rozszerzają storage o
provider_statusiwebhook_payload - dodają indeksy po najważniejszych polach wyszukiwania
- używają aktualnych klas kolumn z
krzysztofzylka/database-manager/src/Columns
Przy kolejnych zmianach schematu należy dodawać nowe pliki migracji, zamiast rozbudowywać Module::onUpdate() o ręczne CreateTable / ALTER TABLE.
NimblePHP\Payments\PaymentsNimblePHP\Payments\Module
NimblePHP\Payments\Enum\PaymentSystemEnumNimblePHP\Payments\Enum\PaymentTransactionStatusEnum
NimblePHP\Payments\DTO\PaymentTransactionDTONimblePHP\Payments\DTO\PaymentFlowResultDTONimblePHP\Payments\DTO\ProviderTransactionUpdateDTONimblePHP\Payments\Model\PaymentTransactionModelNimblePHP\Payments\Service\PaymentTransactionFlowServiceNimblePHP\Payments\Contracts\PaymentProviderAdapterInterface
NimblePHP\Payments\Provider\Przelewy24\Przelewy24AdapterNimblePHP\Payments\Provider\Przelewy24\Przelewy24GatewayNimblePHP\Payments\Provider\Przelewy24\DTO\Przelewy24ConfigDTONimblePHP\Payments\Provider\Przelewy24\DTO\Przelewy24RegisterTransactionDTONimblePHP\Payments\Provider\Przelewy24\DTO\Przelewy24RegisterTransactionResponseDTONimblePHP\Payments\Provider\Przelewy24\DTO\Przelewy24VerifyTransactionDTONimblePHP\Payments\Provider\Przelewy24\DTO\Przelewy24VerifyTransactionResponseDTO
Biblioteka czyta konfigurację z NimblePHP\Framework\Config.
Obsługiwane klucze:
PRZELEWY24_MERCHANT_IDPRZELEWY24_MECHANT_ID- fallback dla starszej literówkiPRZELEWY24_POS_IDPRZELEWY24_API_KEYPRZELEWY24_CRCPRZELEWY24_API-productionalbosandbox
use NimblePHP\Payments\DTO\PaymentTransactionDTO;
use NimblePHP\Payments\Enum\PaymentSystemEnum;
use NimblePHP\Payments\Payments;
use NimblePHP\Payments\Provider\Przelewy24\DTO\Przelewy24RegisterTransactionDTO;
use NimblePHP\Payments\Provider\Przelewy24\DTO\Przelewy24VerifyTransactionDTO;
$payments = new Payments('przelewy24');
$flow = $payments->flow();
$transaction = new PaymentTransactionDTO();
$transaction->provider = PaymentSystemEnum::przelewy24;
$transaction->amount = 12345;
$transaction->objectType = 'order';
$transaction->objectId = 123;
$register = new Przelewy24RegisterTransactionDTO();
$register->sessionId = 'session-123';
$register->amount = 12345;
$register->description = 'Order #123';
$register->email = 'john@example.com';
$register->urlReturn = 'https://example.com/order/123';
$register->urlStatus = 'https://example.com/payment/callback';
$registered = $flow->registerTransaction($transaction, $register);
$checkoutUrl = $registered->checkoutUrl;
$flow->handleWebhook([
'data' => [
'sessionId' => 'session-123',
'orderId' => 10001,
'status' => 2,
],
]);
$verify = new Przelewy24VerifyTransactionDTO();
$verify->sessionId = 'session-123';
$verify->orderId = 10001;
$verify->amount = 12345;
$verify->currency = 'PLN';
$flow->verifyTransaction($registered->transactionId, $verify);Paymentswybiera provider na podstawie stringa alboPaymentSystemEnumPaymentsudostępnia zarówno niski poziom (gateway()), jak i wspólny flow modułu (flow())GatewayInterfacetrzyma wspólny kontrakt dla providerówPaymentProviderAdapterInterfaceoddziela flow modułu od logiki konkretnego operatoraModule::onUpdate()uruchamia migracje modułu z katalogumigrations/- implementacje providerów są w
src/Provider/ - adapter operatora mapuje statusy i webhooki do wspólnego formatu modułu
PaymentTransactionFlowServiceodpowiada za zapis rekordu, update statusów i przechowanie payloadów- DTO są provider-specific, dopóki nie pojawi się realna potrzeba wspólnej warstwy dla wielu operatorów
- storage transakcji jest wspólny dla modułu i nie jest nazwany per provider
- migracje używają aktualnych klas kolumn zamiast deprecated helperów
addIdColumn()/addDateCreatedColumn()/addDateModifyColumn()
Aktualny wspólny storage modułu zawiera między innymi:
providerprovider_session_idprovider_order_idprovider_transaction_idprovider_tokenprovider_statusaccount_idobject_typeobject_idamountcurrencystatusrequest_payloadregister_response_payloadverify_response_payloadwebhook_payloadmetadatadate_completeddate_faileddate_createddate_modify
- callback / webhook operatora nie kończy flow sam z siebie — aktualizuje transakcję do stanu pośredniego i zapisuje surowy payload,
- finalne potwierdzenie płatności powinno następować po
verifyTransaction(...), - moduł przechowuje jednocześnie wspólny
statusoraz surowyprovider_status, - adapter operatora odpowiada za mapowanie statusów zewnętrznych do
PaymentTransactionStatusEnum.