PayPal Node Express服务器示例

示例

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

建立用于处理PayPal付款的功能时,我们将遵循三个常规步骤:

  1. 我们创建一个JSON对象,其中包含要通过PayPal处理的付款。然后,我们将其发送到PayPal,以获取将用户重定向至的链接,以确认付款。

  2. 接下来,我们将用户重定向到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';

//允许解析JSON主体
app.use(bodyParser.json());

//为沙箱环境配置
paypal.configure({
    'mode': 'sandbox', //沙盒或直播
    'client_id': client_id,
    'client_secret': secret
});

我们对此应用程序有四个要求:

  1. 我们服务器的HTTP包。

  2. PayPal Node SDK软件包。

  3. bodyParser包,用于处理JSON编码的正文。

  4. 我们服务器的Express框架。

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

现在,让我们创建使用PayPal创建付款请求的途径。

app.get('/create', function(req, res){
    //建立PayPal付款要求
    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 {
            //捕获HATEOAS链接
            var links = {};
            payment.links.forEach(function(linkObj){
                links[linkObj.rel] = {
                    'href': linkObj.href,
                    'method': linkObj.method
                };
            })
        
            //如果存在重定向网址,则重定向用户
            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_methodofpaypal表示我们将进行PayPal付款,然后指定交易信息供付款人确认。

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

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

此时,用户将被重定向到PayPal以确认付款。完成后,它们将被重定向回return_url我们在createPayment(...)函数中指定的位置。

为了完成付款,我们现在必须提供处理退货的途径。

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

当用户返回到您的应用程序,将存在将沿着为好,可以派出三名查询字符串参数paymentId,PayerID和token。我们只需要处理前两个。

我们提取参数,然后将PayerID放在一个简单的对象中,以进行付款执行步骤。接下来,调用payment.execute(...),传入这两个参数,以完成付款。

提出请求后,我们将检查是否payment.state将设置为,以查看付款是否成功完成approved。如果是这样,我们可以存储返回的付款对象中需要的东西。

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

//创建服务器
http.createServer(app).listen(3000, function () {
   console.log('Server started: Listening on port 3000');
});

服务器初始化后,将http://localhost:3000/create初始化支付过程。