PayPal是一个第三方支付系统,类似于我国的支付宝。PayPal于1998年12月建立,总部在美国加利福尼亚州圣荷塞市。2002年,PayPal在纳斯达克首次上市,随后被eBay收购。
PayPal也和一些电子商务网站合作,成为它们的货款支付方式之一。但是用这种支付方式转账时,PayPal收取一定数额的手续费。
由于客户网站对国外用户也需要友好支持,所以需要支持国外的支付,选来选去最终确定了使用PAYPAL支付来接入。。下面就把我接入PAYPAL的流程和方法用流水账的方式记录一下吧。。
首先 在PAYPAL网站上注册了账号,然后不记得是怎么弄的了,就得到了一个客服邮箱,经过与客服不断的沟通客服最终确认回复如下。
居然回复用的都是中文,惊喜吧。。。很人性化吧。。。
通过这个邮件我们可以确认 REST API 是目前来说他们用的最新的接口,这个接口的流程就是
1.首先要获取TOKEN 2.然后根据TOKEN创建订单,response中会返回approve_link,以及后续调用capture接口的URL地址 3.使用浏览器(或者APP中的webview)打开approve_link,让买家登录PayPal账号并确认支付(之后可以通过在创建订单是指定的return URL参数跳转回您自己的页面进行后续流程) 4.在确认买家approve后,调用capture接口执行扣款(需要使用post方法调用),成功的话就表示交易完成并且资金已转入您的账户。
知道流程之后就好说了。。
接下来我们到官方网站看一下API的使用方法就好了。
https://developer.paypal.com/docs/api/overview/
文档里面说首先我们需要创建一个应用,创建了应用之后会有专属的 clientId 和 clientSecret 并且很人性化的提供了沙箱环境以便测试。。
应用创建页面
那些说使用沙箱环境的大神们我不知道他们怎么弄的,,但我用了沙箱之后慢的要死,根本没办法测试,所以最终直接使用真实环境完成对接测试。。
如果你也是国内网络 并且在使用沙箱的时候慢的要死,就直接别考虑了,用真实环境吧。我们点击那个 LIVE标签进入到真实环境 。
点击下面的 CREAT APP 按纽
给你的应用起个名字,然后下一步 你就会看到你需要的ID 和 SECRET。
把ID 和 SECRET 这两个参数保存起来,在调用接口中的时候会用到。。
从文档中我们可以看到,要调用REST API接口首先要获取TOKEN。
这个图截的大了一些,是为了让大家看到下面的代码,,一般情况下大多数人会认为下面的代码就是获取TOKEN的,但有的时候写API文档的人就是这么奇怪,你也不知道他是怎么想的。。本来获取API 一个CURL命令,写了说明之后应该跟上示例。但它这个还真就不是这样的,获取TOKEN的只给出一个链接,想要看示例的话就必须点进去看。。。没办法文档是人家写的就得按人家的方法来。。
点击上图中红框圈起来的链接进入到TOKEN说明文档。
https://developer.paypal.com/docs/api/get-an-access-token-curl/
可以看到这块就是获取TOKEN的方法。。。因为我是用PHP写的代码,所以直接用curl的方法 配合 两个参数去获取TOKEN。 具体代码如下:
代码语言:javascript复制$url = "https://api.paypal.com/v1/oauth2/token";
$clientId = "你的ID";
$clientSecret = "你的密钥";
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_HEADER, false );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, array(
"Content-Type: application/json",
"Accept-Language: en_US"
));
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt ( $ch, CURLOPT_POST, true );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch, CURLOPT_USERPWD, $clientId . ":" . $clientSecret );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, "grant_type=client_credentials" );
$result = curl_exec($ch);
curl_close($ch);
echo $result;
这样直接跑就可以,跑完之后得到的接果如下:
代码语言:javascript复制{"scope":"https://uri.paypal.com/services/invoicing https://uri.paypal.com/services/disputes/read-buyer https://uri.paypal.com/services/payments/realtimepayment https://uri.paypal.com/services/disputes/update-seller https://uri.paypal.com/services/paypalhere openid https://uri.paypal.com/services/payments/payment/authcapture https://uri.paypal.com/services/disputes/read-seller https://uri.paypal.com/services/payments/refund https://uri.paypal.com/services/identity/activities https://api.paypal.com/v1/vault/credit-card https://api.paypal.com/v1/payments/.* https://uri.paypal.com/services/reporting/search/read https://uri.paypal.com/payments/payouts https://api.paypal.com/v1/vault/credit-card/.* https://uri.paypal.com/services/subscriptions https://uri.paypal.com/services/applications/webhooks https://api.paypal.com/v1/payments/refund https://api.paypal.com/v1/payments/sale/.*/refund","access_token":"A21AAFoNkPzjPl9Kxuw-1rGgMSA4FY65N3qAgO8OKcqyfmrk6fO1QZN4j6l3V3rc5B2cpBFrAvYf0SbVqdeSsrfwVhxE17G_Q","token_type":"Bearer","app_id":"APP-80W284485P519543T","expires_in":32400,"nonce":"2020-08-12T05:39:26ZAwiJIywrfnIvhNxCYJDjNwufSAj47doGRsin47VPGFo"}
这是一个JSON字符串,里面包含了TOKEN,通过转JSON的方式把TOKEN取出来就好。
至此我们就获取了使用 PAYPAL最初的入门卡,,接下来我们就可以按照一般流程来创建一个订单
代码语言:javascript复制$url = "https://api.paypal.com/v2/checkout/orders";
$Token = '你的TOKEN';
$postfilds ='{
"intent": "CAPTURE",
"purchase_units": [
{
"amount": {
"currency_code": "HKD",
"value": "1"
},
"description": "purchase_units_Green XL",
"custom_id":109,
}],
"application_context":{
"cancel_url":"用户取消后你网站的地址",
"return_url":"用户确认后你网站的地址"
}
}';
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_HEADER, false );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt ( $ch, CURLOPT_POST, true );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: Bearer ' . $Token,
'Accept: application/json',
'Content-Type: application/json'
));
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $postfilds );
$result = curl_exec($ch);
curl_close($ch);
echo $result;
这里面最重要的就是 application_context 这里面带的两个网址,一个是用户取消支付后需要跳转的,一个是用户登陆之后确认订单后要跳转的。
PAYPAL的订单流程是这样,先通过接口生成一个订单,成功创建订单后会返回几个链接,其中一个属性为approve 的链接地址就是用户确认订单流程 ,你通过跳转到这个网址后让用户登陆 确认订单。
用户确认订单之后会返回到你设置的 返回网址,并跟了两个参数 其中 token 就是订单的ID。这一步用户只是确认订单,并没有完成真正的付款。。
所以在你返回页面里面你还需要根据参数TOKEN来完成扣款,官方说明叫 “捕获订单”
代码语言:javascript复制$url = "https://api.paypal.com/v2/checkout/orders/你获取的token/capture";
$Token = '你的TOKEN';
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_HEADER, false );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt ( $ch, CURLOPT_POST, true );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: Bearer ' . $Token,
'Content-Type: application/json'
));
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $postfilds );
$result = curl_exec($ch);
curl_close($ch);
echo $result;
在返回网址里面执行 捕获订单的过程,这样才会完成扣款。
至止,PAYPAL的订单生成 确认 捕获并扣款流程才算走完。。
以上就是接入PAYPAL REST API 的最终成功方法。。
挺早之前我就走过一次它的流程,因为当时用的是沙箱环境,速度慢的要死,一次都没成功过,后来就放弃了。。现在有需求没办法,必须走通。所以直接使用了LIVE环境来完成接口对接。。