Clients
Le bundle persiste une projection locale du customer Stripe dans CashierBundle\Entity\StripeCustomer.
Créer ou récupérer un customer Stripe
use CashierBundle\Contract\BillableEntityInterface;
use CashierBundle\Service\CustomerService;
final readonly class CheckoutController
{
public function __construct(
private CustomerService $customerService,
) {
}
public function __invoke(BillableEntityInterface $user): void
{
$stripeId = $this->customerService->createOrGetStripeId($user);
}
}Le payload Stripe est construit à partir de votre entité billable:
getEmail()getName()getPhone(): ?string(optionnel)getAddress(): ?array(optionnel, doit retourner['line1' => '...', 'line2' => '...', 'postal_code' => '...', 'city' => '...', 'country' => 'FR'])
Mettre à jour le customer
$this->customerService->update($user, [
'metadata' => [
'source' => 'backoffice',
],
]);Synchronisation locale
Le bundle conserve les données utiles en local pour éviter de dépendre uniquement d’un fetch Stripe temps réel.
Champs synchronisés automatiquement
Champs de StripeCustomer:
stripeIdemailnamephonecurrencybalance(solde en centimes)address(tableau)invoicePrefixtaxExemptpmType(type de méthode de paiement par défaut)pmLastFour(4 derniers chiffres)billableIdbillableType
Synchronisation depuis Stripe
Pour synchroniser les données depuis Stripe (utile dans un handler webhook customer.updated):
$this->customerService->sync($user); // synchronise depuis l'entité locale
$this->customerService->syncByStripeId('cus_xxx'); // synchronise depuis Stripe APISuppression
Quando un customer est supprimé dans Stripe, le webhook customer.deleted déclenche CustomerDeletedHandler qui supprime le StripeCustomer local (pas l’entité User applicative).
Balance (solde)
Le bundle gère le solde customer Stripe (crédits/débits).
// Créditer le solde (montant négatif chez Stripe, en centimes)
$user->creditBalance(1000, 'Crédit bonus'); // 10€
// Débiter le solde
$user->debitBalance(500, 'Utilisation service');
// Solde formaté
$user->balance(); // string, ex: "10.00 EUR"CustomerBalanceTransaction
Chaque opération de solde est persistée dans CashierBundle\Entity\CustomerBalanceTransaction:
id— ID uniqueamount— montant en centimes (négatif = crédit, positif = débit)currency— devisetype— type de transactiondescription— descriptionisCredit()— retournetruesi créditisDebit()— retournetruesi débit
Locale client
Pour les factures, la locale suit cette priorité:
- locale explicite passée au rendu
preferred_localesdu customer Stripecashier.invoices.default_locale
Si votre application connaît déjà la langue de l’utilisateur, poussez-la dans Stripe via preferred_locales au moment du checkout ou de la mise à jour du customer.