Installation:
composer require payum/payum-bundle
Add to config/bundles.php:
return [
// ...
Payum\PayumBundle\PayumBundle::class => ['all' => true],
];
Configure a Gateway (e.g., Stripe):
# config/packages/payum.yaml
payum:
security:
token_storage_id: payum.security.token_storage.default
gateways:
stripe:
factory: stripe
username: '%env(STRIPE_SECRET_KEY)%'
password: '' # Not used for Stripe
client_id: '%env(STRIPE_CLIENT_ID)%'
client_secret: '%env(STRIPE_SECRET_KEY)%'
sandbox: '%env(bool:STRIPE_SANDBOX)%'
First Use Case: Create a payment action in a controller:
use Payum\Core\Request\Capture;
use Payum\Core\Payum;
public function pay(Payum $payum, Request $request)
{
$token = $payum->getTokenFactory()->createToken(
Capture::class,
'stripe',
'unique_order_id'
);
$token->setDetails([
'amount' => 1000, // $10.00
'currency' => 'USD',
]);
return $this->redirect($token->getAuthorizationUrl());
}
Token-Based Payments:
TokenFactory to create tokens for Capture, Authorize, or Notify requests.$token = $payum->getTokenFactory()->createToken(
Capture::class,
'stripe',
'order_123'
);
$token->setDetails($orderData);
return $this->redirect($token->getAuthorizationUrl());
Handling Callbacks:
PayumHttpRequestVerifier middleware to validate webhook signatures.public function handleCallback(Payum $payum, Request $request)
{
$token = $payum->getHttpRequestVerifier()->verify($request);
$payum->getGateway('stripe')->executeStatus($token);
// Handle success/failure
}
Storage Integration:
payum:
storages:
Payum\Core\Model\Token:
doctrine: ~
$form = $this->createFormBuilder($token->getDetails())
->add('amount', MoneyType::class)
->getForm();
// config/services.yaml
Payum\PayumBundle\EventListener\PaymentListener:
tags:
- { name: kernel.event_listener, event: payum.action.post.execute, method: onPostExecute }
PayumBundleSandbox for isolated testing:
composer require --dev makasim/payum-bundlesandbox
Token Expiry:
$token = $payum->getTokenFactory()->createToken(Capture::class, 'stripe', 'order_123');
payum.yaml:
payum:
security:
token_storage:
default:
class: Payum\Core\Security\TokenStorage\SymfonyTokenStorage
options:
token_lifetime: 3600 # 1 hour
Gateway-Specific Quirks:
client_id/client_secret for API keys.username/password for classic API (deprecated).country option to set the bank country.CSRF Protection:
$token = $payum->getHttpRequestVerifier()->verify($request);
if (!$token) {
throw new \RuntimeException('Invalid token');
}
payum:
logging:
enabled: true
level: debug
$status = $payum->getGateway('stripe')->executeStatus($token);
dump($status->getData());
sandbox: true in config to test without real transactions.Custom Actions:
Payum\Core\Action\ActionInterface for custom logic.Refund action for your gateway.Storage Adapters:
Payum\Core\Storage\StorageInterface for custom storage (e.g., DynamoDB).Gateway Factories:
use Payum\Core\Bridge\Spl\ArrayObject;
use Payum\Core\GatewayFactory;
$gatewayFactory = new GatewayFactory();
$gatewayFactory->addGateway('custom_gateway', function(ArrayObject $array) {
return new CustomGateway($array['username'], $array['password']);
});
How can I help you explore Laravel packages today?