当前位置: 首页 > 工具软件 > PayPal-Go-SDK > 使用案例 >

paypal对接REST API 2.0接口 原理和php代码 

尉迟正奇
2023-12-01

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

都讲出来挺简单的,但是自己一点一点去啃还是蛮复杂的,有问题写评论把,看到就会回答。

 类似资料: