tutorial nodejs developer dev node.js paypal sails.js paypal-express

node.js - nodejs - Autorización de pago y captura del pago(futuro) mediante PayPal-node-SDK(Pago exprés de PayPal)



paypal nodejs (1)

Estoy trabajando con PayPal Express Checkout y lo que necesito hacer es Autorizar y Capturar el pago más adelante por separado, mi flujo actual de PayPal es,

1) Creé un pago usando el siguiente código:

var paypal = require(''paypal-rest-sdk''); function createPayPal(req, res, itemsArray, redirectsTos) { var payment = { "intent": "sale", "payer": {}, "transactions": [{ "amount": { "currency": sails.config.currency, "total": itemsArray.totalArrayAmount, "details": { "subtotal": itemsArray.totalArrayAmount, "fee": sails.config.PayPalCreateFee } }, "invoice_number": req.session.invNum, "item_list": { "items": itemsArray.itemsArray } }] }; sails.log.info(''payment obj :'', JSON.stringify(payment)) payment.payer.payment_method = sails.config.PayPalPaymentMethod; payment.redirect_urls = { "return_url": res.locals.return_url_buy, "cancel_url": res.locals.cancel_url_buy }; paypal.payment.create(payment, function(error, payment) { if (error) { sails.log.error(error); redirectsTos(({ message: ''failure'', redirect: ''/paypal/error'' }), null); } else { sails.log.info(''Payment ID = '', payment.id); sails.log.info(''User ID = '', req.session.userSession); var redirectUrl; for (var i = 0; i < payment.links.length; i++) { var link = payment.links[i]; if (link.method === ''REDIRECT'') { redirectUrl = link.href; sails.log.info(''goto:'', redirectUrl) redirectsTos(null, ({ message: ''success'', redirect: redirectUrl })); } } } }); }

y Paypal me devuelve la información de la orden y las urls redireccionamiento y redirigí al usuario al objeto href in links . entonces cuando el flujo de pago me devuelve el sitio web, me envía

{ paymentId: ''PAY-5FB60654T5508144abcxyzZLQ'', token: ''EC-26U68825EW2123428'', PayerID: ''QSABTRW6AHYH6'' }

y luego ejecuté el pago usando el siguiente código.

function executePayPal(req, paymentId, payerId, executedPayPal) { sails.log.info(''in executedPayPal''); var details = { "payer_id": payerId }; var payment = paypal.payment.execute(paymentId, details, function(error, payment) { if (error) { sails.log.error(''error in payment id in executePayPal function of paypal controller'', error); var err = JSON.stringify(error); var errParsed = JSON.parse(err); crashHandlingService.appCrash(errParsed, 101202); executedPayPal(({ message: ''failure'', redirect: ''/paypal/error/'' }), null); } else { executedPayPal(({ message: ''success'', redirect: ''/paypal/success/'' }), null); } }); }

Ahora lo que este código básicamente hace es

  1. Crea el pago,
  2. Redirigir al usuario a la página C de paypal
  3. Capture el pago.

y lo que realmente quiero lograr es

  1. autorizar el pago ->
  2. capturando el pago para poder capturar el pago en algún momento posterior en algún cronJob o servicio.

    Y redirigir al usuario a la página de PayPal en el medio del flujo anterior, realmente no sé cómo autorizar, redirigir y luego capturar el pago.

Así que por favor, guíanme a este respecto.

Nota: He leído la siguiente documentación de PayPal pero no puedo entender. y tenga en cuenta que debo mostrar los detalles de pago en la página de PayPal y también el código del cupón y su descuento en la página de pago.

https://developer.paypal.com/docs/integration/direct/capture-payment/#authorize-the-payment https://developer.paypal.com/docs/classic/express-checkout/ht_ec-singleAuthPayment-curl- etc /

Gracias por adelantado :) .


Finalmente encontré la solución y pensé que debería publicarla aquí para que pueda ser útil para otros.

Entonces, básicamente hay 4 pasos a seguir y uno tiene que usar PayPal Node SDK

  • Crear pago.
  • Redirigir usuario a PayPal.
  • Ejecutar pago autorizado.
  • Capture el pago autorizado.

Para crear un pago, puede usar el método payment.create de PayPal Node sdk aquí .

.Create Method devolverá los enlaces de url en "href" para redirigir al usuario a la página de PayPal, por lo que se redirigirá al usuario a la página de PayPal.

Después de regresar de la página de pago de PayPal, debe ejecutar el método .execute de PayPal Node SDK aquí , utilizando payer_id y paymentId de PayPal.

y finalmente, cuando necesite capturar el importe de la transacción autorizada, debe .authorization.capture método .authorization.capture de PayPal Node SDK aquí , proporcionando el importe y el id. de autorización de 17 dígitos recibido en la ejecución autorizar respuesta.

La muestra de código y respuesta se proporciona a continuación en caso de que los enlaces no funcionen en el futuro.

.create Code

