Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Payment Bundle Laravel Package

astina/payment-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require origammi/payment-bundle
    

    Ensure your composer.json targets Symfony 2.8 or 3.4.

  2. Enable the Bundle: Add to config/bundles.php (Symfony 3.4+):

    return [
        // ...
        Origammi\PaymentBundle\AstinaPaymentBundle::class => ['all' => true],
    ];
    
  3. Configure Parameters: Define provider-specific parameters in config/packages/astina_payment.yaml (or app/config/parameters.yml for Symfony 2.8):

    astina_payment:
        datatrans:
            merchantid: "YOUR_MERCHANT_ID"
            serviceurl: "https://secure.datatrans.com/paypage/"
            authorizexmlurl: "https://secure.datatrans.com/payextras/authorize.fcgi"
            capturexmlurl: "https://secure.datatrans.com/payextras/capture.fcgi"
            sign: "YOUR_SIGN"
            sign2: "YOUR_SIGN2"
        # Repeat for other providers (paypal, saferpay, computop)
    
  4. Service Configuration: Override the default service definition in config/services.yaml (or app/config/services.xml for Symfony 2.8):

    services:
        astina_payment.provider:
            class: Astina\PaymentBundle\Provider\Datatrans\Provider
            arguments:
                $merchantId: "%env(ASTINA_DATATRANS_MERCHANTID)%"
                $serviceUrl: "%env(ASTINA_DATATRANS_SERVICEURL)%"
                # ... other arguments
                $logger: "@logger"
    
  5. First Use Case: Use the PaymentManager to create a payment:

    use Astina\PaymentBundle\Manager\PaymentManager;
    
    class CheckoutController extends AbstractController
    {
        public function checkout(PaymentManager $paymentManager)
        {
            $payment = $paymentManager->createPayment('datatrans', 100.00, 'EUR');
            $payment->setDescription('Product Purchase');
            $payment->setOrderId('ORDER_123');
    
            return $this->redirect($payment->getPaymentUrl());
        }
    }
    

Implementation Patterns

Core Workflow

  1. Payment Creation: Use PaymentManager to instantiate a payment object for a specific provider:

    $payment = $paymentManager->createPayment('paypal', 50.00, 'USD');
    $payment->setCurrency('USD');
    $payment->setReturnUrl($this->generateUrl('checkout_success'));
    
  2. Redirect to Provider: For redirect-based flows (e.g., PayPal), use the generated URL:

    return $this->redirect($payment->getPaymentUrl());
    
  3. Handle Callback: After user returns, process the callback:

    public function handleCallback(PaymentManager $paymentManager, Request $request)
    {
        $payment = $paymentManager->createTransactionFromRequest($request);
        if ($payment->isSuccessful()) {
            // Process successful payment
        }
        return $this->render('checkout/callback.html.twig');
    }
    
  4. Direct API Calls: For non-redirect providers (e.g., Datatrans), call methods directly:

    $result = $payment->authorize();
    $payment->capture($result->getTransactionId());
    

Integration Tips

  • Symfony Forms: Bind payment fields to a form for user input:

    $builder->add('cardNumber', TextType::class, [
        'attr' => ['autocomplete' => 'cc-number']
    ]);
    
  • Event Listeners: Subscribe to payment events (e.g., payment.success) for logging or notifications:

    services:
        App\EventListener\PaymentListener:
            tags:
                - { name: kernel.event_listener, event: payment.success, method: onPaymentSuccess }
    
  • Testing: Use the testmode parameter for Saferpay or mock the PaymentManager in tests:

    $this->paymentManager->expects($this->once())
        ->method('createPayment')
        ->willReturn($mockPayment);
    
  • Multi-Provider Support: Dynamically switch providers based on user selection or region:

    $provider = $request->get('provider', 'datatrans');
    $payment = $paymentManager->createPayment($provider, $amount, $currency);
    

Gotchas and Tips

