Ho creato il tutto seguendo un tutorial, ecco il codice:

index.html
codice:
<form class="paypal" action="payments.php" method="post" id="paypal_form" target="_blank">    
	<input type="hidden" name="cmd" value="_xclick" /> 
    <input type="hidden" name="no_note" value="1" />
    <input type="hidden" name="lc" value="UK" />
    <input type="hidden" name="currency_code" value="EUR" />
    <input type="hidden" name="bn" value="PP-BuyNowBF:btn_buynow_LG.gif:NonHostedGuest" />
    <input type="hidden" name="first_name" value="Customer's First Name"  />
    <input type="hidden" name="last_name" value="Customer's Last Name"  />
    <input type="hidden" name="payer_email" value="customer@example.com"  />
    <input type="hidden" name="item_number" value="123456" / >
    <input type="submit"  value="Submit Payment"/>
</form>
payments.php
Codice PHP:
// Database variables
$host "localhost"//database location
$user "xxx"//database username
$pass "xxx"//database password
$db_name "xxx"//database name

// PayPal settings
$paypal_email 'paypal@example.com';
$return_url 'http://gaetanodemitri.altervista.org/pay/payment-successful.htm';
$cancel_url 'http://gaetanodemitri.altervista.org/pay/payment-cancelled.htm';
$notify_url 'http://gaetanodemitri.altervista.org/pay/payments.php';

$item_name 'Nome del prodotto';
$item_amount 1.00;

// Include Functions
include("functions.php");

//Database Connection
$link mysql_connect($host$user$pass);
mysql_select_db($db_name);


// Check if paypal request or response
if (!isset($_POST["txn_id"]) && !isset($_POST["txn_type"])){

    
// Firstly Append paypal account to querystring
    
$querystring .= "?business=".urlencode($paypal_email)."&";    
    
    
// Append amount& currency (£) to quersytring so it cannot be edited in html
    
    //The item name and amount can be brought in dynamically by querying the $_POST['item_number'] variable.
    
$querystring .= "item_name=".urlencode($item_name)."&";
    
$querystring .= "amount=".urlencode($item_amount)."&";
    
    
//loop for posted values and append to querystring
    
foreach($_POST as $key => $value){
        
$value urlencode(stripslashes($value));
        
$querystring .= "$key=$value&";
    }
    
    
// Append paypal return addresses
    
$querystring .= "return=".urlencode(stripslashes($return_url))."&";
    
$querystring .= "cancel_return=".urlencode(stripslashes($cancel_url))."&";
    
$querystring .= "notify_url=".urlencode($notify_url);
    
    
// Append querystring with custom field
    //$querystring .= "&custom=".USERID;
    
    // Redirect to paypal IPN
    
header('location:[url]https://www.sandbox.paypal.com/cgi-bin/webscr[/url]'.$querystring);
    exit();

}else{

    
// Response from Paypal

    // read the post from PayPal system and add 'cmd'
    
$req 'cmd=_notify-validate';
    foreach (
$_POST as $key => $value) {
        
$value urlencode(stripslashes($value));
        
$value preg_replace('/(.*[^%^0^D])(%0A)(.*)/i','${1}%0D%0A${3}',$value);// IPN fix
        
$req .= "&$key=$value";
    }
    
    
// assign posted variables to local variables
    
$data['item_name']            = $_POST['item_name'];
    
$data['item_number']         = $_POST['item_number'];
    
$data['payment_status']     = $_POST['payment_status'];
    
$data['payment_amount']     = $_POST['mc_gross'];
    
$data['payment_currency']    = $_POST['mc_currency'];
    
$data['txn_id']                = $_POST['txn_id'];
    
$data['receiver_email']     = $_POST['receiver_email'];
    
$data['payer_email']         = $_POST['payer_email'];
    
$data['custom']             = $_POST['custom'];
        
    
// post back to PayPal system to validate
    
$header "POST /cgi-bin/webscr HTTP/1.0\r\n";
    
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
    
$header .= "Content-Length: " strlen($req) . "\r\n\r\n";
    
    
$fp fsockopen ('ssl://www.sandbox.paypal.com'443$errno$errstr30);    
    
    if (!
$fp) {
        
// HTTP ERROR
    
} else {    
        
        
fputs ($fp$header $req);
        while (!
feof($fp)) {
            
$res fgets ($fp1024);
            if (
strcmp($res"VERIFIED") == 0) {
            
                
// Used for debugging
                
@mail("gaetano.demitri@gmail.com""PAYPAL DEBUGGING""Verified Response
data = <pre>"
.print_r($posttrue)."</pre>");
                        
                
// Validate payment (Check unique txnid & correct price)
                
$valid_txnid check_txnid($data['txn_id']);
                
$valid_price check_price($data['payment_amount'], $data['item_number']);
                
// PAYMENT VALIDATED & VERIFIED!
                
if($valid_txnid && $valid_price){        
                        
                    
$orderid updatePayments($data);        
                    if(
$orderid){    
                        echo 
"Payment has been made & successfully inserted into the Database";                    
                    }else{                                
                        echo 
"Error inserting into DB";
                        
// E-mail admin or alert user
                    
}
                }else{                    
                    
// Payment made but data has been changed
                    // E-mail admin or alert user
                
}                        
            
            }else if (
strcmp ($res"INVALID") == 0) {
            
                
// PAYMENT INVALID & INVESTIGATE MANUALY! 
                // E-mail admin or alert user
                
                // Used for debugging
                
@mail("gaetano.demitri@gmail.com""PAYPAL DEBUGGING""Invalid Response
data = <pre>"
.print_r($posttrue)."</pre>");
            }        
        }        
    
fclose ($fp);
    }    

Funziona tutto perfettamente, però c'è un problema.

Non mi inserisce i record all'interno della tabella "payments" presente nel database "my_gaetanodemitri". Non riesco a capire il perchè.

functions.php
Codice PHP:
// functions.php
function check_txnid($tnxid){
    global 
$link;
    return 
true;
    
$valid_txnid true;
    
//get result set
    
$sql mysql_query("SELECT * FROM `payments` WHERE txnid = '$tnxid'"$link);        
    if(
$row mysql_fetch_array($sql)) {
        
$valid_txnid false;
    }
    return 
$valid_txnid;
}

function 
check_price($price$id){
    
$valid_price false;
    
//you could use the below to check whether the correct price has been paid for the product
    
    /* 
    $sql = mysql_query("SELECT amount FROM `products` WHERE id = '$id'");        
    if (mysql_numrows($sql) != 0) {
        while ($row = mysql_fetch_array($sql)) {
            $num = (float)$row['amount'];
            if($num == $price){
                $valid_price = true;
            }
        }
    }
    return $valid_price;
    */
    
return true;
}

function 
updatePayments($data){    
    global 
$link;
    if(
is_array($data)){                
        
$sql mysql_query("INSERT INTO `payments` (txnid, payment_amount, payment_status, itemid, createdtime) VALUES (
                '"
.$data['txn_id']."' ,
                '"
.$data['payment_amount']."' ,
                '"
.$data['payment_status']."' ,
                '"
.$data['item_number']."' ,
                '"
.date("Y-m-d H:i:s")."' 
                )"
$link);
    return 
mysql_insert_id($link);
    }

Praticamente la primva volta lui entra nel primo if, presente in payments.php
codice:
if (!isset($_POST["txn_id"]) && !isset($_POST["txn_type"])){
Però dopo non riesce più ad andare nell'else una volta che vengono settate "txn_id" e "txn_type", come posso risolvere questa cosa?