var create_payment_json = { "intent": "authorize", "payer": { "payment_method": "paypal" }, "redirect_urls": { "return_url": "http://return.url", "cancel_url": "http://cancel.url" }, "transactions": [{ "item_list": { "items": [{ "name": "item", "sku": "item", "price": "1.00", "currency": "USD", "quantity": 1 }] }, "amount": { "currency": "USD", "total": "1.00" }, "description": "This is the payment description." }] }; paypal.payment.create(create_payment_json, function (error, payment) { if (error) { console.log(error.response); throw error; } else { for (var index = 0; index < payment.links.length; index++) { //Redirect user to this endpoint for redirect url if (payment.links[index].rel === ''approval_url'') { console.log(payment.links[index].href); } } console.log(payment); } });

Response Sample

{ "id": "PAY-17S8410768582940NKEE66EQ", "create_time": "2013-01-31T04:12:02Z", "update_time": "2013-01-31T04:12:04Z", "state": "approved", "intent": "authorize", "payer": { "payment_method": "credit_card", "funding_instruments": [ { "credit_card": { "type": "visa", "number": "xxxxxxxxxxxx0331", "expire_month": "11", "expire_year": "2018", "first_name": "Betsy", "last_name": "Buyer", "billing_address": { "line1": "111 First Street", "city": "Saratoga", "state": "CA", "postal_code": "95070", "country_code": "US" } } } ] }, "transactions": [ { "amount": { "total": "7.47", "currency": "USD", "details": { "tax": "0.03", "shipping": "0.03" } }, "description": "This is the payment transaction description.", "related_resources": [ { "sale": { "id": "4RR959492F879224U", "create_time": "2013-01-31T04:12:02Z", "update_time": "2013-01-31T04:12:04Z", "state": "completed", "amount": { "total": "7.47", "currency": "USD" }, "parent_payment": "PAY-17S8410768582940NKEE66EQ", "links": [ { "href": "https://api.sandbox.paypal.com/v1/payments/sale/4RR959492F879224U", "rel": "self", "method": "GET" }, { "href": "https://api.sandbox.paypal.com/v1/payments/sale/4RR959492F879224U/refund", "rel": "refund", "method": "POST" }, { "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-17S8410768582940NKEE66EQ", "rel": "parent_payment", "method": "GET" } ] } } ] } ], "links": [ { "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-17S8410768582940NKEE66EQ", "rel": "self", "method": "GET" } ] }

.execute Code

var paymentId = ''PAYMENT id created in previous step''; paypal.payment.execute(paymentId, execute_payment_json, function (error, payment) { if (error) { console.log(error.response); throw error; } else { console.log("Get Payment Response"); console.log(JSON.stringify(payment)); } });

Response Sample

{ "id": "PAY-34629814WL663112AKEE3AWQ", "create_time": "2013-01-30T23:44:26Z", "update_time": "2013-01-30T23:44:28Z", "state": "approved", "intent": "aurthorize", "payer": { "payment_method": "paypal", "payer_info": { "email": "[email protected]", "first_name": "Betsy", "last_name": "Buyer", "payer_id": "CR87QHB7JTRSC" } }, "transactions": [ { "amount": { "total": "7.47", "currency": "USD", "details": { "tax": "0.04", "shipping": "0.06" } }, "description": "This is the payment transaction description.", "related_resources": [ { "sale": { "id": "1KE4800207592173L", "create_time": "2013-01-30T23:44:26Z", "update_time": "2013-01-30T23:44:28Z", "state": "completed", "amount": { "currency": "USD", "total": "7.47" }, "transaction_fee": { "value": "0.50", "currency": "USD" }, "parent_payment": "PAY-34629814WL663112AKEE3AWQ", "links": [ { "href": "https://api.sandbox.paypal.com/v1/payments/sale/1KE4800207592173L", "rel": "self", "method": "GET" }, { "href": "https://api.sandbox.paypal.com/v1/payments/sale/1KE4800207592173L/refund", "rel": "refund", "method": "POST" }, { "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-34629814WL663112AKEE3AWQ", "rel": "parent_payment", "method": "GET" } ] } } ] } ], "links": [ { "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-34629814WL663112AKEE3AWQ", "rel": "self", "method": "GET" } ] }

.authorization.capture Code

var capture_details = { "amount": { "currency": "USD", "total": "4.54" }, "is_final_capture": true }; paypal.authorization.capture("5RA45624N3531924N", capture_details, function (error, capture) { if (error) { console.error(error); } else { console.log(capture); } });

Response Sample

{ "id": "6BA17599X0950293U", "create_time": "2013-05-06T22:32:24Z", "update_time": "2013-05-06T22:32:25Z", "amount": { "total": "4.54", "currency": "USD" }, "is_final_capture": true, "state": "completed", "parent_payment": "PAY-44664305570317015KGEC5DI", "links": [ { "href": "https://api.sandbox.paypal.com/v1/payments/capture/6BA17599X0950293U", "rel": "self", "method": "GET" }, { "href": "https://api.sandbox.paypal.com/v1/payments/capture/6BA17599X0950293U/refund", "rel": "refund", "method": "POST" }, { "href": "https://api.sandbox.paypal.com/v1/payments/authorization/5RA45624N3531924N", "rel": "authorization", "method": "GET" }, { "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-44664305570317015KGEC5DI", "rel": "parent_payment", "method": "GET" } ] }

Puede obtener más información de REST API Reference And PayPal-node-SDK .

Perdónenme si la muestra de respuesta de alguna manera ha cambiado un poco porque la he copiado de la web de PayPal.

Gracias.