勤奋鸟旗下 软件定制开发 安全交付平台!一次合作,终身售后!全程项目经理一对一跟进测试!公司以自研团队结合搭档圈,为用户提供安全快速稳定的软件源码开发服务!

Paypal,PayPal支付,Paypal参数设置

2024-09-04 17:20:51
复制链接

7334

Paypal支付 Paypal参数

Paypal支付,是目前网站流行的一种支付方式,Paypal也是需要依赖工具包来进行开发

paypal依赖包 composer require paypal/rest-api-sdk-php

用 composer 命令来下载依赖包


Paypal支付的参数也是要用到Paypal秘钥和ID,查看Paypal API文档,来进行开发,对接,

参考文档 https://learnku.com/articles/26282,这是参考文档,可以去翻阅查看


沙盒环境

沙盒环境就和本地环境差不多,是一种模拟Paypal的流程支付环境也称沙盒环境

沙盒登录 https://www.sandbox.paypal.com/c2/signin

参考这个文档进行调试和开发


下面是Paypal支付调取,同步回调和异步回调,退款的方法,

<?php namespace app\index\controller;
use think\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\Api\Refund;
use PayPal\Api\Sale;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Exception\PayPalConnectionException;
use PayPal\Rest\ApiContext;
use PayPal\Api\PaymentExecution;

class Paypal extends Controller
{
    const clientId = 'Ac6pDC0T8z9tY6UtMah1F1bThTS5ZBvljoC-HmM2IQozJVau9RzBfryaG4bgsnYCEFC2xezoALZTKWm_';//ID
    const clientSecret = 'EBUOzWInmgG1ZUjqVP41o6QTyzpQgVp3DOiI8CAfJMFoaoCh_W9QrCpDx98D2npSHRZ25WdHh3fGiScP';//&#31192;&#38053;
    const accept_url = 'http://gougoule.com/index/Paypal/Callback'; //&#21516;&#27493;&#22238;&#35843;
    const error_log = './error_log/paypal_errors.log'; //&#38169;&#35823;&#26085;&#24535;
    const Currency = 'USD';//&#24065;&#31181;
    protected $PayPal;

//sb-cng47f6173606@business.example.com  a123456789
//sb-ye47ag6160608@personal.example.com  a123456789

    public function __construct()
    {
        $this->PayPal = new ApiContext(
            new OAuthTokenCredential(
                self::clientId,
                self::clientSecret
            )
        );
        //&#22914;&#26524;&#26159;&#27801;&#30418;&#27979;&#35797;&#29615;&#22659;&#19981;&#35774;&#32622;&#65292;&#35831;&#27880;&#37322;&#25481;
//        $this-&gt;PayPal-&gt;setConfig(
//            array(
//                'mode' =&gt; 'live',
//            )
//        );
    }

    /**
     * paypal&#25903;&#20184;
     * @param $price float &#37329;&#39069;
     * @param $order_sn string &#35746;&#21333;&#21495;
     * @param $product string &#21830;&#21697;&#21517;
     * @param $description string &#21830;&#21697;&#25551;&#36848;
     * @param $shipping float &#36816;&#36153;
     *
     */
    public function pay($price=10, $order_sn=123456, $product='&#21830;&#21697;', $description='&#25551;&#36848;&#20869;&#23481;', $shipping = 0)
    {
        $paypal = $this-&gt;PayPal;
        $total = $price + $shipping;//&#24635;&#20215;
        $payer = new Payer();
        $payer-&gt;setPaymentMethod('paypal');
        $item = new Item();
        $item-&gt;setName($product)-&gt;setCurrency(self::Currency)-&gt;setQuantity(1)-&gt;setPrice($price);
        $itemList = new ItemList();
        $itemList-&gt;setItems([$item]);
        $details = new Details();
        $details-&gt;setShipping($shipping)-&gt;setSubtotal($price);
        $amount = new Amount();
        $amount-&gt;setCurrency(self::Currency)-&gt;setTotal($total)-&gt;setDetails($details);
        $transaction = new Transaction();
        $transaction-&gt;setAmount($amount)-&gt;setItemList($itemList)-&gt;setDescription($description)-&gt;setInvoiceNumber(uniqid());
        $redirectUrls = new RedirectUrls();
        $redirectUrls-&gt;setReturnUrl(self::accept_url . '?success=true&amp;order_sn='.$order_sn)-&gt;setCancelUrl(self::accept_url . '/?success=false');
        $payment = new Payment();
        $payment-&gt;setIntent('sale')-&gt;setPayer($payer)-&gt;setRedirectUrls($redirectUrls)-&gt;setTransactions([$transaction]);
        try {
            $payment-&gt;create($paypal);
            $approvalUrl = $payment-&gt;getApprovalLink();
            echo json_encode(['code'=&gt;200, 'msg'=&gt;'&#25104;&#21151;&#65281;','url'=&gt;$approvalUrl]);
            //header("Location: {$approvalUrl}"); //&#33258;&#21160;&#36339;&#36716;&#39029;&#38754;
            exit();
        } catch (PayPalConnectionException $e) {
            error_log(date('Y-m-d H:i:s')." paypal pay fail: ".$e-&gt;getData()."\n", 3, self::error_log);
            echo json_encode(['code'=&gt;202, 'msg'=&gt;$e-&gt;getData()]);
            exit();
        }
    }

