Search code examples
phppaypal-ipn

Passing data to paypal IPN using option_select


I have a question about passing paypal data from the form to the IPN.

What i'm trying to do is making a select field with different options where the donator can choose from. And every option needs to be handled differently in the IPN.

Since the prices are the same, but the handling is different on every item i cannot use this code anymore

$amount = $p->ipn_data['mc_gross'] - $p->ipn_data['mc_fee'];
$donateamount = 5;
$donateamount2 = 10;

if($amount == $donateamount){
//custom code
}

if($amount == $donateamount2){
//custom code
}
ETC........

Here is a example from my current form code:

<html>
    <head>
    </head>
<body>
<?php
// The PayPal enchant Donation option list
 echo '<form action="'.$payPalURL.'" method="post" class="payPalForm">';
 echo '<input type="hidden" name="cmd" value="_xclick" />';
 echo '<input type="hidden" name="item_name" value="Donation" />';

 echo '<input type="hidden" name="custom" value="'.$charname.'">';

 //Your PayPal email
 echo '<input type="hidden" name="business" value="'.$myPayPalEmail.'" />';

 // PayPal will send an IPN notification to this URL
 echo '<input type="hidden" name="notify_url" value="'.$urlipn.'/ipn_itemenc.php" />';

 // The return page to which the user is navigated after the donations is complete
 echo '<input type="hidden" name="return" value="'.$urlthx.'/thankyou.php" />';

 // Signifies that the transaction data will be passed to the return page by POST
 echo '<input type="hidden" name="rm" value="2" /> ';


 // General configuration variables for the paypal landing page. Consult';
 // http://www.paypal.com/IntegrationCenter/ic_std-variable-ref-donate.html for more info
 echo '<input type="hidden" name="no_note" value="1" />';
 echo '<input type="hidden" name="cbt" value="Go Back To The Site" />';
 echo '<input type="hidden" name="no_shipping" value="1" />';
 echo '<input type="hidden" name="lc" value="US" />';
 echo '<input type="hidden" name="currency_code" value="USD" />';

 echo '<center>';
 echo '<table>';
 echo '<tr><td><input type="hidden" name="on0" value="enchant">enchant</td></tr><tr><td>';
 echo '<select name="os0">';
 echo '<option value="+18 helmet">+18 helmet $10.00</option>';
 echo '<option value="+18 Breastplate">+18 Breastplate $10.00</option>';
 echo '<option value="+18 Leggings">+18 Leggings $10.00</option>';
 echo '<option value="+18 Full armor">+18 Full armor $10.00</option>';
 echo '<option value="+18 Gloves">+18 Gloves $10.00</option>';
 echo '<option value="+18 Boots">+18 Boots $10.00</option>';
 echo '<option value="+18 Weapon">+18 Weapon $10.00</option>';
 echo '<option value="+18 Shield">+18 Shield $10.00</option>';
 echo '<option value="+18 Shirt">+18 Shirt $10.00</option>';
 echo '<option value="+18 Belt">+18 Belt $10.00</option>';
 echo '<option value="+18 Necklace">+18 Necklace $10.00</option>';
 echo '<option value="+18 Lower earring">+18 Lower earring $10.00</option>';
 echo '<option value="+18 Upper earring">+18 Upper earring $10.00</option>';
 echo '<option value="+18 Lower ring">+18 Lower ring $10.00</option>';
 echo '<option value="+18 Upper ring">+18 Upper ring $10.00</option>';

 echo '</select> </td></tr>';

 echo '<input type="hidden" name="option_index" value="0">';
 echo '<input type="hidden" name="option_select0" value="+18 helmet">';
 echo '<input type="hidden" name="option_amount0" value="10.00">';
 echo '<input type="hidden" name="option_select1" value="+18 Breastplate">';
 echo '<input type="hidden" name="option_amount1" value="10.00">';
 echo '<input type="hidden" name="option_select2" value="+18 Leggings">';
 echo '<input type="hidden" name="option_amount2" value="10.00">';
 echo '<input type="hidden" name="option_select3" value="+18 Full armor">';
 echo '<input type="hidden" name="option_amount3" value="10.00">';
 echo '<input type="hidden" name="option_select4" value="+18 Gloves">';
 echo '<input type="hidden" name="option_amount4" value="10.00">';
 echo '<input type="hidden" name="option_select5" value="+18 Boots">';
 echo '<input type="hidden" name="option_amount5" value="10.00">';
 echo '<input type="hidden" name="option_select6" value="+18 Weapon">';
 echo '<input type="hidden" name="option_amount6" value="10.00">';
 echo '<input type="hidden" name="option_select7" value="+18 Shield">';
 echo '<input type="hidden" name="option_amount7" value="10.00">';
 echo '<input type="hidden" name="option_select8" value="+18 Shirt">';
 echo '<input type="hidden" name="option_amount8" value="10.00">';
 echo '<input type="hidden" name="option_select9" value="+18 Belt">';
 echo '<input type="hidden" name="option_amount9" value="10.00">';
 echo '<input type="hidden" name="option_select10" value="+18 Necklace">';
 echo '<input type="hidden" name="option_amount10" value="10.00">';
 echo '<input type="hidden" name="option_select11" value="+18 Lower earring">';
 echo '<input type="hidden" name="option_amount11" value="10.00">';
 echo '<input type="hidden" name="option_select12" value="+18 Upper earring">';
 echo '<input type="hidden" name="option_amount12" value="10.00">';
 echo '<input type="hidden" name="option_select13" value="+18 Lower ring">';
 echo '<input type="hidden" name="option_amount13" value="10.00">';
 echo '<input type="hidden" name="option_select14" value="+18 Upper ring">';
 echo '<input type="hidden" name="option_amount14" value="10.00">';

 echo '</center>';
 echo '</table>';

 //Here you can change the image of the enchant donation button 
 echo '<input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donate_LG.gif" name="submit" alt="PayPal - The safer, easier way to pay online!" />';
 echo '<img alt="" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1" />';
 echo '<input type="hidden" name="bn" value="PP-DonationsBF:btn_donate_LG.gif:NonHostedGuest" />';
 echo '</form>';
