haciendo datatables de los pagos

This commit is contained in:
2025-11-04 22:03:03 +01:00
parent dc64e40e38
commit ed32f773a4
23 changed files with 434 additions and 37 deletions

View File

@ -4,12 +4,16 @@ import com.imprimelibros.erp.payments.PaymentService;
import com.imprimelibros.erp.payments.model.Payment;
import com.imprimelibros.erp.redsys.RedsysService.FormPayload;
import org.springframework.context.MessageSource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.UUID;
@Controller
@ -17,19 +21,21 @@ import java.util.UUID;
public class RedsysController {
private final PaymentService paymentService;
private final MessageSource messageSource;
public RedsysController(PaymentService paymentService) {
public RedsysController(PaymentService paymentService, MessageSource messageSource) {
this.paymentService = paymentService;
this.messageSource = messageSource;
}
@PostMapping(value = "/crear", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
@ResponseBody
public ResponseEntity<byte[]> crearPago(@RequestParam("amountCents") Long amountCents,
@RequestParam("method") String method) throws Exception {
@RequestParam("method") String method, @RequestParam("cartId") Long cartId) throws Exception {
if ("bank-transfer".equalsIgnoreCase(method)) {
// 1) Creamos el Payment interno SIN orderId (null)
Payment p = paymentService.createBankTransferPayment(null, amountCents, "EUR");
Payment p = paymentService.createBankTransferPayment(cartId, amountCents, "EUR");
// 2) Mostramos instrucciones de transferencia
String html = """
@ -55,7 +61,7 @@ public class RedsysController {
}
// Tarjeta o Bizum (Redsys)
FormPayload form = paymentService.createRedsysPayment(null, amountCents, "EUR", method);
FormPayload form = paymentService.createRedsysPayment(cartId, amountCents, "EUR", method);
String html = """
<html><head><meta charset="utf-8"><title>Redirigiendo a Redsys…</title></head>
@ -64,6 +70,7 @@ public class RedsysController {
<input type="hidden" name="Ds_SignatureVersion" value="%s"/>
<input type="hidden" name="Ds_MerchantParameters" value="%s"/>
<input type="hidden" name="Ds_Signature" value="%s"/>
<input type="hidden" name="cartId" value="%d"/>
<noscript>
<p>Haz clic en pagar para continuar</p>
<button type="submit">Pagar</button>
@ -74,7 +81,7 @@ public class RedsysController {
form.action(),
form.signatureVersion(),
form.merchantParameters(),
form.signature());
form.signature(), cartId);
byte[] body = html.getBytes(StandardCharsets.UTF_8);
return ResponseEntity.ok()
@ -84,14 +91,11 @@ public class RedsysController {
// GET: cuando el usuario cae aquí sin parámetros, o Redsys redirige por GET
@GetMapping("/ok")
@ResponseBody
public ResponseEntity<String> okGet() {
String html = """
<h2>Pago procesado</h2>
<p>Si el pago ha sido autorizado, verás el pedido en tu área de usuario o recibirás un email de confirmación.</p>
<p><a href="/cart">Volver a la tienda</a></p>
""";
return ResponseEntity.ok(html);
public String okGet(RedirectAttributes redirectAttrs, Model model, Locale locale) {
String msg = messageSource.getMessage("checkout.success.payment", null, "Pago realizado con éxito. Gracias por su compra.", locale);
model.addAttribute("successPago", msg);
redirectAttrs.addFlashAttribute("successPago", msg);
return "redirect:/cart";
}
// POST: si Redsys envía Ds_Signature y Ds_MerchantParameters (muchas
@ -111,9 +115,12 @@ public class RedsysController {
}
@GetMapping("/ko")
@ResponseBody
public ResponseEntity<String> koGet() {
return ResponseEntity.ok("<h2>Pago cancelado o rechazado</h2><a href=\"/checkout\">Volver</a>");
public String koGet(RedirectAttributes redirectAttrs, Model model, Locale locale) {
String msg = messageSource.getMessage("checkout.error.payment", null, "Error al procesar el pago: el pago ha sido cancelado o rechazado Por favor, inténtelo de nuevo.", locale);
model.addAttribute("errorPago", msg);
redirectAttrs.addFlashAttribute("errorPago", msg);
return "redirect:/cart";
}
@PostMapping(value = "/ko", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)