Node Express 服务器示例

在此示例中,我们将使用 PayPal Node SDK 设置 Express 服务器集成以显示如何使用 PayPal 处理付款。为简洁起见,我们将使用静态 JSON 结构作为付款细节。

在构建处理 PayPal 付款的功能时,我们将遵循三个一般步骤:

  1. 我们创建一个 JSON 对象,其中包含我们打算通过 PayPal 处理的付款。然后,我们将其发送到 PayPal 以获取用于重定向用户的链接以确认付款。
  2. 接下来,我们将用户重定向到 PayPal 以确认付款。确认后,PayPal 会将用户重定向回我们的应用程序。
  3. 退回应用后,我们代表用户完成付款。

打破这个简单的 Node 应用程序,我们首先从 NPM 获取 PayPal Node SDK:

npm install paypal-rest-sdk

接下来,我们设置应用程序配置和包。

var http = require('http'),
    paypal = require('paypal-rest-sdk'),
    bodyParser = require('body-parser'),
    app = require('express')();

var client_id = 'YOUR APPLICATION CLIENT ID';
var secret = 'YOUR APPLICATION SECRET';

//allow parsing of JSON bodies
app.use(bodyParser.json());

//configure for sandbox environment
paypal.configure({
    'mode': 'sandbox', //sandbox or live
    'client_id': client_id,
    'client_secret': secret
});

我们要求此应用有四个要求:

  1. 我们服务器的 HTTP 包。
  2. PayPal 节点 SDK 包。
  3. bodyParser 包用于处理 JSON 编码的主体。
  4. 我们服务器的 Express 框架。

接下来的几行为创建应用程序时获取的客户机 ID 和机密设置变量。然后我们设置 bodyParser 以允许 JSON 编码的主体,然后使用应用程序详细信息配置我们的应用程序,并指定我们正在使用的环境(用于生产或沙箱进行测试)。

现在让我们创建使用 PayPal 创建付款请求的路线。

app.get('/create', function(req, res){
    //build PayPal payment request
    var payReq = JSON.stringify({
        'intent':'sale',
        'redirect_urls':{
            'return_url':'http://localhost:3000/process',
            'cancel_url':'http://localhost:3000/cancel'
        },
        'payer':{
            'payment_method':'paypal'
        },
        'transactions':[{
            'amount':{
                'total':'7.47',
                'currency':'USD'
            },
            'description':'This is the payment transaction description.'
        }]
    });

    paypal.payment.create(payReq, function(error, payment){
        if(error){
            console.error(error);
        } else {
            //capture HATEOAS links
            var links = {};
            payment.links.forEach(function(linkObj){
                links[linkObj.rel] = {
                    'href': linkObj.href,
                    'method': linkObj.method
                };
            })
        
            //if redirect url present, redirect user
            if (links.hasOwnProperty('approval_url')){
                res.redirect(links['approval_url'].href);
            } else {
                console.error('no redirect URI present');
            }
        }
    });
});

我们要做的第一件事就是设置付款请求 JSON 对象,其中包含我们提供 PayPal 以创建付款所需的信息。我们将 intent 设置为 sale,指定重定向 URL(PayPal 应在确认/取消付款后转发用户),添加 payment_method paypal 以表明我们将进行 PayPal 付款,然后指定交易信息付款人确认。

然后我们调用 payment.create(...),传入我们的 payReq 对象。这会将创建付款请求发送给 PayPal。一旦返回并成功,我们就可以遍历返回对象中提供的 HATEOAS 链接,以提取我们需要将用户重定向到的 URL,该 URL 在 approval_url 下标记。

如果直接使用,HATEOAS 链接的格式可能会导致脆弱的引用代码,因此我们遍历所有提供的链接并将它们放在一个更好的引用对象中,以便将来证明更改。如果然后在该对象中找到 approval_url,我们将重定向用户。

此时,用户被重定向到 PayPal 以确认付款。一旦他们这样做,他们将被重定向回我们在 createPayment(...) 函数中指定的 return_url

我们现在必须提供处理该退货的路线,以便完成付款。

app.get('/process', function(req, res){
    var paymentId = req.query.paymentId;
    var payerId = { 'payer_id': req.query.PayerID };

    paypal.payment.execute(paymentId, payerId, function(error, payment){
        if(error){
            console.error(error);
        } else {
            if (payment.state == 'approved'){ 
                res.send('payment completed successfully');
            } else {
                res.send('payment not successful');
            }
        }
    });
});

当用户返回到你的应用程序时,将会发送三个查询字符串参数,即 paymentIdPayerIDtoken。我们只需要处理前两个问题。

我们提取参数,并将 PayerID 放在一个简单的对象中,以满足付款执行步骤的需要。接下来,拨打 payment.execute(...),传递这两个参数,以完成付款。

一旦提出请求,我们通过检查 payment.state 是否设置为 approved 来查看付款是否成功完成。如果是这样,我们可以从返回的付款对象中存储我们需要的内容。

我们的最后一步是初始化我们的服务器并监听进入我们指定路由的流量。

//create server
http.createServer(app).listen(3000, function () {
   console.log('Server started: Listening on port 3000');
});

初始化服务器后,转到 http://localhost:3000/create 会初始化付款流程。