    /**
     * &#21516;&#27493;&#22238;&#35843;&#26041;&#27861;
     */
    public function Callback()
    {
        $success = trim($_GET['success']);
        if ($success == 'false' &amp;&amp; !isset($_GET['paymentId']) &amp;&amp; !isset($_GET['PayerID'])) {
            error_log(date('Y-m-d H:i:s')." paypal Callback fail: &#21462;&#28040;&#20184;&#27454;"."\n", 3, self::error_log);
            echo json_encode(['code'=&gt;202, 'msg'=&gt;'&#21462;&#28040;&#20184;&#27454;']);
            exit();
        }
        $paymentId = trim($_GET['paymentId']);
        $PayerID = trim($_GET['PayerID']);
        $order_sn = trim($_GET['order_sn']); //&#35746;&#21333;&#21495;
        if (!isset($success, $paymentId, $PayerID)) {
            error_log(date('Y-m-d H:i:s')." paypal Callback fail: &#25903;&#20184;&#22833;&#36133;"."\n", 3, self::error_log);
            echo json_encode(['code'=&gt;202, 'msg'=&gt;'&#25903;&#20184;&#22833;&#36133;']);
            exit();
        }
        if ((bool)$_GET['success'] === 'false') {
            error_log(date('Y-m-d H:i:s')." paypal Callback fail:".'&#25903;&#20184;&#22833;&#36133;&#65292;&#25903;&#20184;ID&#12304;' . $paymentId . '&#12305;,&#25903;&#20184;&#20154;ID&#12304;' . $PayerID . '&#12305;'."\n", 3, self::error_log);
            echo json_encode(['code'=&gt;202,'msg'=&gt;'&#25903;&#20184;&#22833;&#36133;&#65292;&#25903;&#20184;ID&#12304;' . $paymentId . '&#12305;,&#25903;&#20184;&#20154;ID&#12304;' . $PayerID . '&#12305;']);
            exit();
        }
        $payment = Payment::get($paymentId, $this-&gt;PayPal);
        $execute = new PaymentExecution();
        $execute-&gt;setPayerId($PayerID);

        try {
            $payment-&gt;execute($execute, $this-&gt;PayPal);
//            error_log(date('Y-m-d H:i:s')."&#21516;&#27493;&#22238;&#35843;:".json_encode($_GET)."\n", 3, self::error_log);

            /*
             * &#23558;$paymentId&#20445;&#23384;&#21040;&#25968;&#25454;&#34920;
             * */

            echo json_encode(['code'=&gt;200,'msg'=&gt;'&#25903;&#20184;&#25104;&#21151;&#65292;&#25903;&#20184;ID&#12304;' . $paymentId . '&#12305;,&#25903;&#20184;&#20154;ID&#12304;' . $PayerID . '&#12305;&#65292;&#35746;&#21333;&#21495;&#12304;'.$order_sn.'&#12305;']);
            exit();
        } catch (Exception $e) {
            error_log(date('Y-m-d H:i:s')." paypal Callback fail:".$e-&gt;getMessage(). ",&#25903;&#20184;&#22833;&#36133;&#65292;&#25903;&#20184;ID&#12304;" . $paymentId . "&#12305;,&#25903;&#20184;&#20154;ID&#12304;" . $PayerID . "&#12305;"."\n", 3, self::error_log);
            echo json_encode(['code'=&gt;202,'msg'=&gt;$e . ',&#25903;&#20184;&#22833;&#36133;&#65292;&#25903;&#20184;ID&#12304;' . $paymentId . '&#12305;,&#25903;&#20184;&#20154;ID&#12304;' . $PayerID . '&#12305;']);
            exit();
        }
    }

