溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Laravel接入paypal支付的示例

發(fā)布時(shí)間:2021-01-29 14:51:53 來源:億速云 閱讀:414 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關(guān)Laravel接入paypal支付的示例的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

PayPal

PayPal, 全球眾多用戶使用的國際貿(mào)易支付工具, 能夠輕松完成境外收付款! 一個(gè)賬戶全球通用, 成為PayPal商家, 就能在任何地方接受更多付款方式。

下載paypal sdk

在 composer.json 中加入 “paypal/rest-api-sdk-php” : “1.7.4”,如圖:

Laravel接入paypal支付的示例

執(zhí)行composer update

注冊開發(fā)者賬號,創(chuàng)建測試應(yīng)用,測試賬戶

地址:

https://developer.paypal.com

創(chuàng)建沙盒測試賬戶

賬號后臺(可以看到自己的消費(fèi)記錄):

https://www.sandbox.paypal.com/signin?returnUri=https%3A%2F%2Fwww.sandbox.paypal.com%2Fmyaccount%2Fsummary&state=%2F

創(chuàng)建應(yīng)用

Laravel接入paypal支付的示例

查看應(yīng)用配置

點(diǎn)擊創(chuàng)建的應(yīng)用,查看配置Client ID,Secret,后面請求接口需要用到,sandbox為測試環(huán)境,live為線上環(huán)境

Laravel接入paypal支付的示例

新建測試賬號

可設(shè)置金額及密碼

Laravel接入paypal支付的示例

接入代碼

下單邏輯

<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use PayPal\Api\Payer;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Details;
use PayPal\Api\Amount;
use PayPal\Api\Transaction;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Payment;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Exception\PayPalConnectionException;
use PayPal\Rest\ApiContext;
use PayPal\Api\PaymentExecution;
class paypalController extends Controller
{
    const clientId = 'xxxxxxxxx';//應(yīng)用Client ID
    const clientSecret = 'xxxxxxxx';//Secret
    const accept_url = 'http://xxx.laravel.com/Api/paypal/Callback'; //支付成功和取消交易的跳轉(zhuǎn)地址
    const Currency = 'USD';//貨幣單位
    protected $PayPal;
    public function __construct()
    {
        $this->PayPal = new ApiContext(
            new OAuthTokenCredential(
                self::clientId,
                self::clientSecret
            )
        );
 //如果是沙盒測試環(huán)境不設(shè)置,請注釋掉
//        $this->PayPal->setConfig(
//            array(
//                'mode' => 'live',
//            )
//        );
    }
    /**
     * @param
     * $product 商品
     * $price 價(jià)錢
     * $shipping 運(yùn)費(fèi)
     * $description 描述內(nèi)容
     */
    public function pay()
    {
        $product = '1123';
        $price = 1;
        $shipping = 0;
        $description = '1123123';
        $paypal = $this->PayPal;
        $total = $price + $shipping;//總價(jià)
        $payer = new Payer();
        $payer->setPaymentMethod('paypal');
        $item = new Item();
        $item->setName($product)->setCurrency(self::Currency)->setQuantity(1)->setPrice($price); 
        $itemList = new ItemList();
        $itemList->setItems([$item]);
        $details = new Details();
        $details->setShipping($shipping)->setSubtotal($price);
        $amount = new Amount();
        $amount->setCurrency(self::Currency)->setTotal($total)->setDetails($details);
        $transaction = new Transaction();
        $transaction->setAmount($amount)->setItemList($itemList)->setDescription($description)->setInvoiceNumber(uniqid());
        $redirectUrls = new RedirectUrls();
        $redirectUrls->setReturnUrl(self::accept_url . '?success=true')->setCancelUrl(self::accept_url . '/?success=false');
        $payment = new Payment();
        $payment->setIntent('sale')->setPayer($payer)->setRedirectUrls($redirectUrls)->setTransactions([$transaction]);
        try {
            $payment->create($paypal);
        } catch (PayPalConnectionException $e) {
            echo $e->getData();
            die();
        }
        $approvalUrl = $payment->getApprovalLink();
        header("Location: {$approvalUrl}");
    }

走完下單邏輯會跳轉(zhuǎn)到paypal的支付頁面,第一次需要輸入賬號密碼,如圖:

Laravel接入paypal支付的示例

進(jìn)入支付頁面,選擇Paypal余額支付,支付完成或取消交易會自動(dòng)跳轉(zhuǎn)到你下單時(shí)傳的跳轉(zhuǎn)地址,并會傳兩個(gè)參數(shù) paymentId(paypal訂單號),PayerID(用戶id),你可以根據(jù)你的業(yè)務(wù)邏輯寫對應(yīng)邏輯,一般同步回調(diào)確認(rèn)用戶是否付款,異步回調(diào)處理業(yè)務(wù)邏輯

同步回調(diào)

