php - Paypal Express Checkout 不收费

标签 php paypal-sandbox paypal

因此,我将 PayPal 集成向导用于 Express Checkout。 Express Checkout 窗口会弹出并正确验证,但付款交易不会从买家的账户中扣款,甚至不会出现在交易历史记录中,也不会显示为卖家账户上的交易(注意这都是通过沙盒进行的) ).

  • API 凭据很好(我什至完全更改了一次卖家帐户)
  • 我试过多个不同的买家账户,结果都一样
  • 在 Express Checkout 窗口中点击“立即付款”后,除了直接转到我的“确认”页面外,它从未给出任何已完成的指示。据我了解,这是由于未调用 SetExpressCheckout,但据我所知,它似乎已设置。我在 PayPal 的文档中搜索了几个小时,试图找到一个代码示例来说明如何设置它,但除了集成向导提供的内容之外,我找不到任何其他内容。

非常感谢任何帮助,我什至会接受有人向我指出有关实现 Express Checkout 的可靠教程的方向,因为 PayPal 的文档很糟糕。

如果您需要更多信息,请告诉我:)

编辑:它发送给我的确认页面确实有 payerID 和 transcationID。示例:confirm.php?token=EC-0NX928722D104283H&PayerID=R4GZS3H3JHGRC

无论如何,这是代码:

