PayPal使用信用卡(节点)进行支付

示例

在此示例中,我们将研究如何使用PayPal保管库存储信用卡,然后参考存储的信用卡来为用户处理信用卡交易。

我们之所以要使用保管库,是因为我们不必在自己的服务器上存储敏感的信用卡信息。我们仅通过提供的保管库ID引用付款方式,这意味着我们不必自己存储信用卡就可以处理许多PCI合规性规定。

与以前的示例一样,我们从设置环境开始。

var paypal = require('paypal-rest-sdk'),
    uuid = require('node-uuid');

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

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

与以前的示例不同的是,我们需要一个新的程序包node-uuid,该程序包用于在存储卡时为付款人生成唯一的UUID。您可以通过以下方式安装该软件包:

npm install node-uuid

接下来,我们定义信用卡JSON对象,该对象将发送到PayPal保管库进行存储。它包含来自卡的信息,以及我们使用生成的唯一付款人ID node-uuid。您应该将此唯一性存储payer_id在自己的数据库中,因为在使用拱形卡创建付款时将使用该唯一性。

var create_card_details = {
    "type": "visa",
    "number": "4417119669820331",
    "expire_month": "11",
    "expire_year": "2018",
    "first_name": "John",
    "last_name": "Doe",
    "payer_id": uuid.v4()
};

最后,我们需要存储信用卡并使用该卡处理付款。要存储信用卡,我们调用credit_card.create(...),传入credit_card_details刚刚创建的对象。如果一切顺利,我们应该返回一个对象,其中包含有关拱形卡的详细信息。为了使用该卡付款,我们实际上只需要两条信息:我们已经存储的payer_id和金库ID,也应该作为参考存储在我们自己的数据库中。

paypal.credit_card.create(create_card_details, function(error, credit_card){
    if(error){
        console.error(error);
    } else {
        var card_data = {
            "intent": "sale",
            "payer": {
                "payment_method": "credit_card",
                "funding_instruments": [{
                    "credit_card_token": {
                        "credit_card_id": credit_card.id,
                        "payer_id": credit_card.payer_id
                    }
                }]
            },
            "transactions": [{
                "amount": {
                    "total": "7.47",
                    "currency": "USD",
                    "details": {
                        "subtotal": "7.41",
                        "tax": "0.03",
                        "shipping": "0.03"
                    }
                },
                "description": "这是付款交易说明。" 
            }]
        };
        
        paypal.payment.create(card_data, function(error, payment){
            if(error){
                console.error(error);
            } else {
                console.log(JSON.stringify(payment));
            }
        });
    }
});

与成功处理信用卡之前一样,在成功完成信用卡存储之后的部分中,我们仅定义卡的详细信息并处理付款。card_data对象结构的主要区别是funding_instruments我们在下定义的部分payer。代替定义信用卡信息,我们使用以下对象,该对象包含文件库ID参考和付款人ID:

"credit_card_token": {
    "credit_card_id": credit_card.id,
    "payer_id": credit_card.payer_id
}

这就是我们使用拱形卡处理付款的方式。