Pago con QR dinámico

El QR se genera en el momento del cobro y se muestra en la pantalla de la caja. Único por transacción, expira si no se paga dentro de la ventana de tiempo.

Flujo end-to-end con QR dinámico
sequenceDiagram
  participant C as Caja
  participant B as Backend del comercio
  participant Y as Yappy API
  participant A as Yappy App

  C->>B: Iniciar caja
  B->>Y: POST /session/device
  Y-->>B: token
  Note over B,Y: token vive toda la sesión (12h)

  C->>B: Iniciar cobro de $X
  B->>Y: POST /qr/generate/DYN
  Y-->>B: transactionId + hash
  B-->>C: Renderiza QR en pantalla

  loop Polling cada 2-5 seg
      B->>Y: GET /transaction/{id}
      Y-->>B: status=PENDING
  end

  A->>Y: Cliente escanea y paga

  B->>Y: GET /transaction/{id}
  Y-->>B: status=COMPLETED
  B-->>C: Imprime factura

  Note over C,B: (Opcional) Al final del turno
  C->>B: Cerrar caja
  B->>Y: DELETE /session/device

Pasos del flujo

  1. Apertura de caja: llama a POST /session/device con el device.id de la caja. Guarda el token devuelto — lo necesitarás en todas las llamadas de esa sesión.

  2. Generar QR por cada cobro: llama a POST /qr/generate/DYN con el desglose del monto. Recibirás un transactionId y un hash.

  3. Renderizar el QR: usa el hash para generar visualmente el QR en la pantalla. La librería que uses (qrcode.js, ZXing, etc.) toma el hash como contenido del QR.

  4. Polling hasta que el cliente pague: consulta GET /transaction/{transactionId} cada 2–5 segundos. Detén el polling cuando status === "COMPLETED" o status === "CANCELLED".

  5. Timeout de 5 minutos: si el cliente no paga en 5 minutos, cancela la transacción con PUT /transaction/{transactionId} y genera un nuevo QR si el cliente quiere reintentar.

  6. Cierre de caja: al final del día, llama a DELETE /session/device para cerrar la sesión.

¿Te fue útil esta página?