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
- Crea el pago,
- Redirigir al usuario a la página C de paypal
- Capture el pago.
y lo que realmente quiero lograr es
- autorizar el pago ->
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.