Saltar al contenido

Para enviar las facturas de Cashier por email en Laravel lo único que debemos tener guardado en base de datos es el invoice_id, algo que Stripe nos ofrece si por ejemplo realizamos el pago con el método invoiceFor.

Yo en mi caso guardo la columna invoice_id en la tabla Orders, así, cuando Stripe me notifica que el pago ha sido correcto, puedo obtener esa factura y adjuntarla en un email para que el cliente la pueda recibir.

El ejemplo que voy a poner aquí es algo que cubrimos en el curso Plataforma de cursos con Laravel 7: Roles, Pagos con Stripe SCA, Cupones, Xdebug. Instalar laravel-dompdf para adjuntar PDF

composer require barryvdh/laravel-dompdf

Crear un Mailable para enviar facturas con Cashier

php artisan make:mail StudentNewOrder

Una vez tenemos el Mailable StudentNewOrder (cuando un cliente ha realizado un pago), vamos a añadir lógica a este archivo.

<?php

namespace App\Mail;

use App\Models\Order;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Laravel\Cashier\Invoice;

class StudentNewOrder extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * @var User
     */
    public User $user;

    /**
     * @var Order
     */
    public Order $order;

    /**
     * @var Invoice|null
     */
    public ?Invoice $invoice;

    /**
     * Create a new message instance.
     *
     * @param User $user
     * @param Order $order
     */
    public function __construct(User $user, Order $order)
    {
        $this->user = $user;
        $this->order = $order;
        $this->invoice = $user->findInvoice($order->invoice_id);
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        $vendor = config("app.name");
        $product = "Compra de cursos";
        $invoice = $this->invoice;
        $owner = $this->user;
        $pdf = \PDF::loadview('vendor.cashier.receipt', compact('invoice', 'product', 'vendor', 'owner'));
        return $this
            ->attachData($pdf->output(), $this->invoice->id . '-' . date('d-m-Y') . '.pdf', ['mime' => 'application/pdf'])
            ->subject("Gracias por tu pedido - " . config("app.name"))
            ->markdown('emails.students.new_order');
    }
}

A este mailable simplemente le pasamos el cliente y el pedido. La factura que nos retorna Stripe a través de los WebHooks la podemos obtener con el método findInvoice de Cashier, tal y como lo hacemos aquí.

Gracias al método attachData seremos capaces de adjuntar en este caso un archivo PDF en este correo.

@component('mail::message')
# Hola {{ $user->name }},
<br>
Muchas gracias por haber realizado tu pedido en {{ config('app.name') }}.
<br>
Aquí tienes todos los datos de tu pedido:
<ul>
    @foreach($order->order_lines as $order_line)
        <li>
            Curso: {{ $order_line->course->title }} - Precio: {{ \App\Helpers\Currency::formatCurrency($order_line->price) }}
        </li>
    @endforeach
</ul>

@component('mail::button', [
    'url' => url('/')
])
    Volver a la plataforma
@endcomponent

Atentamente,<br>
{{ config('app.name') }}
@endcomponent

Para finalizar el ejemplo sólo nos falta utilizar el método send de la clase Mail para enviar el email al cliente:

<?php
$invoice_id = $payload['data']['object']["invoice"];
$order->update([
    'invoice_id' => $invoice_id,
    'status' => Order::SUCCESS
]);
Mail::to($user->email)->send(
    new StudentNewOrder($user, $order)
);
school Curso completo

Curso Laravel 12
Completo 2026

El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.

access_time 8 horas de contenido
layers 4 tecnologías en 1
update 100% actualizado
code Proyectos prácticos
Ver Curso Laravel 12 arrow_forward

star Incluido en cualquier suscripción

Rutas de aprendizaje