使用PayPal-node-SDK(PayPal Express Checkout)支付授权和获取付款(未来)

我正在使用PayPal Express Checkout,而我需要做的是单独授权和捕获付款,目前的PayPalstream量是,

1)我使用以下代码创build付款:

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 })); } } } }); } 

和贝宝返回我的订单信息和redirecturls ,我redirect到links对象的用户的href 。 那么当付款stream回到我的网站它发送给我

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

然后我使用下面的代码执行付款。

 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); } }); } 

现在这个代码基本上是做什么的

  1. 创build付款,
  2. 将用户redirect到paypal页面C.
  3. 捕获付款。

而我真正想要达到的是

  1. 授权付款 – >
  2. 捕获付款,以便我可以稍后在某些cronJob或服务中捕获付款。

    并将用户redirect到上述stream程中间的paypal页面,我真的不知道如何授权,redirect然后捕获付款。

所以请在这方面指导我。

注意:我已经阅读了以下的贝宝文档,但不能理解。 请记住,我需要在PayPal页面上显示付款明细,以及付款页面上的优惠券代码和折扣。

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

提前致谢 :) 。

最后,我find了解决scheme,我想我应该把它发布在这里,以便它可以帮助其他。

所以基本上有以下四个步骤,一个必须使用PayPal Node SDK

  • 创build付款。
  • 将用户redirect到PayPal。
  • 执行授权付款。
  • 捕获授权支付。

要创build付款,您可以在这里使用PayPal Node sdk的payment.create方法。

.Create Method将返回"href" url链接,将用户redirect到PayPal页面,以便将用户redirect到PayPal页面。

从payPal页面返回后,您必须在PayPal Node SDK的.execute方法中使用payer_idpaymentId从PayPal中paymentId

最后当你需要捕获授权交易金额时,你需要在这里通过PayPal Node SDK的.authorization.capture方法,通过在执行授权响应中提供金额和17位授权ID。

下面提供代码和响应示例,以防链接在将来无法使用。

.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": "bbuyer@example.com", "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" } ] } 

您可以从REST API Reference和PayPal-node-SDK获取更多信息。

请原谅我,如果反应样本有点改变,因为我从贝宝网复制它。

谢谢。