paypalfunctions.php

        <?php
        /********************************************
        PayPal API Module

        Defines all the global variables and the wrapper functions 
        ********************************************/
        $PROXY_HOST = '127.0.0.1';
        $PROXY_PORT = '808';

        $SandboxFlag = true;
        //' TODO:
        //'------------------------------------
        //' PayPal API Credentials
        //' Replace <API_USERNAME> with your API Username
        //' Replace <API_PASSWORD> with your API Password
        //' Replace <API_SIGNATURE> with your Signature
        //'------------------------------------

        $API_UserName = "XXX";
        $API_Password = "XXX";
        $API_Signature = "XXX";

        // BN Code  is only applicable for partners
        $sBNCode = "PP-ECWizard";


        /*  
        ' Define the PayPal Redirect URLs.  
        '   This is the URL that the buyer is first sent to do authorize payment with their paypal account
        '   change the URL depending if you are testing on the sandbox or the live PayPal site
        '
        ' For the sandbox, the URL is       https://www.sandbox.paypal.com/webscr&cmd=_express-checkout&token=
        ' For the live site, the URL is        https://www.paypal.com/webscr&cmd=_express-checkout&token=
        */

        if ($SandboxFlag == true) 
        {
            $API_Endpoint = "https://api-3t.sandbox.paypal.com/nvp";
            $PAYPAL_URL = "https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=";
            $PAYPAL_DG_URL = "https://www.sandbox.paypal.com/incontext?token=";
        }
        else
        {
            $API_Endpoint = "https://api-3t.paypal.com/nvp";
            $PAYPAL_URL = "https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=";
            $PAYPAL_DG_URL = "https://www.paypal.com/incontext?token=";
        }

        $USE_PROXY = false;
        $version = "84";


        /* An express checkout transaction starts with a token, that
             identifies to PayPal your transaction
             In this example, when the script sees a token, the script
             knows that the buyer has already authorized payment through
             paypal.  If no token was found, the action is to send the buyer
             to PayPal to first authorize payment
             */

        /*   
        '-------------------------------------------------------------------------------------------------------------------------------------------
        ' Purpose:  Prepares the parameters for the SetExpressCheckout API Call for a Digital Goods payment.
        ' Inputs:  
        '       paymentAmount:      Total value of the shopping cart
        '       currencyCodeType:   Currency code value the PayPal API
        '       paymentType:        paymentType has to be one of the following values: Sale or Order or Authorization
        '       returnURL:          the page where buyers return to after they are done with the payment review on PayPal
        '       cancelURL:          the page where buyers return to when they cancel the payment review on PayPal
        '--------------------------------------------------------------------------------------------------------------------------------------------   
        */
        function SetExpressCheckoutDG( $paymentAmount, $currencyCodeType, $paymentType, $returnURL, 
                                            $cancelURL, $items) 
        {
            //------------------------------------------------------------------------------------------------------------------------------------
            // Construct the parameter string that describes the SetExpressCheckout API call in the shortcut implementation

            $nvpstr = "&PAYMENTREQUEST_0_AMT=". $paymentAmount;
            $nvpstr .= "&PAYMENTREQUEST_0_PAYMENTACTION=" . $paymentType;
            $nvpstr .= "&RETURNURL=" . $returnURL;
            $nvpstr .= "&CANCELURL=" . $cancelURL;
            $nvpstr .= "&PAYMENTREQUEST_0_CURRENCYCODE=" . $currencyCodeType;
            $nvpstr .= "&REQCONFIRMSHIPPING=0";
            $nvpstr .= "&NOSHIPPING=1";

            foreach($items as $index => $item) {

                $nvpstr .= "&L_PAYMENTREQUEST_0_NAME" . $index . "=" . urlencode($item["name"]);
                $nvpstr .= "&L_PAYMENTREQUEST_0_AMT" . $index . "=" . urlencode($item["amt"]);
                $nvpstr .= "&L_PAYMENTREQUEST_0_QTY" . $index . "=" . urlencode($item["qty"]);
                $nvpstr .= "&L_PAYMENTREQUEST_0_ITEMCATEGORY" . $index . "=Digital";
            }


            //'--------------------------------------------------------------------------------------------------------------- 
            //' Make the API call to PayPal
            //' If the API call succeded, then redirect the buyer to PayPal to begin to authorize payment.  
            //' If an error occured, show the resulting errors
            //'---------------------------------------------------------------------------------------------------------------
                $resArray = hash_call("SetExpressCheckout", $nvpstr);
            $ack = strtoupper($resArray["ACK"]);
            if($ack == "SUCCESS" || $ack == "SUCCESSWITHWARNING")
            {
                $token = urldecode($resArray["TOKEN"]);
                $_SESSION['TOKEN'] = $token;
            }

                return $resArray;
        }

        /*
        '-------------------------------------------------------------------------------------------
        ' Purpose:  Prepares the parameters for the GetExpressCheckoutDetails API Call.
        '
        ' Inputs:  
        '       None
        ' Returns: 
        '       The NVP Collection object of the GetExpressCheckoutDetails Call Response.
        '-------------------------------------------------------------------------------------------
        */
        function GetExpressCheckoutDetails( $token )
        {
            //'--------------------------------------------------------------
            //' At this point, the buyer has completed authorizing the payment
            //' at PayPal.  The function will call PayPal to obtain the details
            //' of the authorization, incuding any shipping information of the
            //' buyer.  Remember, the authorization is not a completed transaction
            //' at this state - the buyer still needs an additional step to finalize
            //' the transaction
            //'--------------------------------------------------------------

                //'---------------------------------------------------------------------------
            //' Build a second API request to PayPal, using the token as the
            //'  ID to get the details on the payment authorization
            //'---------------------------------------------------------------------------
                $nvpstr="&TOKEN=" . $token;

            //'---------------------------------------------------------------------------
            //' Make the API call and store the results in an array.  
            //' If the call was a success, show the authorization details, and provide
            //'     an action to complete the payment.  
            //' If failed, show the error
            //'---------------------------------------------------------------------------
                $resArray=hash_call("GetExpressCheckoutDetails",$nvpstr);
                $ack = strtoupper($resArray["ACK"]);
            if($ack == "SUCCESS" || $ack=="SUCCESSWITHWARNING")
            {   
                return $resArray;
            } 
            else return false;

        }

        /*
        '-------------------------------------------------------------------------------------------------------------------------------------------
        ' Purpose:  Prepares the parameters for the GetExpressCheckoutDetails API Call.
        '
        ' Inputs:  
        '       sBNCode:    The BN code used by PayPal to track the transactions from a given shopping cart.
        ' Returns: 
        '       The NVP Collection object of the GetExpressCheckoutDetails Call Response.
        '--------------------------------------------------------------------------------------------------------------------------------------------   
        */
        function ConfirmPayment( $token, $paymentType, $currencyCodeType, $payerID, $FinalPaymentAmt, $items )
        {
            /* Gather the information to make the final call to
                 finalize the PayPal payment.  The variable nvpstr
                 holds the name value pairs
                 */
            $token              = urlencode($token);
            $paymentType        = urlencode($paymentType);
            $currencyCodeType   = urlencode($currencyCodeType);
            $payerID            = urlencode($payerID);
            $serverName         = urlencode($_SERVER['SERVER_NAME']);

            $nvpstr  = '&TOKEN=' . $token . '&PAYERID=' . $payerID . '&PAYMENTREQUEST_0_PAYMENTACTION=' . $paymentType . '&PAYMENTREQUEST_0_AMT=' . $FinalPaymentAmt;
            $nvpstr .= '&PAYMENTREQUEST_0_CURRENCYCODE=' . $currencyCodeType . '&IPADDRESS=' . $serverName; 

            foreach($items as $index => $item) {

                $nvpstr .= "&L_PAYMENTREQUEST_0_NAME" . $index . "=" . urlencode($item["name"]);
                $nvpstr .= "&L_PAYMENTREQUEST_0_AMT" . $index . "=" . urlencode($item["amt"]);
                $nvpstr .= "&L_PAYMENTREQUEST_0_QTY" . $index . "=" . urlencode($item["qty"]);
                $nvpstr .= "&L_PAYMENTREQUEST_0_ITEMCATEGORY" . $index . "=Digital";
            }
             /* Make the call to PayPal to finalize payment
                    If an error occured, show the resulting errors
                    */
            $resArray=hash_call("DoExpressCheckoutPayment",$nvpstr);

            /* Display the API response back to the browser.
                 If the response from PayPal was a success, display the response parameters'
                 If the response was an error, display the errors received using APIError.php.
                 */
            $ack = strtoupper($resArray["ACK"]);

            return $resArray;
        }
        /**
            '-------------------------------------------------------------------------------------------------------------------------------------------
            * hash_call: Function to perform the API call to PayPal using API signature
            * @methodName is name of API  method.
            * @nvpStr is nvp string.
            * returns an associtive array containing the response from the server.
            '-------------------------------------------------------------------------------------------------------------------------------------------
        */
        function hash_call($methodName,$nvpStr)
        {
            //declaring of global variables
            global $API_Endpoint, $version, $API_UserName, $API_Password, $API_Signature;
            global $USE_PROXY, $PROXY_HOST, $PROXY_PORT;
            global $gv_ApiErrorURL;
            global $sBNCode;

            //setting the curl parameters.
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL,$API_Endpoint);
            curl_setopt($ch, CURLOPT_VERBOSE, 1);

            //turning off the server and peer verification(TrustManager Concept).
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

            curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
            curl_setopt($ch, CURLOPT_POST, 1);

                //if USE_PROXY constant set to TRUE in Constants.php, then only proxy will be enabled.
             //Set proxy name to PROXY_HOST and port number to PROXY_PORT in constants.php 
            if($USE_PROXY)
                curl_setopt ($ch, CURLOPT_PROXY, $PROXY_HOST. ":" . $PROXY_PORT); 

            //NVPRequest for submitting to server
            $nvpreq="METHOD=" . urlencode($methodName) . "&VERSION=" . urlencode($version) . "&PWD=" . urlencode($API_Password) . "&USER=" . urlencode($API_UserName) . "&SIGNATURE=" . urlencode($API_Signature) . $nvpStr . "&BUTTONSOURCE=" . urlencode($sBNCode);

            //setting the nvpreq as POST FIELD to curl
            curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);

            //getting response from server
            $response = curl_exec($ch);

            //convrting NVPResponse to an Associative Array
            $nvpResArray=deformatNVP($response);
            $nvpReqArray=deformatNVP($nvpreq);
            $_SESSION['nvpReqArray']=$nvpReqArray;

            if (curl_errno($ch)) 
            {
                // moving to display page to display curl errors
                    $_SESSION['curl_error_no']=curl_errno($ch) ;
                    $_SESSION['curl_error_msg']=curl_error($ch);

                    //Execute the Error handling module to display errors. 
            } 
            else 
            {
                 //closing the curl
                    curl_close($ch);
            }

            return $nvpResArray;
        }

        /*'----------------------------------------------------------------------------------
         Purpose: Redirects to PayPal.com site.
         Inputs:  NVP string.
         Returns: 
        ----------------------------------------------------------------------------------
        */
        function RedirectToPayPal ( $token )
        {
            global $PAYPAL_URL;

            // Redirect to paypal.com here
            $payPalURL = $PAYPAL_URL . $token;
            header("Location: ".$payPalURL);
            exit;
        }
        function RedirectToPayPalDG ( $token )
        {
            global $PAYPAL_DG_URL;

            // Redirect to paypal.com here
            $payPalURL = $PAYPAL_DG_URL . $token;
            header("Location: ".$payPalURL);
            exit;
        }



        /*'----------------------------------------------------------------------------------
         * This function will take NVPString and convert it to an Associative Array and it will decode the response.
            * It is usefull to search for a particular key and displaying arrays.
            * @nvpstr is NVPString.
            * @nvpArray is Associative Array.
             ----------------------------------------------------------------------------------
            */
        function deformatNVP($nvpstr)
        {
            $intial=0;
            $nvpArray = array();

            while(strlen($nvpstr))
            {
                //postion of Key
                $keypos= strpos($nvpstr,'=');
                //position of value
                $valuepos = strpos($nvpstr,'&') ? strpos($nvpstr,'&'): strlen($nvpstr);

                /*getting the Key and Value values and storing in a Associative Array*/
                $keyval=substr($nvpstr,$intial,$keypos);
                $valval=substr($nvpstr,$keypos+1,$valuepos-$keypos-1);
                //decoding the respose
                $nvpArray[urldecode($keyval)] =urldecode( $valval);
                $nvpstr=substr($nvpstr,$valuepos+1,strlen($nvpstr));
                 }
            return $nvpArray;
        }

    ?>

