c975l/purchasecredits-bundle
Install Dependencies
composer require c975l/purchasecredits-bundle c975l/payment-bundle stripe/stripe-php
Ensure you have a Stripe account and configure c975LPaymentBundle first (see its docs).
Enable Bundles
Add to config/bundles.php:
return [
// ...
C975L\PurchaseCreditsBundle\PurchaseCreditsBundle::class => ['all' => true],
C975L\PaymentBundle\PaymentBundle::class => ['all' => true],
];
Configure Stripe & Terms of Sale
Update .env with Stripe keys:
STRIPE_SECRET_KEY=your_secret_key
STRIPE_PUBLISHABLE_KEY=your_publishable_key
Define a PDF route for Terms of Sale (e.g., /terms-of-sale.pdf). Use c975LSiteBundle if needed.
First Use Case: Credit Purchase Form Create a form in a controller:
use C975L\PurchaseCreditsBundle\Form\CreditPurchaseType;
public function purchaseAction(Request $request)
{
$form = $this->createForm(CreditPurchaseType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$creditPurchase = $form->getData();
$this->get('c975l_purchase_credits.manager')->purchase($creditPurchase);
// Redirect to success page
}
return $this->render('purchase_credits/index.html.twig', ['form' => $form->createView()]);
}
Credit Purchase Flow
CreditPurchaseType form to collect:
100 for 100 credits).c975LPaymentBundle).$manager = $this->get('c975l_purchase_credits.manager');
$manager->purchase($creditPurchase);
Toolbar Integration
c975LToolbarBundle to display credit balance:
{{ toolbar_item('credits', user.credits) }}
Credit Consumption
$this->get('c975l_purchase_credits.manager')->consume($user, 10);
if (!$manager->hasSufficientCredits($user, 10)) {
throw new \RuntimeException('Insufficient credits');
}
User Model
Extend your User entity to include:
/**
* @ORM\Column(type="integer")
*/
private $credits = 0;
Sync with the bundle’s Credit entity via listeners or services.
Custom Emails
Override email templates in:
templates/C975LPurchaseCreditsBundle/Email/.
Extend the PurchaseCreditsEvents to modify email logic.
Webhooks Listen for Stripe webhooks to update credits on payment success/failure:
$this->get('c975l_payment.webhook_handler')->handle(
$request->getContent(),
'credit_payment_success'
);
Admin Panel Use the bundle’s CRUD for managing credits manually:
$this->get('c975l_purchase_credits.manager')->adminAddCredits($user, 50);
Stripe Dependency
Class 'Stripe\Stripe' not found.stripe/stripe-php is installed and keys are set in .env.c975LPaymentBundle first.Missing Terms of Sale PDF
No route found for PDF attachment./terms.pdf) or use c975LSiteBundle to generate it dynamically.Email Delivery Failures
config/packages/mailer.yaml.swiftmailer in dev mode.Credit Double-Counting
$entityManager->beginTransaction();
try {
$manager->purchase($creditPurchase);
$entityManager->commit();
} catch (\Exception $e) {
$entityManager->rollBack();
throw $e;
}
Log Stripe Events
Enable Stripe logging in .env:
STRIPE_LOG_LEVEL=debug
Check logs at var/log/stripe.log.
Symfony Profiler Use the profiler to inspect:
c975l_purchase_credits.manager service calls.PurchaseCreditsEvents::CREDIT_PURCHASED).Database Dumps
Dump the credit table to verify transactions:
php bin/console doctrine:schema:update --dump-sql
Custom Credit Types
Extend the Credit entity or create a new one:
// config/packages/c975l_purchase_credits.yaml
c975l_purchase_credits:
credit_classes:
- App\Entity\CustomCredit
Validation Rules Override credit purchase validation:
// src/EventListener/CreditPurchaseListener.php
public function onCreditPurchase(PurchaseCreditsEvent $event)
{
if ($event->getCreditPurchase()->getAmount() > 1000) {
throw new \RuntimeException('Max 1000 credits per purchase');
}
}
Register the listener in services.yaml:
services:
App\EventListener\CreditPurchaseListener:
tags:
- { name: kernel.event_listener, event: c975l.purchase_credits.purchase, method: onCreditPurchase }
Alternative Payment Gateways
Decouple from Stripe by implementing PaymentGatewayInterface:
class PaypalGateway implements PaymentGatewayInterface
{
public function createPaymentIntent($amount, $currency): array
{
// PayPal logic here
}
}
Register it in services.yaml:
c975l_purchase_credits.payment_gateway: '@App\Service\PaypalGateway'
Multi-Currency Support
Extend the CreditPurchase form to include currency:
$builder->add('currency', ChoiceType::class, ['choices' => ['USD' => 'USD', 'EUR' => 'EUR']]);
Update Stripe integration to handle currency conversion.
Default Credit Value
Set a default credit value in config/packages/c975l_purchase_credits.yaml:
c975l_purchase_credits:
default_credit_value: 10 # 10 credits per default purchase
Email Templates
Override templates by copying from:
vendor/c975l/purchasecredits-bundle/Resources/views/Email/
to:
templates/C975LPurchaseCreditsBundle/Email/.
Toolbar Icons
Customize toolbar icons by overriding Twig templates:
templates/C975LToolbarBundle/Toolbar/credits.html.twig.
How can I help you explore Laravel packages today?