    //&#24322;&#27493;&#22238;&#35843;&#65288;&#22312;&#25511;&#21046;&#21488;&#35774;&#32622;&#65289;
    public function notify(){
        //&#36890;&#30693;&#32467;&#26524; https://developer.paypal.com/docs/api-basics/notifications/webhooks/notification-messages/
        $json_data = file_get_contents('php://input');
//        error_log(date('Y-m-d H:i:s')."&#24322;&#27493;&#22238;&#35843;:".$json_data."\n", 3, self::error_log);
        $json_data = str_replace("'", '', $json_data);
        $json_data = json_decode($json_data,true);
        if(empty($json_data)){
            error_log(date('Y-m-d H:i:s')."paypal notify fail: &#21442;&#21152;&#20026;&#31354;!"."\n", 3, self::error_log);
            exit();
        }
        try {
            //&#33258;&#24049;&#25171;&#21360;$json_data&#30340;&#20540;&#30475;&#26377;&#37027;&#20123;&#26159;&#20320;&#19994;&#21153;&#19978;&#29992;&#21040;&#30340;
            $id = $json_data['resource']['id'];  //&#20184;&#27454;id(&#36864;&#27454;&#29992;),&#23384;&#34920;
            $paymentId = $json_data['resource']['parent_payment']; //&#29992;&#27492;&#23383;&#27573;&#26597;&#35810;&#20986;&#35746;&#21333;&#34920;
            if($json_data['resource_type']=='sale'){ //&#25903;&#20184;&#23436;&#25104;

                /*
                * &#22788;&#29702;&#30456;&#20851;&#19994;&#21153;
                * */

            }elseif ($json_data['resource_type']=='refund'){ //&#36864;&#27454;&#25104;&#21151;
                $total=$json_data['resource']['amount']['total']; //&#36864;&#27454;&#37329;&#39069;

                /*
                * &#22788;&#29702;&#30456;&#20851;&#19994;&#21153;
                * */

            }
        } catch (\Exception $e) {
            //&#35760;&#24405;&#38169;&#35823;&#26085;&#24535;
            error_log(date('Y-m-d H:i:s')."paypal notify fail:".$e-&gt;getMessage()."\n", 3, self::error_log);
            exit();
        }
        return "success";
    }

    //&#36864;&#27454;
    public function returnMoney($txn_id = "3LV45487XU194815F",$price=1){ //&#24322;&#27493;&#22238;&#35843;&#20013;&#25343;&#21040;&#30340;id
        try {
            $amt = new Amount();
            $amt-&gt;setCurrency('USD')
                -&gt;setTotal($price);  // &#36864;&#27454;&#30340;&#36153;&#29992;
            $refund = new Refund();
            $refund-&gt;setAmount($amt);
            $sale = new Sale();
            $sale-&gt;setId($txn_id);
            $refundedSale = $sale-&gt;refund($refund, $this-&gt;PayPal);
        } catch (\Exception $e) {
            // PayPal&#26080;&#25928;&#36864;&#27454;
//            return json_decode(json_encode(['message' =&gt; $e-&gt;getMessage(), 'code' =&gt; $e-&gt;getCode(), 'state' =&gt; $e-&gt;getMessage()]));  // to object
            echo json_encode(['code' =&gt; 202,'msg'=&gt; $e-&gt;getMessage()]);
            exit();
        }
        $refundedSale = $refundedSale-&gt;toArray();
        // &#36864;&#27454;&#23436;&#25104;
        if($refundedSale['state']=='completed'){
            echo json_encode(['code' =&gt; 200,'msg' =&gt;'&#36864;&#27454;&#25104;&#21151;&#65281;']);
            exit();
        }else{
            echo json_encode(['code' =&gt; 202,'msg' =&gt;'&#36864;&#27454;&#22833;&#36133;&#65281;']);
            exit();
        }
    }


}
17330196230 13230981129

多线程同步开发
项目经理1v1跟进
源码定制交付
一次合作/终身售后

微信扫码登录/注册

提示

您的诉求已经提交请等待工作人员联系,快速通过请联系管理员

微信扫一扫快速联系

用户协议