checkout.php

        <?php
    require_once ("paypalfunctions.php");

    $PaymentOption = "PayPal";
    if ( $PaymentOption == "PayPal")
    {
                    // ==================================
                    // PayPal Express Checkout Module
                    // ==================================



                    //'------------------------------------
                    //' The paymentAmount is the total value of 
                    //' the purchase.
                    //'
                    //' TODO: Enter the total Payment Amount within the quotes.
                    //' example : $paymentAmount = "15.00";
                    //'------------------------------------

                    $fakeBook = "4.99";


                    //'------------------------------------
                    //' The currencyCodeType  
                    //' is set to the selections made on the Integration Assistant 
                    //'------------------------------------
                    $currencyCodeType = "USD";
                    $paymentType = "Sale";

                    //'------------------------------------
                    //' The returnURL is the location where buyers return to when a
                    //' payment has been succesfully authorized.
                    //'
                    //' This is set to the value entered on the Integration Assistant 
                    //'------------------------------------
                    $returnURL = "http://example.com";

                    //'------------------------------------
                    //' The cancelURL is the location buyers are sent to when they hit the
                    //' cancel button during authorization of payment during the PayPal flow
                    //'
                    //' This is set to the value entered on the Integration Assistant 
                    //'------------------------------------
                    $cancelURL = "http://example.com";

                    //'------------------------------------
                    //' Calls the SetExpressCheckout API call
                    //'
                    //' The CallSetExpressCheckout function is defined in the file PayPalFunctions.php,
                    //' it is included at the top of this file.
                    //'-------------------------------------------------


            $items = array();
            $items[] = array('name' => 'Fake Book', 'amt' => $fakeBook, 'qty' => 1);

            //::ITEMS::

            // to add anothe item, uncomment the lines below and comment the line above 
            // $items[] = array('name' => 'Item Name1', 'amt' => $itemAmount1, 'qty' => 1);
            // $items[] = array('name' => 'Item Name2', 'amt' => $itemAmount2, 'qty' => 1);
            // $paymentAmount = $itemAmount1 + $itemAmount2;

            // assign corresponding item amounts to "$itemAmount1" and "$itemAmount2"
            // NOTE : sum of all the item amounts should be equal to payment  amount 

            $resArray = SetExpressCheckoutDG( $fakeBook, $currencyCodeType, $paymentType, 
                                                    $returnURL, $cancelURL, $items );

                    $ack = strtoupper($resArray["ACK"]);
                    if($ack == "SUCCESS" || $ack == "SUCCESSWITHWARNING")
                    {
                                    $token = urldecode($resArray["TOKEN"]);
                                     RedirectToPayPalDG( $token );
                    } 
                    else  
                    {
                                    //Display a user friendly Error on the page using any of the following error information returned by PayPal
                                    $ErrorCode = urldecode($resArray["L_ERRORCODE0"]);
                                    $ErrorShortMsg = urldecode($resArray["L_SHORTMESSAGE0"]);
                                    $ErrorLongMsg = urldecode($resArray["L_LONGMESSAGE0"]);
                                    $ErrorSeverityCode = urldecode($resArray["L_SEVERITYCODE0"]);

                                    echo "SetExpressCheckout API call failed. ";
                                    echo "Detailed Error Message: " . $ErrorLongMsg;
                                    echo "Short Error Message: " . $ErrorShortMsg;
                                    echo "Error Code: " . $ErrorCode;
                                    echo "Error Severity Code: " . $ErrorSeverityCode;
                    }
    }

    ?>

