PayPal 步骤2:使用计费协议为用户创建订阅(节点样本)

示例

为用户创建订阅的第二步是根据现有的激活计费计划创建并执行计费协议。本示例假定您已经在上一个示例中浏览并激活了一个计费计划,并且在该示例中具有要引用的计费计划的ID。

在设置结算协议以为用户创建订阅时,您将遵循3个步骤,这可能会让人想起PayPal付款:

  1. 您创建了一个计费协议,并通过ID引用了基础计费计划。

  2. 创建完成后,您可以将用户重定向到PayPal(如果通过PayPal付款)以确认订阅。确认后,贝宝将使用基础计费计划中提供的重定向将用户重定向回您的站点。

  3. 然后,您使用通过PayPal重定向提供的令牌执行签单协议。

这个例子是建立一个基于Express的HTTP服务器来展示计费协议过程。

要开始示例,我们首先需要设置我们的配置。我们添加了四个要求,即PayPal SDK,body-parser用于处理JSON编码的主体,http用于我们的简单服务器集成以及expressExpress框架。然后,我们从创建应用程序定义客户端ID和密码,为沙箱配置SDK,然后配置bodyParser以处理JSON主体。

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

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

paypal.configure({
  'mode': 'sandbox', //沙盒或直播
  'client_id': clientId,
  'client_secret': secret
});

app.use(bodyParser.json());

计费协议的第一步是创建一条处理计费协议创建的路由,并将用户重定向到PayPal以确认该订阅。我们假设将帐单方案ID作为查询字符串参数传递,例如通过将以下URL与上一个示例中的方案ID一起加载:

http://localhost:3000/createagreement?plan=P-3N543779E9831025ECYGDNVQ

现在,我们需要使用该信息来创建结算协议。

app.get('/createagreement', function(req, res){
    var billingPlan = req.query.plan;
    
    var isoDate = new Date();
    isoDate.setSeconds(isoDate.getSeconds() + 4);
    isoDate.toISOString().slice(0, 19) + 'Z';

    var billingAgreementAttributes = {
        "name": "Standard Membership",
        "description": "Food of the World Club Standard Membership",
        "start_date": isoDate,
        "plan": {
            "id": billingPlan
        },
        "payer": {
            "payment_method": "paypal"
        },
        "shipping_address": {
            "line1": "W 34th St",
            "city": "New York",
            "state": "NY",
            "postal_code": "10001",
            "country_code": "US"
        }
    };

    // 使用已激活的计费方案创建协议
    paypal.billingAgreement.create(billingAgreementAttributes, function (error, billingAgreement){
        if (error) {
            console.error(error);
            throw error;
        } else {
            //捕获HATEOAS链接
            var links = {};
            billingAgreement.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');
            }
        }
    });
});

我们首先从查询字符串中提取计费计划ID,然后创建计划开始的日期。

下一个对象定义billingAgreementAttributes包含预订信息。它包含有关计划的可读信息,对计费计划ID的引用,付款方式和运输详细信息(如果需要订阅)。

接下来,调用billingAgreement.create(...),传入billingAgreementAttributes我们刚刚创建的对象。如果一切成功,我们应该将一个计费协议对象传递回给我们,其中包含有关新创建的订阅的详细信息。该对象还包含许多HATEOAS链接,为我们提供了可在此新创建的协议上采取的下一步操作。我们在这里关心的一个标记为approval_url。

我们遍历所有提供的链接,以将它们放入易于引用的对象中。如果approval_url是这些链接之一,我们会将用户重定向到该链接,即PayPal。

此时,用户确认在PayPal上的订阅,并被重定向回基础计费计划中提供的URL。除该URL外,PayPal还将在查询字符串中传递令牌。该令牌是我们将用来执行(或启动)订阅的令牌。

让我们按照以下路线设置该功能。

app.get('/processagreement', function(req, res){
    var token = req.query.token;
    
    paypal.billingAgreement.execute(token, {}, function (error, billingAgreement) {
        if (error) {
            console.error(error);
            throw error;
        } else {
            console.log(JSON.stringify(billingAgreement));
            res.send('Billing Agreement Created Successfully');
        }
    });
});

我们从查询字符串中提取令牌,然后调用billingAgreement.execute,并传递该令牌。如果一切成功,我们现在为用户提供有效的订阅。返回对象包含有关有效计费协议的信息。

最后,我们设置了HTTP服务器来侦听路由的流量。

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