欢迎访问我们的网站!我们非常重视用户的隐私权和信息安全,因此制定了以下用户协议,以明确我们与您之间的关系以及您在使用本网站时应遵守的条款。请您仔细阅读并同意本协议的所有条款,以便您能够合法、安全地使用本网站。如果您不同意本协议的任何内容,请立即停止使用本网站。

  1. 服务说明:本网站是一个提供定制软件开发服务和在线找技术搭档的互联网平台。我们保留随时更改、更新或暂停本网站的权利。我们会尽力确保网站的正常运行,但对于因技术问题、系统维护或其他原因导致的网站暂时不可用,我们不承担任何责任。

  2. 用户注册:用户需要通过提供手机号、微信扫码和其他必要信息来注册一个账户。您有责任保护您的用户名和密码,不得将其透露给任何第三方。对于因您的用户名和密码被泄露而导致的任何损失或损害,我们将不承担责任。

  3. 用户行为规范:用户应遵守中华人民共和国相关法律法规,不得发布或传播违法信息、侵犯他人权益的内容。用户应对其发布的内容负责,并承担因发布不当内容而引起的任何法律责任。

  4. 版权声明:本网站所包含的所有文字、图片、音频、视频等素材的著作权均归本网站所有(会员用户上传的默认承诺为不侵权的合法自有技术成果,本网站审核信息后可展示,所有权不归本网站)。未经本网站书面许可,任何单位或个人不得以任何形式复制、转载、修改或传播本网站的任何内容。对于侵犯本网站知识产权的行为,将依法追究其法律责任。

  5. 免责声明:本网站不对因使用本网站而引起的任何直接、间接、偶然、特殊或后果性的损害承担责任。包括但不限于利润损失、数据丢失、业务中断等。

  6. 适用法律和争议解决:本协议的签订、履行、解释及争议解决均适用中华人民共和国法律。如发生争议,双方应首先协商解决;协商不成的,任何一方均有权向有管辖权的人民法院提起诉讼。

  7. 本协议的解释权归本网站所有。如有未尽事宜,本网站保留最终解释权。

  8. 本协议自用户点击“同意”或“接受”按钮时生效。

同意

隐私政策

欢迎访问我们的网站!我们致力于为您提供一个安全、可靠的在线环境。本隐私政策旨在说明我们在您使用我们的网站时如何收集、使用和保护您的个人信息。请仔细阅读以下内容,以了解我们的隐私政策。

  1. 信息收集

在使用我们的网站时,我们可能会收集以下类型的信息:

a) 个人识别信息:如姓名、电子邮件地址、电话号码等。 b) 非个人识别信息:如浏览器类型、操作系统、设备类型、IP地址等。 c) 用户行为信息:如访问页面、点击链接、搜索查询等。

  1. 信息使用

我们收集的信息将用于以下目的:

a) 提供、改进和个性化我们的服务。 b) 与您联系,回应您的询问和请求。 c) 发送您请求的或我们认为对您有帮助的信息。 d) 进行市场调研和分析,以改进我们的产品和服务。 e) 防止欺诈和其他非法活动。

  1. 信息共享

我们不会出售、出租或以其他方式与第三方共享您的个人信息,除非:

a) 获得您的明确同意。 b) 与可信赖的合作伙伴共享,以提供您请求的服务。 c) 根据法律要求或政府机关的要求。 d) 为保护我们的权利、财产或安全。

  1. 信息安全

我们采取合理的安全措施,以保护您的个人信息不受未经授权的访问、披露、更改或破坏。然而,请注意,没有任何一种电子存储方法是100%安全的。

  1. Cookie和跟踪技术

我们的网站使用Cookie和类似的跟踪技术来收集有关您使用我们网站的信息。这些信息有助于我们分析和改进我们的网站,以及提供个性化的内容和广告。您可以通过浏览器设置拒绝接受Cookie,但这可能会影响您使用我们网站的能力。

  1. 第三方链接

我们的网站可能包含指向其他网站的链接。请注意,我们对其他网站的隐私政策和实践不承担任何责任。我们建议您在访问这些网站时查看其隐私政策。

  1. 隐私政策的变更

我们可能会不时更新本隐私政策。请定期查看此页面,以确保您了解我们对个人信息的最新政策。

  1. 联系我们

如果您对我们的隐私政策有任何疑问或建议,请通过以下联系方式与我们联系:

电子邮件:[wangye-101@163.com]

电话:+86-173-3019-6230

地址:中国石家庄市长安区吾悦广场2010室

感谢您的信任和支持!我们将竭诚为您提供更优质的服务。

同意