orderconfirm.php

        <?php
    /* =====================================
     *   PayPal Express Checkout Call
     * =====================================
     */
    require_once ("paypalfunctions.php");

    $PaymentOption = "PayPal";
    if ( $PaymentOption == "PayPal" )
    {
        /*
         '------------------------------------
         ' this  step is required to get parameters to make DoExpressCheckout API call, 
         ' this step is required only if you are not storing the SetExpressCheckout API call's request values in you database.
         ' ------------------------------------
         */
        $res = GetExpressCheckoutDetails( $_REQUEST['token'] );

        /*
         '------------------------------------
         ' The paymentAmount is the total value of
         ' the purchase. 
         '------------------------------------
         */

        $finalPaymentAmount =  $res["PAYMENTREQUEST_0_AMT"];

        /*
         '------------------------------------
         ' Calls the DoExpressCheckoutPayment API call
         '
         ' The ConfirmPayment function is defined in the file PayPalFunctions.php,
         ' that is included at the top of this file.
         '-------------------------------------------------
         */

        //Format the  parameters that were stored or received from GetExperessCheckout call.
        $token              = $_REQUEST['token'];
        $payerID            = $_REQUEST['PayerID'];
        $paymentType        = 'Sale';
        $currencyCodeType   = $res['CURRENCYCODE'];
        $items = array();
        $i = 0;
        // adding item details those set in setExpressCheckout
        while(isset($res["L_PAYMENTREQUEST_0_NAME$i"]))
        {
            $items[] = array('name' => $res["L_PAYMENTREQUEST_0_NAME$i"], 'amt' => $res["L_PAYMENTREQUEST_0_AMT$i"], 'qty' => $res["L_PAYMENTREQUEST_0_QTY$i"]);
            $i++;
        }

        $resArray = ConfirmPayment ( $token, $paymentType, $currencyCodeType, $payerID, $finalPaymentAmount, $items );
        $ack = strtoupper($resArray["ACK"]);
        if( $ack == "SUCCESS" || $ack == "SUCCESSWITHWARNING" )
        {

            /*
             * TODO: Proceed with desired action after the payment 
             * (ex: start download, start streaming, Add coins to the game.. etc)
             '********************************************************************************************************************
             '
             ' THE PARTNER SHOULD SAVE THE KEY TRANSACTION RELATED INFORMATION LIKE
             '                    transactionId & orderTime
             '  IN THEIR OWN  DATABASE
             ' AND THE REST OF THE INFORMATION CAN BE USED TO UNDERSTAND THE STATUS OF THE PAYMENT
             '
             '********************************************************************************************************************
             */

            $transactionId      = $resArray["PAYMENTINFO_0_TRANSACTIONID"]; // Unique transaction ID of the payment.
            $transactionType    = $resArray["PAYMENTINFO_0_TRANSACTIONTYPE"]; // The type of transaction Possible values: l  cart l  express-checkout
            $paymentType        = $resArray["PAYMENTINFO_0_PAYMENTTYPE"];  // Indicates whether the payment is instant or delayed. Possible values: l  none l  echeck l  instant
            $orderTime          = $resArray["PAYMENTINFO_0_ORDERTIME"];  // Time/date stamp of payment
            $amt                = $resArray["PAYMENTINFO_0_AMT"];  // The final amount charged, including any  taxes from your Merchant Profile.
            $currencyCode       = $resArray["PAYMENTINFO_0_CURRENCYCODE"];  // A three-character currency code for one of the currencies listed in PayPay-Supported Transactional Currencies. Default: USD.
            $feeAmt             = $resArray["PAYMENTINFO_0_FEEAMT"];  // PayPal fee amount charged for the transaction
        //  $settleAmt          = $resArray["PAYMENTINFO_0_SETTLEAMT"];  // Amount deposited in your PayPal account after a currency conversion.
            $taxAmt             = $resArray["PAYMENTINFO_0_TAXAMT"];  // Tax charged on the transaction.
        //  $exchangeRate       = $resArray["PAYMENTINFO_0_EXCHANGERATE"];  // Exchange rate if a currency conversion occurred. Relevant only if your are billing in their non-primary currency. If the customer chooses to pay with a currency other than the non-primary currency, the conversion occurs in the customer's account.

            /*
             ' Status of the payment:
             'Completed: The payment has been completed, and the funds have been added successfully to your account balance.
             'Pending: The payment is pending. See the PendingReason element for more information.
             */

            $paymentStatus = $resArray["PAYMENTINFO_0_PAYMENTSTATUS"];

            /*
             'The reason the payment is pending:
             '  none: No pending reason
             '  address: The payment is pending because your customer did not include a confirmed shipping address and your Payment Receiving Preferences is set such that you want to manually accept or deny each of these payments. To change your preference, go to the Preferences section of your Profile.
             '  echeck: The payment is pending because it was made by an eCheck that has not yet cleared.
             '  intl: The payment is pending because you hold a non-U.S. account and do not have a withdrawal mechanism. You must manually accept or deny this payment from your Account Overview.
             '  multi-currency: You do not have a balance in the currency sent, and you do not have your Payment Receiving Preferences set to automatically convert and accept this payment. You must manually accept or deny this payment.
             '  verify: The payment is pending because you are not yet verified. You must verify your account before you can accept this payment.
             '  other: The payment is pending for a reason other than those listed above. For more information, contact PayPal customer service.
             */

            $pendingReason = $resArray["PAYMENTINFO_0_PENDINGREASON"];

            /*
             'The reason for a reversal if TransactionType is reversal:
             '  none: No reason code
             '  chargeback: A reversal has occurred on this transaction due to a chargeback by your customer.
             '  guarantee: A reversal has occurred on this transaction due to your customer triggering a money-back guarantee.
             '  buyer-complaint: A reversal has occurred on this transaction due to a complaint about the transaction from your customer.
             '  refund: A reversal has occurred on this transaction because you have given the customer a refund.
             '  other: A reversal has occurred on this transaction due to a reason not listed above.
             */

            $reasonCode = $resArray["PAYMENTINFO_0_REASONCODE"];

            // Add javascript to close Digital Goods frame. You may want to add more javascript code to
            // display some info message indicating status of purchase in the parent window
            ?>
    <html>
    <script>
    alert("Payment Successful");
    // add relevant message above or remove the line if not required
    window.onload = function(){
        if(window.opener){
             window.close();
         }
        else{
             if(top.dg.isOpen() == true){
                 top.dg.closeFlow();
                 return true;
              }
          }                              
    };

    </script>
    </html>
            <?php
        }
        else
        {
            //Display a user friendly Error on the page using any of the following error information returned by PayPal
            $ErrorCode = urldecode($resArray["L_ERRORCODE0"]);
            $ErrorShortMsg = urldecode($resArray["L_SHORTMESSAGE0"]);
            $ErrorLongMsg = urldecode($resArray["L_LONGMESSAGE0"]);
            $ErrorSeverityCode = urldecode($resArray["L_SEVERITYCODE0"]);

            echo "DoExpressCheckoutDetails API call failed. ";
            echo "Detailed Error Message: " . $ErrorLongMsg;
            echo "Short Error Message: " . $ErrorShortMsg;
            echo "Error Code: " . $ErrorCode;
            echo "Error Severity Code: " . $ErrorSeverityCode;
        ?>
    <html>
    <script>
    alert("Payment failed");
    // add relevant message above or remove the line if not required
    window.onload = function(){
        if(window.opener){
             window.close();
         }
        else{
             if(top.dg.isOpen() == true){
                 top.dg.closeFlow();
                 return true;
              }
          }                              
    };

    </script>
    </html>
    <?php 
        }
    }

    ?>

