在此示例中,我们将研究如何使用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 }
这就是我们使用拱形卡处理付款的方式。