Paquete Laravel para integrar Wompi Colombia en modalidad Web Checkout: links de pago, widget embebido, redirección, consulta de transacciones y webhooks con verificación de firma.
- PHP 8.4+
- Laravel 12+
composer require igedeon/laravel-wompiPublicar la configuración:
php artisan vendor:publish --tag=wompi-configAgrega las siguientes variables a tu archivo .env:
WOMPI_ENVIRONMENT=sandbox
WOMPI_PUBLIC_KEY=pub_test_xxxxxxxxxxxxxxxx
WOMPI_PRIVATE_KEY=prv_test_xxxxxxxxxxxxxxxx
WOMPI_EVENTS_SECRET=test_events_xxxxxxxxxxxxxxxx
WOMPI_INTEGRITY_SECRET=test_integrity_xxxxxxxxxxxxxxxxPara producción, cambia el ambiente y usa las llaves correspondientes:
WOMPI_ENVIRONMENT=production
WOMPI_PUBLIC_KEY=pub_prod_xxxxxxxxxxxxxxxx
WOMPI_PRIVATE_KEY=prv_prod_xxxxxxxxxxxxxxxx
WOMPI_EVENTS_SECRET=prod_events_xxxxxxxxxxxxxxxx
WOMPI_INTEGRITY_SECRET=prod_integrity_xxxxxxxxxxxxxxxxWOMPI_WEBHOOK_PATH=wompi/webhook # Ruta del webhook (por defecto: wompi/webhook)
WOMPI_CURRENCY=COP # Moneda por defectouse IGedeon\WompiLaravel\Facades\Wompi;
use IGedeon\WompiLaravel\DTOs\PaymentLinkData;
$link = Wompi::paymentLinks()->create(new PaymentLinkData(
name: 'Orden #123',
description: 'Compra de productos',
singleUse: true,
collectShipping: false,
amountInCents: 5000000, // $50,000 COP
));
// URL para compartir con el cliente
$url = $link->checkoutUrl();
// https://checkout.wompi.co/l/abc-123-def
// ID del link
$id = $link->id;$link = Wompi::paymentLinks()->create(new PaymentLinkData(
name: 'Orden #456',
description: 'Suscripción mensual',
singleUse: false,
collectShipping: true,
amountInCents: 15000000,
currency: 'COP',
expiresAt: '2026-12-31T23:59:59.000Z',
redirectUrl: 'https://mitienda.com/gracias',
imageUrl: 'https://mitienda.com/logo.png',
sku: 'PROD-456',
taxes: [
['type' => 'VAT', 'amount_in_cents' => 2380952],
],
));$link = Wompi::paymentLinks()->find('abc-123-def');
echo $link->name;
echo $link->amountInCents;
echo $link->active; // true o falseuse IGedeon\WompiLaravel\Enums\TransactionStatus;
$transaction = Wompi::transactions()->find('12345-txn-id');
echo $transaction->id;
echo $transaction->status; // TransactionStatus enum
echo $transaction->amountInCents;
echo $transaction->reference;
echo $transaction->paymentMethodType;
if ($transaction->status === TransactionStatus::Approved) {
// Pago exitoso
}
// Verificar si el estado es final
if ($transaction->status->isFinal()) {
// No cambiará más
}| Estado | Descripción | Final |
|---|---|---|
PENDING |
En proceso | No |
APPROVED |
Pago exitoso | Sí |
DECLINED |
Rechazada | Sí |
VOIDED |
Anulada | Sí |
ERROR |
Error interno | Sí |
$merchant = Wompi::merchants()->get();
echo $merchant->name;
echo $merchant->legalName;
echo $merchant->acceptanceToken; // Token de aceptación de términos
echo $merchant->acceptancePersonalAuth; // Token de autorización de datos personalesIncluye el widget de Wompi directamente en tus vistas Blade. La firma de integridad se genera automáticamente en el servidor.
<x-wompi::widget
reference="orden-123"
:amount-in-cents="5000000"
currency="COP"
redirect-url="https://mitienda.com/resultado"
/><x-wompi::widget
reference="orden-456"
:amount-in-cents="15000000"
currency="COP"
redirect-url="https://mitienda.com/resultado"
expiration-time="2026-06-30T23:59:59.000Z"
customer-email="cliente@email.com"
customer-full-name="Juan Pérez"
customer-phone-number="3001234567"
:tax-in-cents-vat="2380952"
:tax-in-cents-consumption="1200000"
/>Si prefieres redirigir al usuario a la página de Wompi en lugar de usar el widget embebido:
<x-wompi::redirect-form
reference="orden-789"
:amount-in-cents="5000000"
currency="COP"
redirect-url="https://mitienda.com/resultado"
>
<button type="submit">Pagar con Wompi</button>
</x-wompi::redirect-form>Si necesitas generar la firma de integridad manualmente (por ejemplo, para una integración JavaScript personalizada):
$hash = Wompi::integrityHash(
reference: 'orden-123',
amountInCents: 5000000,
currency: 'COP',
);
// Con tiempo de expiración
$hash = Wompi::integrityHash(
reference: 'orden-123',
amountInCents: 5000000,
currency: 'COP',
expirationTime: '2026-12-31T23:59:59.000Z',
);El paquete registra automáticamente una ruta POST en /wompi/webhook (configurable) que:
- Verifica la firma SHA-256 del evento
- Despacha eventos de Laravel según el estado de la transacción
En el dashboard de Wompi, configura la URL de eventos apuntando a:
https://tudominio.com/wompi/webhook
Registra listeners en tu aplicación para reaccionar a los eventos:
// app/Providers/EventServiceProvider.php o usando el atributo #[Listener]
use IGedeon\WompiLaravel\Events\TransactionApproved;
use IGedeon\WompiLaravel\Events\TransactionDeclined;
use IGedeon\WompiLaravel\Events\TransactionVoided;
use IGedeon\WompiLaravel\Events\TransactionError;
use IGedeon\WompiLaravel\Events\WompiWebhookReceived;// Ejemplo de listener
class ConfirmOrderListener
{
public function handle(TransactionApproved $event): void
{
$transaction = $event->transaction;
// $transaction->id
// $transaction->reference
// $transaction->amountInCents
// $transaction->status (TransactionStatus::Approved)
// $transaction->raw (array completo de la respuesta)
}
}| Evento | Cuándo se dispara |
|---|---|
WompiWebhookReceived |
Siempre (para logging/auditoría) |
TransactionApproved |
Transacción aprobada |
TransactionDeclined |
Transacción rechazada |
TransactionVoided |
Transacción anulada |
TransactionError |
Error en la transacción |
Puedes agregar middleware adicional a la ruta del webhook vía configuración:
// config/wompi.php
'webhook' => [
'path' => 'wompi/webhook',
'middleware' => ['throttle:60,1'],
],Publica las vistas para personalizarlas:
php artisan vendor:publish --tag=wompi-viewsLas vistas se copiarán a resources/views/vendor/wompi/.
El paquete lanza excepciones específicas:
use IGedeon\WompiLaravel\Exceptions\ApiException;
use IGedeon\WompiLaravel\Exceptions\InvalidConfigurationException;
use IGedeon\WompiLaravel\Exceptions\InvalidSignatureException;
try {
$link = Wompi::paymentLinks()->create($data);
} catch (ApiException $e) {
$e->getMessage(); // Mensaje de error
$e->statusCode; // Código HTTP (401, 422, 500, etc.)
$e->responseBody; // Array con la respuesta completa de Wompi
} catch (InvalidConfigurationException $e) {
// Falta una llave en la configuración
}./vendor/bin/pestPara usar en tus propios tests con Http::fake():
use Illuminate\Support\Facades\Http;
Http::fake([
'*/payment_links' => Http::response([
'data' => [
'id' => 'test-link-id',
'name' => 'Test',
'description' => 'Test',
'single_use' => true,
'collect_shipping' => false,
'amount_in_cents' => 5000000,
'currency' => 'COP',
'active' => true,
],
]),
]);MIT