Pasarela de pago oficial de QvaPay para tiendas WooCommerce. Acepta pagos en USD desde el balance QvaPay de tus clientes, con liquidación instantánea vía webhook firmado.
Estado: v1.0.0 — flujo de invoice + redirect. Sin reembolsos automáticos ni suscripciones recurrentes (ver Roadmap).
- Integración directa con la API v2 de merchants de QvaPay.
- Verificación criptográfica del webhook (HMAC-SHA256) con ventana anti-replay de ±5 minutos.
- Idempotencia: pedidos ya procesados no se duplican aunque QvaPay reintente la entrega.
- Compatible con checkout clásico y con WooCommerce Blocks (Cart/Checkout block).
- Compatibilidad declarada con WooCommerce HPOS (Custom Order Tables).
- Override opcional de la URL del webhook para sitios tras proxy/túnel (Cloudflare Tunnel, ngrok).
- Modo debug opcional que registra peticiones y webhooks en WooCommerce → Status → Logs (
source: qvapay). - Aviso en el admin cuando la tienda no está en USD o no se sirve por HTTPS.
| Componente | Versión |
|---|---|
| WordPress | ≥ 6.0 |
| PHP | ≥ 7.4 |
| WooCommerce | ≥ 7.0 |
| Moneda de tienda | USD (la API de QvaPay opera únicamente en USD) |
| HTTPS | Obligatorio (QvaPay solo entrega webhooks a endpoints SSL) |
La pasarela se ocultará automáticamente del checkout si la moneda no es USD o si faltan las credenciales.
- Descarga el ZIP desde la pestaña Releases del repositorio.
- En WordPress: Plugins → Añadir nuevo → Subir plugin.
- Sube el ZIP y actívalo.
- Crea una app en
https://www.qvapay.com/dev/app.- Callback URL de la app:
https://TU-DOMINIO/wp-json/qvapay/v1/webhook
- Callback URL de la app:
- En WooCommerce → Settings → Payments → QvaPay, pega
app-idyapp-secret. - Marca Activar QvaPay como método de pago y guarda.
- El cliente elige QvaPay en el checkout de WooCommerce.
- El plugin crea una factura vía
POST /api/v2/create_invoicey redirige al cliente ahttps://www.qvapay.com/pay/{transaction_uuid}. - El cliente paga con su balance de QvaPay.
- QvaPay envía un webhook firmado con HMAC-SHA256 al endpoint
/wp-json/qvapay/v1/webhook. - El plugin verifica firma + timestamp y llama a
payment_complete()sobre el pedido.
POST https://<tu-sitio>/wp-json/qvapay/v1/webhook
Headers:
x-qvapay-signature: sha256=<hmac hex del cuerpo crudo, clave = app-secret>
x-qvapay-timestamp: <unix timestamp, ventana ±300 s>
Reglas de aceptación (en orden):
- Cabeceras presentes → si falta alguna, 401.
|now − timestamp| ≤ 300 s→ fuera de rango, 401.- Firma calculada sobre el cuerpo crudo y comparada con
hash_equals→ mismatch, 401. - JSON válido con
transaction_uuid,remote_id,status→ faltante, 400. - Pedido existe y su
payment_method == 'qvapay'. - Si el pedido ya está en
processing/completed/refunded→ 200 conalready_processed=true(idempotencia). status == 'paid'→payment_complete()y nota de pedido. Otros estados se acusan con 200 y se loguean.
Los ajustes viven en la opción woocommerce_qvapay_settings:
| Campo | Descripción |
|---|---|
enabled |
Mostrar la pasarela en el checkout. |
title |
Texto que verá el cliente. |
description |
Descripción mostrada bajo el título. |
app_id |
UUID de tu app en https://www.qvapay.com/dev/app. |
app_secret |
Clave secreta de tu app. Se usa también para verificar la firma del webhook. |
webhook_url_override |
Opcional. Dominio público (o URL completa) a usar como webhook. Útil tras proxy/túnel (Cloudflare Tunnel, ngrok). Vacío = autodetectar. |
webhook_url |
URL de webhook efectiva (solo lectura). Es la que se envía a QvaPay y la que debes copiar al Callback URL. |
debug |
Registra peticiones y webhooks en WooCommerce → Status → Logs. |
Estado por pedido: el UUID de la factura QvaPay se guarda en el meta _qvapay_transaction_uuid.
- Firma
x-qvapay-signatureverificada conhash_equals(comparación timing-safe). - Validación del timestamp
x-qvapay-timestampcon ventana de ±5 minutos (mitiga ataques de replay). - Idempotencia por estado: pedidos en
processing/completed/refundedno se reprocesan. - Si el
transaction_uuidrecibido no coincide con el guardado en el pedido, el webhook se rechaza con 400. - El
app-secretse almacena como password en los ajustes de WooCommerce.
Solo flujo de invoice + redirect. No incluye:
- Reembolsos (la API de QvaPay no expone aún un endpoint público de refunds).
- Suscripciones recurrentes (
authorize_payments/charge). - Entorno sandbox.
- Futuro — Reembolsos automáticos cuando QvaPay exponga un endpoint público; suscripciones vía
authorize_payments+charge.
qvapay-for-woocommerce.php Punto de entrada del plugin, constantes y bootstrap.
uninstall.php Borra woocommerce_qvapay_settings al desinstalar.
includes/
class-qvapay-plugin.php Singleton: registra gateway, rutas REST, action links, Blocks.
class-qvapay-gateway.php WC_Payment_Gateway: settings, is_available, process_payment.
class-qvapay-api-client.php Wrapper HTTP de la API v2 de merchants.
class-qvapay-webhook.php REST: /wp-json/qvapay/v1/webhook (verificación HMAC).
class-qvapay-blocks-integration.php Wire-up del Payment Method Type para Blocks (lazy).
class-qvapay-blocks-method.php AbstractPaymentMethodType para WooCommerce Blocks.
class-qvapay-logger.php Wrapper de wc_get_logger() (source: qvapay).
assets/
images/icon.svg Icono mostrado en el checkout.
js/checkout-blocks.js Registro del método en el Cart/Checkout block (vanilla JS, sin build).
languages/ Catálogos .po/.mo (text-domain: qvapay-for-woocommerce).
readme.txt Manifest estilo WordPress.org.
build.sh Genera dist/qvapay-for-woocommerce-<ver>.zip.
.github/workflows/release.yml Publica el zip en GitHub Releases al hacer push de un tag v*.
.wordpress-org/ Assets para el directorio WP.org (no se empaquetan).
- Empaquetar:
bash build.shproducedist/qvapay-for-woocommerce-<versión>.zipconqvapay-for-woocommerce/como directorio raíz, listo para subir vía Plugins → Añadir nuevo → Subir plugin. - Publicar release: crea y empuja un tag
vX.Y.Zque coincida con el headerVersion:deqvapay-for-woocommerce.php. El workflow.github/workflows/release.ymlvalida la coincidencia, construye el zip y lo adjunta a la GitHub Release. - Subir a WordPress.org: sincroniza el contenido del zip al
trunk/del SVN del plugin y los assets de.wordpress-org/a/assets/del SVN.
Al subir versión, mantén estos tres puntos sincronizados:
Version:en el header deqvapay-for-woocommerce.php- Constante
QVAPAY_WC_VERSIONen el mismo archivo Stable tag:enreadme.txt
Publicado bajo la GNU General Public License v2.0 o posterior (GPL-2.0-or-later).
QvaPay for WooCommerce Copyright (C) 2026 QvaPay
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2, as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
Texto completo en LICENSE. Si redistribuyes o haces fork, debes mantener una licencia compatible con GPL-2.0.