paypal真的是瞎搞,老接口偷偷修改新接口的demo也很奇怪,我看相关的文章很少就写一下看看能不能帮到别人把。
前期准备工作:sandbox的测试账号,还有key 获取方式就不赘述了
新版的逻辑是用预授权的形式,不是走直接付款了:
用户点击去下单->页面跳转到paypal->用户在paypal的页面认可这笔交易然后点击检查订单(注意此刻尚未付款)->页面条转到你自己的网站->用户在你网站上点击确人支付。自此流程才算走完。
说人话就是我要下单,我点击下单了先跳转到paypal让我选择付款方式和收货地址和让我看到付款金额,我同意的话就在paypal上点击下一步,这时候会跳转到你的网站,网站上应该有我即将要购买的东西和一个确认支付按钮,点击确认支付,这时才开始扣费。
请务必清晰上面的流程,下面上代码
万物之基本TOKEN你所有请求都需要用他,这里用session存储了一下
function paytoken(){
session_start();
if(isset($_SESSION['token'])){
if($_SESSION['token']['time']<=time())
{
$token=paytokencurl();
$_SESSION['token']=array('token'=>$token,'time'=>time()+3600);
}
}else{
$token=paytokencurl();
$_SESSION['token']=array('token'=>$token,'time'=>time()+3600);
}
return $_SESSION['token']['token'];
}
function paytokencurl(){
$url = "https://api-m.sandbox.paypal.com/v1/oauth2/token";
$clientId = "你的沙箱id";
$clientSecret = "你的沙箱secret";
$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);
$token=json_decode($result,true);
return $token['access_token'];
}
你上面能出现问题请检查你的id和secret是正确,以及是否弄混了,9成的错误均来源于此
有了toke之后就可以请求paypal来进行第一步 也就是用户点击下单这个时候的动作了
总金额$money需要精确到小数点后两位
public function index($money){
$url = "https://api-m.sandbox.paypal.com/v2/checkout/orders";
$body = [
"intent" => "CAPTURE",
"purchase_units" => [[
"amount" => [
"value" => $money,
"currency_code" => "USD"
]
]],
"application_context" => [
"cancel_url" => "用户取消支付时候跳转地址",
"return_url" => "用户同意支付时候的跳转地址"
]
];
$token=paytoken();
$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, json_encode($body) );
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
正确的话会返回一段下单的地址 直接跳转过去就好 用户确认的话 就会根据上方设置的地址进行回跳
回跳的时候paypal会get传递给你token 这时候你有两个选择
1。返回页面服务端直接对paypal发起用户确认付款按钮(可能会被顾客投诉)
2。返回页面正常展示商品信息,同时下方设置确认支付按钮,顾客点击才确认支付
下面上确认支付代码 $urltoken 是paypal通过地址栏get传递的token我重新起了个名方便区分
$url = "https://api-m.sandbox.paypal.com/v2/checkout/orders/".$urltoken."/capture";
$ch = curl_init ();
$token=paytoken();
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'
));
$paypal_redate = curl_exec($ch);
curl_close($ch);
然后解析一下$paypal_redate 就可以判断用户是否真正支付成功了,可能存在用户余额不足等情况
然后处理自己的业务,把用户信息存入本地啊,判断啊啥的就是你自己的业务逻辑了
切记 文中所有url全部都是沙盒地址,线上的话计得修改成线上url
都讲出来挺简单的,但是自己一点一点去啃还是蛮复杂的,有问题写评论把,看到就会回答。