Passing price variable to PayPal with custom button

前端 未结 8 1048
长情又很酷
长情又很酷 2020-12-07 21:26

I have a form and a custom PayPal button, but how do I pass the value/price variable to PayPal?

相关标签:
8条回答
  • 2020-12-07 21:27

    The previous code did not work for me. After much headache I finally figured out you have to go into PayPal and on step 2 of creating the button code make sure you click the unhosted button, and then copy the unencrypted button code, which will give you something like this (I blanked out my business value for security):

    <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
        <input type="hidden" name="cmd" value="_xclick">
        <input type="hidden" name="business" value="XXX">
        <input type="hidden" name="lc" value="CA">
        <input type="hidden" name="item_name" value="Tangled Roots">
        <input type="hidden" name="button_subtype" value="services">
        <input type="hidden" name="no_note" value="0">
        <input type="hidden" name="cn" value="Add special instructions to the seller">
        <input type="hidden" name="no_shipping" value="2">
        <input name="amount" value="16.99">
        <input type="hidden" name="currency_code" value="CAD">
        <input type="hidden" name="bn" value="PP-BuyNowBF:btn_buynowCC_LG.gif:NonHosted">
        <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
        <img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
    </form>
    

    This code creates a button where the user can input the amount, which by default starts at 16.99, but you could just as easily replace that with a PHP variable.

    0 讨论(0)
  • 2020-12-07 21:27

    Here is one that allows the user to enter a price and reference.

    NOTE: You'll need to change business from shop@ekerner.com to your PayPal email address, but its fine by me if you don't because it just means that I will receive your payments.

    You may also like to change currency_code and lc to suit your locale ...

                            <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
                                <fieldset>
                                    <input type="hidden" name="cmd" value="_xclick" />
                                    <input type="hidden" name="business" value="shop@ekerner.com" />
                                    <input type="hidden" name="lc" value="AU" />
                                    <input type="hidden" name="item_name" value="Payment" />
                                    <input type="hidden" name="item_number" value="P1" />
                                    <input type="hidden" name="currency_code" value="AUD" />
                                    <input type="hidden" name="button_subtype" value="services" />
                                    <input type="hidden" name="no_note" value="0" />
                                    <input type="hidden" name="cn" value="Comments" />
                                    <input type="hidden" name="no_shipping" value="1" />
                                    <input type="hidden" name="rm" value="1" />
                                    <input type="hidden" name="return" value="http://www.ekerner.com/payments/?payment=success" />
                                    <input type="hidden" name="cancel_return" value="http://www.ekerner.com/payments/?payment=cancelled" />
                                    <input type="hidden" name="bn" value="PP-BuyNowBF:btn_paynowCC_LG.gif:NonHostedGuest" />
                                    <table>
                                            <tr><td style="padding:0 5px 5px 0;">Amount AUD</td><td style="padding:0 5px 5px 0;"><input type="text" name="amount" maxlength="200" /></td></tr>
                                            <tr><td style="padding:0 5px 5px 0;"><input type="hidden" name="on0" value="Reference" />Reference</td><td style="padding:0 5px 5px 0;"> <input type="text" name="os0" maxlength="200" /></td></tr>
                                            <tr><td>&nbsp;</td><td style="padding:0 5px 5px 0;">
                                                    <input style="position:relative; left:-10px; background:#ffffff; border:0;" type="image" src="https://www.paypalobjects.com/en_AU/i/btn/btn_paynowCC_LG.gif" name="submit" alt="PayPal . The safer, easier way to pay online." />
                                                    <img alt="" style="border:0;" src="https://www.paypalobjects.com/en_AU/i/scr/pixel.gif" width="1" height="1" />
                                            </td></tr>
                                    </table>
                                </fieldset>
                            </form>
    
    0 讨论(0)
  • 2020-12-07 21:29

    Add one more hidden field for amount

    <input type="hidden" name="amount" value="<?php echo $total; ?>">
    
    0 讨论(0)
  • 2020-12-07 21:37

    I found the solution:

    <input type="hidden" name="cmd" value="_s-xclick">
    

    needs to be changed to

    <input type="hidden" name="cmd" value="_xclick">
    

    The first encrypts the data sent by the form - which caused the issue with my checkout.

    0 讨论(0)
  • 2020-12-07 21:39

    Unfortunately at the time of writing, all of the other answers to this question are incorrect - that is if you're trying to change the price of a hosted button; which is what the question was about.

    The correct way to do this is below:

    Important Notes: When you update the button details, it isn't just updated for that users session, it updates it within your paypal account - so the new name/price etc will affect all users that attempt to use it.

    Also, be advised when altering the contents of a hosted button you need to pass all the details of the button to it as when you created it; so as an example, if you leave out passing it an item name the item name will be blank and Paypal will allow the user to set it.

    On that note, we shall continue..

    I personally started with this class:

    <?php
    
    class Paypal
    {
        /**
         * Last error message(s)
         * @var array
         */
        protected $_errors = array();
    
        /**
         * API Credentials
         * Use the correct credentials for the environment in use (Live / Sandbox)
         * @var array
         */
        protected $_credentials = array(
            'USER' => 'seller_1297608781_biz_api1.lionite.com',
            'PWD' => '1297608792',
            'SIGNATURE' => 'A3g66.FS3NAf4mkHn3BDQdpo6JD.ACcPc4wMrInvUEqO3Uapovity47p',
        );
    
        /**
         * API endpoint
         * Live - https://api-3t.paypal.com/nvp
         * Sandbox - https://api-3t.sandbox.paypal.com/nvp
         * @var string
         */
        protected $_endPoint = 'https://api-3t.sandbox.paypal.com/nvp';
    
        /**
         * API Version
         * @var string
         */
        protected $_version = '74.0';
    
        /**
         * Make API request
         *
         * @param string $method string API method to request
         * @param array $params Additional request parameters
         * @return array / boolean Response array / boolean false on failure
         */
        public function request($method, $params = array())
        {
            $this->_errors = array();
            if (empty($method)) { //Check if API method is not empty
                $this->_errors = array('API method is missing');
                return false;
            }
    
            //Our request parameters
            $requestParams = array(
                    'METHOD' => $method,
                    'VERSION' => $this->_version
                ) + $this->_credentials;
    
            //Building our NVP string
            $request = http_build_query($requestParams + $params);
    
            //cURL settings
            $curlOptions = array(
                CURLOPT_URL => $this->_endPoint,
                CURLOPT_VERBOSE => 1,
                CURLOPT_SSL_VERIFYPEER => true,
                CURLOPT_SSL_VERIFYHOST => 2,
                CURLOPT_CAINFO => dirname(__FILE__) . '/cacert.pem', //CA cert file
                CURLOPT_RETURNTRANSFER => 1,
                CURLOPT_POST => 1,
                CURLOPT_POSTFIELDS => $request
            );
    
            $ch = curl_init();
            curl_setopt_array($ch, $curlOptions);
    
            //Sending our request - $response will hold the API response
            $response = curl_exec($ch);
    
            //Checking for cURL errors
            if (curl_errno($ch)) {
                $this->_errors = curl_error($ch);
                curl_close($ch);
                return false;
                //Handle errors
            } else {
                curl_close($ch);
                $responseArray = array();
                parse_str($response, $responseArray); // Break the NVP string to an array
                return $responseArray;
            }
        }
    }
    
    ?>
    

    Credit: https://www.smashingmagazine.com/2011/09/getting-started-with-the-paypal-api/

    Then I did the below:

    include(dirname(__FILE__) . '/includes/paypal.class.php');
    
    $paypal = new Paypal();
    
    // Set our method
    $method = 'BMUpdateButton';
    
    // Set our params
    $params = array(
        'HOSTEDBUTTONID' => 'your_button_id',
        'BUTTONTYPE' => 'BUYNOW',
        'BUTTONSUBTYPE' => 'SERVICES',
        'L_BUTTONVAR0' => 'item_name=Your Description',
        'L_BUTTONVAR1' => 'amount=999.00',
        'L_BUTTONVAR2' => 'currency_code=AUD',
        'L_BUTTONVAR3' => 'cancel_return=http://www.example.com/cancel.html',
        'L_BUTTONVAR4' => 'return=http://www.example.com/success.html'
    );
    
    // Make request to change button details
    $result = $paypal->request($method, $params);
    

    Note that while Paypal say that BUTTONSUBTYPE is optional, you will likely get an error if you don't include it.

    Unfortunately the Paypal docs aren't very clear and don't provide the greatest examples, so I hope this saves someone else the many hours I spent finding out how to do this.

    0 讨论(0)
  • 2020-12-07 21:45

    Although an old post, it came across me when searching. And there is nowhere on the first pages that answers the question! Reading for about 10 hours, I managed to make a working example. But remember that paypal is constantly changing, so at some point this solution will not work anymore.

    First things first. You cannot ever have a variable price value for an item. So, the first workaround is to send a request as if the item is a total in your cart! Yep, smart move :)

    <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
        <input type="hidden" name="cmd" value="_cart">
        <input type="hidden" name="upload" value="1">
        <input type="hidden" name="business" value="XVR95QDG6M53J">
        <input type="hidden" name="item_name_1" value="This is the name of what you are selling">
        <input type="hidden" name="amount_1" value="<?php echo $total_cost; ?>">
        <input type="hidden" name="currency_code" value="the currency code">
        <input type="hidden" name="lc" value="if you dont need delete">
        <input type="hidden" name="shopping_url" value="link to your shop or cart on your website">
        <input type="hidden" name="retun" value="URL the user returns if payment is OK">
        <input type="hidden" name="cancel_return" value="URL the user returns if payment is canceled">
        <input type="submit" class="read-more-btn4" value="Text of [read more] button">
    </form>
    

    You may want to change the value of business to yours. But I don't really care :)

    0 讨论(0)
提交回复
热议问题