TinkPHP使用Paypal 支付

1,首先前往官网https://www.paypal.com 创建一个账户,我创建的是一个个人账户

微信截图_20210510100545.png

2,前往paypal开发者平台https://developer.paypal.com/ 进行创建应用

微信截图_20210510100756.png

3,SandBox 沙箱模式,可以用来测试,live正式模式,点击create App 创建应用.

微信截图_20210510101053.png

4,输入应用名称,选择应用类型,是商户还是平台,在使用沙箱模式测试时Sandbox Business Account派上用场,它是测试账号及密码.

微信截图_20210510101626.png

5,记录ClientID Secret 这两个值,后期开发中需要使用

微信截图_20210510101812.png

5,添加 webhook 填写webhook url 全部选中所有规则,之后保存,配置完成 

微信截图_20210510102210.png

 

6,前往 https://github.com/paypal/PayPal-PHP-SDK 下载Paypal SDK,我只用 lib 里面的 PayPal,把PayPal 文件夹移动到 tp5 根目录extend 里面,放到这里就不需要动了。

微信截图_20210510102310.png

 

7,之后我创建了一个控制器,点击支付则调用

代码:

<?php
/***
 * Created By JetBrains PhpStorm.
 * USER : Swoole
 * EMAIL:wyh757787026@163.com
 * DATE :2021/5/10
 * TIME :8:35
 */

namespace app\controller;

use app\BaseController;
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;
use Think\DB;

class PayPal
{
    //沙箱模式
    //public $clientId = '';
    //public $clientSecret = '';
    //生活模式
    public $clientId = '';
    public $clientSecret = '';

    public $accept_url = 'https://www.baidu.com';//返回地址
    public $currency = 'USD'; //币种 美元
    protected $PayPal;

    public function __construct()
    {
        $this->PayPal = new ApiContext(
            new OAuthTokenCredential(
                $this->clientId,
                $this->clientSecret
            )
        );
        //生活模式开启,沙箱模式注释
        $this->PayPal->setConfig(array('mode'=>'live'));
    }

    public function pay($product, $price, $shipping, $description){
        $paypal = $this->PayPal;

         $total = $price + $shipping;//总价

        $payer = new Payer();
        $payer->setPaymentMethod('paypal');

        $item = new Item();
        $item->setName($product)->setCurrency($this->currency)->setQuantity(1)->setPrice($price);

        $itemList = new ItemList();
        $itemList->setItems([$item]);

        $details = new Details();
        $details->setShipping($shipping)->setSubtotal($price);

        $amount = new Amount();
        $amount->setCurrency($this->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');
        $redirectUrls->setReturnUrl($this->accept_url .'?success=true&order_sn=1111111111111')->setCancelUrl($this->accept_url .'?success=false&order_sn=1111111111111');

        $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}");
    }

    public function Callback(){
        // 修改订单状态
        $success = trim($_GET['success']);

        if ($success == 'false' && !isset($_GET['paymentId']) && !isset($_GET['PayerID'])) {
            echo "<script>alert('取消支付。');history.go(-4);</script>";
            exit();
        }

        $paymentId = trim($_GET['paymentId']);
        $PayerID = trim($_GET['PayerID']);

        if (!isset($success, $paymentId, $PayerID)) {
            echo 'Failure to pay。';
            exit();
        }

        if ((bool)$_GET['success'] === 'false') {
            echo 'Failure to pay,payment ID【' . $paymentId . '】,Payer ID【' . $PayerID . '】';
            exit();
        }

        $payment = Payment::get($paymentId, $this->PayPal);

        $execute = new PaymentExecution();

        $execute->setPayerId($PayerID);

        try {
            $payment->execute($execute, $this->PayPal);
        } catch (Exception $e) {
            echo $e . ',支付失败,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】';
            exit();
        }
        // 到这里就支付成功了,可以修改订单状态,需要自己传参数,可以在成功回调地址后面加

        // 可以跳转订单页面
        $url = 'http://www.baidu.com';
        header("Location:$url");die;

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swoole~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值