rgcl / webpay-nodejs

[Spanish/Chile] Módulo no oficial para integrar WebPay Plus en Node.js, con soporte para promesas.
GNU Lesser General Public License v3.0
93 stars 32 forks source link

Problema con el "returnURL" #23

Open HansLanger opened 4 years ago

HansLanger commented 4 years ago

Hola, estoy intentando realizar una transacción "normal" con el ejemplo "showcase/testNormal.js" y tengo el siguiente problema:

1) ingreso a la raiz del website para que se cargue el HTML por defecto que pide un monto 2) le hago submit y va al handler "/pagar" y este inicia el initTransaction con el returnURL: 'https://dominio.com/verificar' y me redirige correctamente al sitio de webpay, 3) ingreso en el formulario el número de tarjeta de debito de prueba, luego ingreso el rut y pass, y le hago submit 4) aparece otra pantalla con un dropdown para indicar si quiere ACEPTAR o RECHAZAR la transacción. 5) al hacer submit a esta página me redirigen al returnURL, sin embargo lo hace con un GET y no me entregan ninguna información en el request que me permita identificar de parte de qué transacción se origina.

Habrán actualizado el sistema? está este módulo actualizado y funcionando actualmente? Alguna idea de porqué hace un GET y no un POST?

Gracias!

niko20 commented 4 years ago

Yo estoy trabajando en la versión 1.3.0 y todo me funciona perfecto, y eso me retorna un POST, actualizare a la 1.4.0 y te cuento

niko20 commented 4 years ago

Acabo de instalar la versión 1.4.0 y los métodos se mantienen tal cual, la url de verificación sigue siendo POST , te dejo un screenshot image

HansLanger commented 4 years ago

Hola Niko, gracias por tu comentarios!. no entiendo qué me estás mostrando. Yo estoy hablando del showcase/testNormal.js se supone que cuando se termina el flujo en el sitio de webpay se debería llamar al returnURL que es recibido por el handler:

app.post('/verificar', (req, res) => {

    let token = req.body.token_ws; //<-- body no existe porque llega como GET
.......

No entiendo que es esa url "/api/v1/payments/verify".

Para hacer mis pruebas corrí "npm install webpay-nodejs" en el directorio de mi proyecto para instalar la componente y luego copié el testNormal.js a mi proyecto, le hice algunos cambios y luego lo corrí, lo cual me abrió un webserver con los 4 handlers: "/" : formulario para hacer el submit del monto "/pagar": inicia la transacción con initTransaction() y define returnURL, y redirige al sitio de webpay "/verificar": recibe la respuesta del webpay y verifica la transacción con el token (pero no lo estoy recibiendo porque solo hace un get). y redirige a "/comprobante" "/comprobante": muesta el resultado al cliente

niko20 commented 4 years ago

Mis disculpas, ya que en este momento estaba trabajando en esto en mi proyecto, te mande el screenshot de la url que utilizo (en mi proyecto) para la verificación, era únicamente para mostrarte que me esta haciendo una petición POST no una GET, use el showcase/testNormal.js en su momento para poder armar mi código, te mando algo de mi código el cual actualmente esta funcionando y el paquete hace un llamado a verificar pero en un POST.

Esto lo tengo en un js como controlador (controllers/payment.js)

export const webpayStart = async (req, res, next) => {
  try {
    const hostUrl = 'http://' + req.get('host')
    const data = await Webpay.initTransaction({
          buyOrder: '11111',
          sessionId: 'mi_token',
          returnURL: `${hostUrl}/api/v1/payments/verify`,
          finalURL: `${hostUrl}/api/v1/payments/finished/${createdOrder.id}`,
          amount: total
    })
    res.json({
      status: 'success',
      checkUrl: `${data.url}?token_ws=${data.token}`
    })
  } catch (err) {
    next(err)
  }
}

Mi método de verificación


export const verify = async (req, res, next) => {
  try {
    const hostUrl = 'http://' + req.get('host')
    const token = req.body.token_ws
    const transaction = await Webpay.getTransactionResult(token)
    await Webpay.acknowledgeTransaction(token)
    ..... 

  } catch (err) {
    next(err)
  }
}

por otro lado tengo mi archivo de rutas (routes/payment.js)

import express from 'express'
import * as paymentController from '../controllers/payment'

const router = new express.Router()

router.post('/', paymentController.webpayStart)
router.post('/verify', paymentController.verify)

export default router

y me funciona perfecto, no quise agregar los métodos que manejan el finalUrl, pero todo esto me funciona perfecto, ocupo la versión 1.4.0 del paquete.

Saludos!

HansLanger commented 4 years ago

Gracias Niko!, después de revisar tu código me di cuenta que la URL está con "http" en vez de "https", cambié el código a: const hostUrl = 'https://' + req.get('host') y funcionó!