webpay-nodejs
webpay-nodejs copied to clipboard
Problema con el "returnURL"
Hola, estoy intentando realizar una transacción "normal" con el ejemplo "showcase/testNormal.js" y tengo el siguiente problema:
- ingreso a la raiz del website para que se cargue el HTML por defecto que pide un monto
- 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,
- ingreso en el formulario el número de tarjeta de debito de prueba, luego ingreso el rut y pass, y le hago submit
- aparece otra pantalla con un dropdown para indicar si quiere ACEPTAR o RECHAZAR la transacción.
- 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!
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
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
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
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!
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ó!