?>
</body>
</html>

And this is what i try to accomplish in the IPN.

example IPN:

<?php

require "../paypal_integration_class/paypal.class.php";
require "../config.php";
require "../connect.php";

$p = new paypal_class;
$p->paypal_url = $payPalURL;

if ($p->validate_ipn()) {

    if($p->ipn_data['payment_status']=='Completed') 
    {
        $amount = $p->ipn_data['mc_gross'] - $p->ipn_data['mc_fee'];

        //here we will make a log of all the donations after the payment status is complete
        mysqli_query($link, "   INSERT INTO dc_donations (transaction_id,donor_email,amount,original_request)
                        VALUES (
                            '".esc($p->ipn_data['txn_id'])."',
                            '".esc($p->ipn_data['payer_email'])."',
                            ".(float)$amount.",
                            '".esc(http_build_query($_POST))."'
                        )");
    //get character name from paypal ipn data
    $custom = $p->ipn_data['custom'];

// define the value from the donation options
$enchelmet = '+18 helmet';
$encbreastplate = '+18 Breastplate';
$encleggings = '+18 Leggings';
$encfullarmor = '+18 Full armor';
$encgloves = '+18 Gloves';
$encboots = '+18 Boots';
$encweapon = '+18 Weapon';
$encshield = '+18 Shield';
$encshirt = '+18 Shirt';
$encbelt = '+18 Belt';
$encnecklace = '+18 Necklace';
$enclowearring = '+18 Lower earring';
$encupearring = '+18 Upper earring';
$enclowring = '+18 Lower ring';
$encupring = '+18 Upper ring';

    // gets the value from the form
    $gethelmet = $p->ipn_data['option_select0'];
    $getbreastplate = $p->ipn_data['option_select1'];
    $getleggings = $p->ipn_data['option_select2'];
    $getfullarmor = $p->ipn_data['option_select3'];
    $getgloves = $p->ipn_data['option_select4'];
    $getboots = $p->ipn_data['option_select5'];
    $getweapon = $p->ipn_data['option_select6'];
    $getshield = $p->ipn_data['option_select7'];
    $getshirt = $p->ipn_data['option_select8'];
    $getbelt = $p->ipn_data['option_select9'];
    $getnecklace = $p->ipn_data['option_select10'];
    $getlowearring = $p->ipn_data['option_select11'];
    $getupearring = $p->ipn_data['option_select12'];
    $getlowring = $p->ipn_data['option_select13'];
    $getupring = $p->ipn_data['option_select14'];

    //Get the Charid given according to the char_name
    $sql    = "SELECT charId FROM characters WHERE char_name='".$custom."'";
    $result     = mysqli_query($link, $sql);
    $total      = mysqli_num_rows($result);

// checks if the caracter still exsists.
if($total>0){

    // Enchant helmet
    if($enchelmet == $gethelmet){

        // run custom script
}

    // Enchant breastplate
    if($encbreastplate == $getbreastplate){

    // run custom script
}

    // Enchant leggings
    if($encleggings == $getleggings){

    // run custom script
}

    // Enchant full armor
    if($encfullarmor == $getfullarmor){

    // run custom script
}

    // Enchant gloves
    if($encgloves == $getgloves){

    // run custom script
}

    // Enchant boots
    if($encboots == $getboots){

    // run custom script
}

    // Enchant weapon
    if($encweapon == $getweapon){

    // run custom script
}

    // Enchant shield
    if($encshield == $getshield){

    // run custom script
}

    // Enchant shirt
    if($encshirt == $getshirt){

    // run custom script
}

    // Enchant belt
    if($encbelt == $getbelt){

    // run custom script
}

    // Enchant necklace
    if($encnecklace == $getnecklace){

    // run custom script
}

    // Enchant lower earring
    if($enclowearring == $getlowearring){

    // run custom script
}

    // Enchant upper earring
    if($encupearring == $getupearring){

    // run custom script
}

    // Enchant lower ring
    if($enclowring == $getlowring){

    // run custom script
}

    // Enchant upper ring
    if($encupring == $getupring){

    // run custom script
}

    }
}
}


function esc($str)
{
    global $link;
    return mysqli_real_escape_string($link, $str);
}
?>

My question: is this the correct way to request such data ?

$gethelmet = $p->ipn_data['option_select0'];

Or will this never work ?

If so, what is the best solution that i can try to accomplish this ?

Thanks in advance.


Solution

  • The docs say you can use the parameter custom to pass custom data (max length=255) https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNandPDTVariables/

    Depending on your situation you could also pass a custom notify_url and pass any data you wanted in the IPN url.

    P.S. Holy echo's batman.