 /**
     * 回調(diào)
     */
    public function Callback()
    {
        $success = trim($_GET['success']);
        if ($success == 'false' && !isset($_GET['paymentId']) && !isset($_GET['PayerID'])) {
            echo '取消付款';die;
        }
        $paymentId = trim($_GET['paymentId']);
        $PayerID = trim($_GET['PayerID']);
        if (!isset($success, $paymentId, $PayerID)) {
            echo '支付失敗';die;
        }
        if ((bool)$_GET['success'] === 'false') {
            echo  '支付失敗,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】';die;
        }
        $payment = Payment::get($paymentId, $this->PayPal);
        $execute = new PaymentExecution();
        $execute->setPayerId($PayerID);
        try {
            $payment->execute($execute, $this->PayPal);
        } catch (Exception $e) {
            echo ',支付失敗,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】';die;
        }
        echo '支付成功,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】';die;
    }

異步回調(diào)

回調(diào)地址配置在后臺,地址必須為https開頭,設(shè)置一般過一段時(shí)間才會生效(我是下午申請,第二天上午才生效的,如圖:

Laravel接入paypal支付的示例

你可以勾選很多事件發(fā)送通知,不過最重要的還是支付完成(Payment sale completed)以及退款(Payment sale refunded)

支付完成

public function notify(){
        //獲取回調(diào)結(jié)果
        $json_data = $this->get_JsonData();
        if(!empty($json_data)){
             Log::debug("paypal notify info:\r\n".json_encode($json_data));
        }else{
            Log::debug("paypal notify fail:參加為空");
        }
          //自己打印$json_data的值看有那些是你業(yè)務(wù)上用到的
          //比如我用到
          $data['invoice'] = $json_data['resource']['invoice_number'];
          $data['txn_id'] = $json_data['resource']['id'];
          $data['total'] = $json_data['resource']['amount']['total'];
          $data['status'] = isset($json_data['status'])?$json_data['status']:'';
          $data['state'] = $json_data['resource']['state'];
        try {
                 //處理相關(guān)業(yè)務(wù)
        } catch (\Exception $e) {
            //記錄錯(cuò)誤日志
            Log::error("paypal notify fail:".$e->getMessage());
            return "fail";
        }
        return "success";
    }
    public function get_JsonData(){
        $json = file_get_contents('php://input');
        if ($json) {
            $json = str_replace("'", '', $json);
            $json = json_decode($json,true);
        }
        return $json;
    }

處理退款

public function returnMoney()
    {
        try {
            $txn_id = "xxxxxxx";  //異步加調(diào)中拿到的id
            $amt = new Amount();
            $amt->setCurrency('USD')
                ->setTotal('99');  // 退款的費(fèi)用
            $refund = new Refund();
            $refund->setAmount($amt);
            $sale = new Sale();
            $sale->setId($txn_id);
            $refundedSale = $sale->refund($refund, $this->PayPal);
        } catch (\Exception $e) {
            // PayPal無效退款
            return json_decode(json_encode(['message' => $e->getMessage(), 'code' => $e->getCode(), 'state' => $e->getMessage()]));  // to object
        }
        // 退款完成
        return $refundedSale; 
    }

查看相關(guān)流水

Laravel接入paypal支付的示例

總結(jié)

paypal對于擴(kuò)展海外支付的業(yè)務(wù)還是很有幫助的,它支持多種貨幣,可綁定各種信用卡,銀行卡,缺點(diǎn)是接入時(shí)不會有paypal技術(shù)人員和你對接,反正我是在接入完成之后才聯(lián)系到paypal對接人的,好在接入難度不大,網(wǎng)上資料比較豐富,希望此文章可以給各位帶來幫助,對于海外支付有興趣的可以和我來討論。

感謝各位的閱讀!關(guān)于“Laravel接入paypal支付的示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI