首页 > 编程语言 >PayPal支付对接php

PayPal支付对接php

时间:2024-08-07 08:55:57浏览次数:10  
标签:use PayPal paypal 对接 Api new php payment

# 安装composer 包
 "paypal/rest-api-sdk-php": "^1.14",
 "paypal/paypal-checkout-sdk": "^1.0"


use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Transaction;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Rest\ApiContext;



    public function paypal()
    {
        $price = '1';
        # 订单编号
        $orderSn = makePaySn(1);
        $client_id = \think\Env::get('paypal.client_id');
        $secret_key = \think\Env::get('paypal.secret');
        $paypal = new ApiContext(new OAuthTokenCredential($client_id, $secret_key));
        # 设置环境
        $paypal->setConfig(['mode' => 'sandbox']); //设置线上环境,默认是sandbox(沙箱模式)live(正式环境)
        $payer = new Payer();
        # 付款方式
        $payer->setPaymentMethod('paypal');
        $item = new Item();
        //USD=美金
        $item->setName('充值金豆')->setCurrency('USD')->setQuantity(1)->setPrice($price);
        # 支付清单
        $itemList = new ItemList();
        $itemList->setItems([$item]);
        $details = new Details();
        $details->setShipping(0)->setSubtotal($price);
        # setCurrency 货币 setTotal 向此人付付款金额  setDetails 付款金额其他信息
        $amount = new Amount();
        $amount->setCurrency('USD')->setTotal($price)->setDetails($details);
        # 支付
        $transaction = new Transaction();
        $transaction->setAmount($amount)->setItemList($itemList)->setDescription('下单支付')
            ->setInvoiceNumber($orderSn);
        # 设置回调
        $redirectUrls = new RedirectUrls();
        $redirectUrls
            # 支付成功回调地址
            ->setReturnUrl(request()->domain() . '/api/recharge_order/pay_success_callback?success=true')
            # 取消订单回调地址
            ->setCancelUrl(request()->domain() . '/api/recharge_order/pay_success_callback?success=false');

        $payment = new Payment();
        # ["sale", "authorize", "order"]  setPayer=来源方式
        $payment->setIntent('sale')->setPayer($payer)->setRedirectUrls($redirectUrls)->setTransactions([$transaction]);
        try {
            $payment->create($paypal);
        } catch (PayPalConnectionException $e) {
            $this->error($e->getData());
        }
        $approvalUrl = $payment->getApprovalLink();
        $this->success("创建成功", [
            'pay' => $approvalUrl
        ]);
    }
    /**
     * Notes:paypal支付回调
     * User: Ixiangang
     * Date: 2024/7/12
     * Time:19:49
     */
    public function pay_success_callback()
    {
        $success = $this->request->get('success');
        if ($success == 'true') {
            $paymentID = $this->request->get('paymentId');
            $payerId = $this->request->get('PayerID');
            $clientId = \think\Env::get('paypal.client_id');
            $secret = \think\Env::get('paypal.secret');
            $oAuth = new \PayPal\Auth\OAuthTokenCredential($clientId, $secret);
            $apiContext = new \PayPal\Rest\ApiContext($oAuth);
            if (!$this->debug) {
                $apiContext->setConfig(['mode' => 'live']);//设置线上环境,默认是sandbox沙箱
            }
            $payment = \PayPal\Api\Payment::get($paymentID, $apiContext);
            $execute = new \PayPal\Api\PaymentExecution();
            $execute->setPayerId($payerId);
            try {
                $payment = $payment->execute($execute, $apiContext);//执行,从paypal获取支付结果
                $paymentState = $payment->getState();//Possible values: created, approved, failed.
                $out_trade_no = $payment->getTransactions()[0]->getInvoiceNumber();//string(20) "23121117295077560001" 平台内订单编号
                $payNum = $payment->getTransactions()[0]->getRelatedResources()[0]->getSale()->getId();//这是三方支付的流水单号,必须保存,在退款时会使用到 string(17) "9X01559580718392X"
                $transactionState = $payment->getTransactions()[0]->getRelatedResources()[0]->getSale()->getState();//Possible values: completed, partially_refunded, pending, refunded, denied.
                if ($paymentState == 'approved' && $transactionState == 'completed') {
                    # 这里写业务逻辑
                } else {
                    //paypal回调错误,paypal状态不正确
                    echo "error";//返回错误标识
                    /*$fail_url = request()->domain()."/index.html#/pagesA/payment_status/payment_status?status=0";
                    //处理成功的逻辑,例如:判断支付金额与订单金额,更新订单状态等
                    header("Location: {$fail_url}");*/
                }
            } catch (\Exception $e) {
                echo "error";//返回错误标识
                /*$fail_url = request()->domain()."/index.html#/pagesA/payment_status/payment_status?status=0";
                //处理成功的逻辑,例如:判断支付金额与订单金额,更新订单状态等
                header("Location: {$fail_url}");*/
            }
        } else {
            echo "error";//返回错误标识
            /*$fail_url = request()->domain()."/index.html#/pagesA/payment_status/payment_status?status=0";
            //处理成功的逻辑,例如:判断支付金额与订单金额,更新订单状态等
            header("Location: {$fail_url}");*/
        }
    }

 

标签:use,PayPal,paypal,对接,Api,new,php,payment
From: https://www.cnblogs.com/ixiangang06/p/18346341

相关文章

  • LangChain与CI/CD的无缝对接:自动化部署的新前沿
    LangChain与CI/CD的无缝对接:自动化部署的新前沿在当今快速发展的软件开发领域,持续集成/持续部署(CI/CD)已成为提升开发效率和软件质量的关键实践。LangChain,作为一个假设的编程辅助工具,如果存在,它可能会与CI/CD流程紧密集成,以实现代码生成、测试和部署的自动化。本文将探讨La......
  • 小白学php,emlog6.0代码审计,fortify代码审计
    一、初识报错注入报错注入是一种通过引发SQL错误并利用错误消息回显数据库信息的技术。通过使用MySQL中的特定函数(如UPDATEXML),可以将数据库查询结果嵌入到错误消息中,从而获取数据库中的数据。二、执行原理代码逻辑分析:用户输入参数(如用户ID)。后台执行SQL查询(查询用户信息......
  • ThinkPHP8事件两种使用方式
    目录通过监听方式通过事件订阅智能订阅手动订阅监听方式生成事件监听类,在项目根目录下执行以下命令://生成一个UserLoginSuccess监听类phpthinkmake:listenerUserLoginSuccess执行之后,会在app->listener目录下生成UserLoginSuccess.php,代码如下:/**用户登录成......
  • 织梦用的是php还是thinkphp
    织梦内容管理系统(DedeCms)以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门......
  • php: 在php中切换到指定的用户执行
    一,真实用户id和有效用户id的区别:1,  真实用户ID(RUID) 是启动进程的用户的ID2,有效用户ID(EUID) 是当前执行进程的用户ID即:进程启动时的用户id是真实用户ID(RUID),   但实际执行时为了控制权限会切换为:有效用户ID二,代码:切换用户和组的有效id<?php......
  • 计算机毕业设计必看必学!! 86393 基于微服务架构的餐饮系统的设计与实现,原创定制程序,
    摘   要近年来,我国经济和社会发展迅速,人们物质生活水平日渐提高,餐饮行业更是发展迅速,人们对于餐饮行业的认识和要求也越来越高。传统形式的餐饮行业都是以人为本,管理起来需要很多人力、物力、财力,既不方便管理者的管理,也不方便顾客实时了解餐厅动态,给传统餐......
  • PHP 无限级分类
    1)无限级分类处理<?php//准备分类原始数据$cate_arr=[['id'=>1,'name'=>'电脑','pid'=>0],['id'=>2,'name'=>'手机','pid'=>0],['id'=>3,'nam......
  • RSA非对称加密,前端JS加密,后端PHP解密
    RSA公钥/私钥在线生成:http://web.chacuo.net/netrsakeypair通过以上网址生成公钥/私钥对,私钥格式这里选择【PKCS#1】,如:公钥:-----BEGINPUBLICKEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN3El4yr2maFvDo5PKIzkkiitJZEOTLNINH0RD0PL5Lob+YzbRJO6DX27SRuHcdlK7mFtkQvooW......
  • js、php实现前后端数据的base64编码和解码
    客户要求密码必须加密后再传送。javascript代码的加密函数:<scriptlanguage='javascript'>functionutf16to8(str){varout,i,len,c;out="";len=str.length;for(i=0;i<len;i++){c=str.charCodeAt(i);if(......
  • EasyCVR视频转码:T3视频不支持GB28181协议,如何实现与视频联网平台的对接?
    EasyCVR视频管理系统以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力,为各行各业的视频监控需求提供了优秀的解决方案。T3视频为公网HTTP-FLV或HLS格式的视频流,目前T3平台暂不支持国标GB28181协议,因此也无法直接接入视频联网平台实现共享应用。那么遇到此......