Pitfalls

  1. Deprecated Symfony 2.8: The bundle is unmaintained and lacks Symfony 5/6 support. Avoid in new projects unless absolutely necessary.

  2. Breaking Changes:

    • Saferpay v1.20: Version 3.0.0 requires username and terminalId parameters (previously optional).
    • Computop URL Changes: Hardcoded URLs in older versions may break; update to the latest computop/paygate endpoint.
  3. Logger Dependency: The logger argument is mandatory for all providers. Ensure it’s injected correctly:

    arguments:
        $logger: "@logger"  # Not "@monolog.logger"
    
  4. PayPal NVP API:

    • The bundle uses deprecated PayPal NVP API (v53.0). Migrate to REST API for new projects.
    • DoExpressCheckoutPayment may fail if PAYMENTREQUEST_0_AMT doesn’t match the original SetExpressCheckout amount.
  5. Datatrans Signatures: sign and sign2 are case-sensitive and must match your Datatrans merchant configuration exactly.

  6. Saferpay Test Mode:

    • The testmode parameter was renamed from environment in v2.0.0. Ensure consistency:
      # Correct (v2.0+)
      astina_payment.saferpay.testmode: true
      
    • Test API (https://test.saferpay.com) requires a separate test account (not shared with production).
  7. Computop Limitations: Only authorization is implemented. Capture/refund requires custom logic or a newer provider.

Debugging Tips

  1. Enable Logging: Configure Monolog to log payment requests/responses:

    monolog:
        handlers:
            payment:
                type: stream
                path: "%kernel.logs_dir%/payment.log"
                level: debug
    
  2. Raw Request/Response: For PayPal/Datatrans, inspect the raw data in the Payment object:

    $payment->getRawResponse(); // After callback
    
  3. Saferpay API Errors: Check the PaymentException for Saferpay-specific error codes (e.g., 100 for invalid credentials).

  4. Symfony 3.4 Compatibility: If using Symfony 3.4, ensure flex-recuse is installed for autowiring:

    composer require symfony/flex
    

Extension Points

  1. Custom Providers: Extend Astina\PaymentBundle\Provider\AbstractProvider to add new gateways:

    class StripeProvider extends AbstractProvider
    {
        public function createPaymentUrl(): string
        {
            // Custom logic
        }
    }
    
  2. Override Services: Replace the default PaymentManager to add pre/post-processing:

    services:
        astina_payment.manager:
            class: App\Service\CustomPaymentManager
            decorates: astina_payment.manager
            arguments:
                $innerManager: '@astina_payment.manager.inner'
    
  3. Payment Events: Dispatch custom events in PaymentManager:

    $dispatcher->dispatch(new PaymentEvent($payment, 'payment.created'));
    
  4. Configuration Validation: Add validation to parameters.yml using Symfony’s validator:

    astina_payment:
        datatrans:
            sign: "%env(string:ASTINA_DATATRANS_SIGN)%" # Enforce string type
    
  5. Webhook Handling: For providers without callbacks (e.g., Stripe), implement a webhook controller:

    public function handleWebhook(Request $request, PaymentManager $manager)
    {
        $payment = $manager->createTransactionFromWebhook($request->getContent());
        // Process async payment
    }
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
ilhamsyabani/laravel-volt-starter
thethunderturner/filament-latex
ghostcompiler/laravel-querybuilder
webrek/laravel-telescope-mongodb
anousss007/blatui
zatona-eg/zatona-eg-api
cocosmos/filament-sticky-save-bar
patrickbussmann/oauth2-apple
3brs/enterprise-security-bundle
anousss007/vigilance
supportpal/eloquent-model
ardenexal/fhir-models
laravel-at/laravel-image-sanitize
romalytar/yammi-audit-log-laravel
ardenexal/fhir-validation
arshaviras/weather-widget
laravel-chronicle/core
sunchayn/nimbus
daikazu/eloquent-salesforce-objects
unseen-codes/chat