Estoy tratando de crear una aplicación que permita al cliente descargar un documento personalizado después de su pedido (entonces, el producto que vendo es un documento personalizado digital en pdf).
Estoy tratando de construir eso usando React para el frontend, Node y Express para el backend y PayPal Express Checkout (implementación de pila completa) como pago.
Lo que no me queda claro es qué pasos debo seguir para tramitar un pedido .
Soy un este punto:
http://localhost/api/paypal/orders que crea el pedido en el lado de Paypal y devuelve el ID de pedido de PayPal (por ejemplo id12345 )http://localhost/api/paypal/orders/id12345/capture endpoint¿después? ¿Qué otros puntos finales debo crear en el servidor y qué deben devolver? Tal vez... 1 para guardar el pedido real de la tienda en mi MongoDB y los detalles de la transacción, 1 para crear la factura del pedido, 1 para permitir la descarga del producto.
¿Podría aclarar qué pasos debo seguir, cuáles son los puntos finales que debo crear y qué debe devolver cada punto final?
¿Quizás algo como esto?
Estás intentando hacer demasiadas cosas en demasiadas rutas. simplemente cree una ruta llamada algo así como process-order luego podría tener un controlador asíncrono de esa ruta que contendría funciones separadas para
primero, solo await la función se complete y luego llame a la siguiente.
exports.processOrder = async (req, res, next) => { try { const newOrder = await Order.create({ order: req.params.id, details: req.body.details }) const createInvoice = () => { return newOrder._id; } const invoice = createInvoice(); const token = jwt.sign( { invoiceId = newOrder._id, }, process.env.JWT_SECRET, { expiresIn: '24h' } ); return res.status(200).json({status: 'success', message: 'you have 24 hours to download your digital goods', token}) } catch (error) { res.status(500).send(error) } }Esta es una idea muy básica, pero básicamente almacene toda su información en un controlador, luego envíe un token con la identificación de la factura, luego, cuando vayan a descargar el libro, tendrá una ruta donde verificará el token. Si tiene éxito, se envía el libro. como esto:
app.use( '/book-download', expressJwt({ secret: process.env.JWT_SECRET, algorithms: ['HS256'] }) ); app.get('/book-download/success', async (req, res) => { try{ const invoiceId = req.user.invoiceId; const invoice = await Invoice.find({_id: invoiceId}) if (invoice) { return res.status(200).json({status: 'success', message: 'congratulations on your new download', data: {E-book}) } else { return.res.status(404).json({status: 'fail', message: 'could not find an invoice with that ID'}) } catch (error) { return res.send(error) } });Puede optar por enviar el pdf vía express, o puede permitirles ingresar a una determinada parte del sitio web si la devolución es válida. Ahí lo tienes, es una idea.
En el pago rápido, debe definir el controlador de éxito/cancelación
Consulte aquí: https://www.section.io/engineering-education/nodejs-paypal-checkout/
En el controlador de éxito, según el URI devuelto => obtendrá una ID de pagador y una ID de pago. En base a eso, recupere la información de la transacción (que internamente contiene su ID de pedido). Actualice su ID de pedido como correcto/cancelado según la respuesta de PayPal.
app.get('/success', (req, res) => { const payerId = req.query.PayerID; const paymentId = req.query.paymentId; const execute_payment_json = { "payer_id": payerId, "transactions": [{ "amount": { "currency": "USD", "total": "25.00" } }] }; // Obtains the transaction details from paypal paypal.payment.execute(paymentId, execute_payment_json, function (error, payment) { //When error occurs when due to non-existent transaction, throw an error else log the transaction details in the console then send a Success string reposponse to the user. if (error) { console.log(error.response); throw error; } else { console.log(JSON.stringify(payment)); res.send('Success'); } }); });