Integra Battlepay con SumUp (órdenes battlepay_orders)
- pagos_sumup.py: crear_checkout_battlepay(reference,...) y obtener_checkout() - battlepay_view: lista las órdenes PENDING de la cuenta de juego - battlepay_pay_view: crea checkout SumUp para una orden concreta (checkout_reference=reference) - sumup_webhook: marca la orden PAID (valida estado contra la API de SumUp si falta) - plantillas account/battlepay.html y partials/pago_sumup.html - sql/battlepay_sumup.sql (tablas battlepay_orders/battlepay_price) y docs actualizados Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
-- ───────────────────────────────────────────────────────────────────────────
|
||||
-- Battlepay nativo → pasarela SumUp (NovaWeb)
|
||||
-- Se aplica sobre la base de datos `auth` (LoginDatabase).
|
||||
--
|
||||
-- Flujo:
|
||||
-- 1) El jugador pulsa "Comprar" en la tienda nativa del cliente.
|
||||
-- 2) El worldserver (SendMakePurchase) busca el producto en `battlepay_price`.
|
||||
-- Si tiene precio en €, crea una orden PENDING aquí y NO exige puntos.
|
||||
-- 3) El cliente abre /login/sso → /es/checkout (NovaWeb) y paga con SumUp.
|
||||
-- 4) NovaWeb marca la orden PAID (creditPaymentIfPaid).
|
||||
-- 5) El worldserver (BattlepayManager::Update) ve la orden PAID del jugador
|
||||
-- conectado y la entrega con ProcessDelivery → la marca DELIVERED.
|
||||
-- ───────────────────────────────────────────────────────────────────────────
|
||||
|
||||
-- Órdenes de compra (las escribe el worldserver, las lee/actualiza NovaWeb).
|
||||
CREATE TABLE IF NOT EXISTS `battlepay_orders` (
|
||||
`id` INT NOT NULL AUTO_INCREMENT,
|
||||
`reference` VARCHAR(64) NOT NULL,
|
||||
`account_id` INT NOT NULL, -- auth.account.id (cuenta de juego)
|
||||
`product_id` INT NOT NULL, -- Battlepay ProductID nativo
|
||||
`product_name` VARCHAR(120) NOT NULL DEFAULT '',
|
||||
`price_eur` DECIMAL(10,2) NOT NULL DEFAULT 0,
|
||||
`status` VARCHAR(16) NOT NULL DEFAULT 'PENDING', -- PENDING | PAID | DELIVERED
|
||||
`created_at` INT NOT NULL,
|
||||
`paid_at` INT NULL,
|
||||
`delivered_at` INT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_reference` (`reference`),
|
||||
KEY `idx_account_status` (`account_id`, `status`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- Mapa producto nativo → precio real en €. Si un ProductID NO está aquí (o
|
||||
-- enabled=0), el worldserver usa el flujo clásico de puntos para ese producto.
|
||||
CREATE TABLE IF NOT EXISTS `battlepay_price` (
|
||||
`product_id` INT NOT NULL,
|
||||
`product_name` VARCHAR(120) NOT NULL DEFAULT '',
|
||||
`price_eur` DECIMAL(10,2) NOT NULL DEFAULT 0,
|
||||
`enabled` TINYINT(1) NOT NULL DEFAULT 1,
|
||||
PRIMARY KEY (`product_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- Ejemplo (ajusta product_id al de tu tienda nativa):
|
||||
INSERT INTO `battlepay_price` (`product_id`, `product_name`, `price_eur`, `enabled`)
|
||||
VALUES (54811, 'Corcel Celestial', 5.00, 1)
|
||||
ON DUPLICATE KEY UPDATE `product_name`=VALUES(`product_name`), `price_eur`=VALUES(`price_eur`);
|
||||
Reference in New Issue
Block a user