lightbox.php

        <!DOCTYPE html>
    <html>
    <head>
    <title>Digital Goods</title>
    </head>
    <body>

    <form id="myContainer" method="post" action="paypal/checkout.php">
        <img src="https://www.vanishingincmagic.co.uk/gallery/photos/the-modern-con-man.jpg">
        <p>$4.99</p>
        <p>Buy my totally not fake book!</p>
    </form>

    <script>window.paypalCheckoutReady=function(){paypal.checkout.setup('EMAIL-HERE',{environment:'sandbox',container:'myContainer'})};</script>
    <script src="//www.paypalobjects.com/api/checkout.js" async></script>
    </body>
    </html>

最佳答案

你调用 DoExpressCheckout 了吗?从您附加的代码中我可以看到您正在调用 SetExpressCheckout 但没有看到调用 DoExpressCheckout 的功能。可能您想试用示例 here

关于php - Paypal Express Checkout 不收费,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34113308/

相关文章:

javascript - 如何使用 jQuery POST 将 get 变量从 JavaScript 传递到 PHP Mysql

php - 查询 MySQL 以在 PHP 中显示用户帖子 - 不确定如何制定查询

javascript - 如何使用 node-fetch 模块模拟 curl 请求

c# - 奇怪的 paypal api 问题

paypal - 每个 PayPal IPN 中发送什么变量?

php - "use"语句通常应该引用 [完全限定] 类还是命名空间?

php - 从邮政编码查找完整地址,解决方案是什么?

php - RESTful Paypal API WebHooks 模拟器不适用于 Laravel

android - 在这里构建 paypal sdk 时出错

node.js - Paypal 付款已创建但从未执行