在阅读PayPal使用相关的博客文章后,发现很多人其实都没有对PayPal的使用有比较好的理解,他们不清楚使用的究竟是哪种支付解决方案?调用的APIs究竟是哪一类APIs?我想可能是对于一些基本的概念并没有理解
本篇主要是对PayPal中一些基本概念的介绍和梳理,并没有对PayPal的使用做过多的介绍,因为PayPal的使用真的很简单,当然最后也包含一个PayPal使用的简单例子,希望能对你有所帮助
PayPal提供的支付方案
PayPal针对不同的支付场景提供了不同的支付解决方案,主要包括如下几种:
- Express Checkout
- PayPal Payments Standard
- Custom
- In-Store
- Marketplaces
- Invoicing
关于每种支付方式的说明请参见官网说明
PayPal APIs
PayPal提供了APIs用于我们实现一个支付方案,APIs主要分成两类:REST和name-value(NVP)/SOAP
REST和NVP/SOAP APIs最主要的不同点在于请求或者响应数据的格式不同和使用的授权框架不同,例如REST APIs主要使用JSON格式数据,使用OAuth2.0授权框架
PayPal SDKs
SDK可以看作是PayPal对APIs的封装和打包,可以从两个宏观方面认识SDK:
编程语言的角度,Node、PHP、Python、Ruby、Java、.NET等SDK
支付技术角度,Braintree and PayPal Mobile SDKs、PayPal Here SDKs、PayPall NVP/SOAP API SDKs、PayPal REST SDKs等SDK
PayPal开发的过程
使用REST和NVP/SOAP APIs的开发过程是不一样的,不一样的原因在于两者使用的授权方式不同,但一般需要有经历以下一些过程:
- 注册商家账户,注意是商家账户,而不是购物账户
- 创建一个测试应用或者Sandbox Accouts
- 选取SDK
- 编写程序测试
例子
Node中使用REST APIs支付的简单例子,具体代码请参见paypal-test
- 注册商家账号
登录PayPal官网,注意选择红色箭头所选的按钮,然后需要填入一些资料,即可完成注册
image.png - 创建一个测试应用
使用上面创建的账号登录网站,PayPal为了你测试方便,默认为你生成了两个测试账号,一个是BUSINESS,一个PERSONAL,你可以点击Create Accout创建自己的账户
image.png
然后点击左侧菜单栏的My Apps & Credentials,在REST API apps中点击Creat App,在新出现的页面Create New App中输入App Name的名字,然后点击Create App即可创建一个应用
image.png
image.png - 选取SDK
使用npm安装相关依赖,主要是express和rest-sdk,package.json文件内容如下:
{
"name": "paypal-test",
"version": "1.0.0",
"description": "paypal test",
"private": true,
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"keywords": [
"paypal test"
],
"author": "Gong",
"license": "Apache-2.0",
"dependencies": {
"paypal-rest-sdk": "1.8.1",
"express": "4.x"
}
}
- 编写程序测试
PayPal已经封装的很简单了,主要调用两个函数:create、execute
其中create用于创建支付相关的信息、打开PayPal支付页面等,execute用于支付完成后需要执行的工作
paypal.js相关代码
var paypal = require('paypal-rest-sdk');
require('./configure');
exports.getPassCode = function (req, res) {
//商品参数信息
var create_payment_json = {
"intent": "sale",
"payer": {
"payment_method": "paypal"
},
"redirect_urls": {
"return_url": "http://localhost:8080/notify", //返回地址
"cancel_url": "http://localhost:8080/cancel", //取消完成后的返回地址
},
"transactions": [{
"item_list": {
"items": [{
"name": "item", //
"sku": "item",
"price": "1.00",
"currency": "USD",
"quantity": 1
}]
},
"amount": {
"currency": "USD",
"total": "1.00"
},
"description": "Apple"
}]
};
//打开付款页面
paypal.payment.create(create_payment_json, function (error, payment) {
if (error) {
throw error;
} else {
for (var i = 0; i < payment.links.length; i++) {
if (payment.links[i].rel === 'approval_url') {
console.log("getPassCode###" +payment.links[i].href);
var payUrl = payment.links[i].href;
res.redirect(payUrl);
}
}
}
});
}
//支付成功处理
exports.paySuccess = function (req, res) {
console.log('paySuccess');
var paymentId = req.query.paymentId;
var payerId = { payer_id: req.query.PayerID };
var execute_payment_json = {
"payer_id": payerId,
"transactions": [{
"amount": {
"currency": "USD",
"total": "1.00"
}
}]
};
//支付完成后需要执行的任务
paypal.payment.execute(paymentId, payerId, function(error, payment){
if(error){
console.error(JSON.stringify(error));
} else {
if (payment.state == 'approved'){
console.log('payment completed successfully');
res.redirect('http://localhost:8080/success');
} else {
console.log('payment not successful');
}
}
});
}
configure.js相关的代码
var paypal = require('paypal-rest-sdk');
paypal.configure({
'mode': 'sandbox', //sandbox or live
'client_id': 'AXcoXXXXXXXXXXXXXXXXXXXXXXXXXXP4e',
'client_secret': 'EEOXXXXXXXXXXXXXXXXXXXXX4EXAQFm'
});