Hey,

Ik heb een paypal ipn geprobeerd te maken
Code:

<?php
include('../config.php');
$url      = 'https://www.paypal.com/cgi-bin/webscr';
$postdata = '';
foreach ($_POST as $i => $v) {
    $postdata .= $i . '=' . urlencode($v) . '&';
}
$postdata .= 'cmd=_notify-validate';
$web = parse_url($url);
if ($web['scheme'] == 'https') {
    $web['port'] = 443;
    $ssl         = 'ssl://';
} else {
    $web['port'] = 80;
    $ssl         = '';
}
$fp = @fsockopen($ssl . $web['host'], $web['port'], $errnum, $errstr, 30);
if (!$fp) {
    echo $errnum . ': ' . $errstr;
} else {
    fputs($fp, "POST " . $web['path'] . " HTTP/1.1\r\n");
    fputs($fp, "Host: " . $web['host'] . "\r\n");
    fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
    fputs($fp, "Content-length: " . strlen($postdata) . "\r\n");
    fputs($fp, "Connection: close\r\n\r\n");
    fputs($fp, $postdata . "\r\n\r\n");
    while (!feof($fp)) {
        $info[] = @fgets($fp, 1024);
    }
    fclose($fp);
    $info = implode(',', $info);
    # If statement of de betaling verified is.
    if (preg_match("/VERIFIED/", $info)) {
        # Betaling geldig -> Voorbeeld:
        $username    = 'jespar';                 
        $apicode     = 'AAAA';                  
        $testmode    = true;                
        $admin_mail  = '[email protected]';  
        $jouw_domein = ''; 
        $return = file_get_contents('http://www.one2xs.com/api/bestel/handle?user='.$username.'&key='.sha1($apicode).'&product=mc&type=1024&whitelabel=2&testmode='.($testmode == true ? 1 : 0).'&whitelabel_server='.$jouw_domein);
    
        $return = new SimpleXMLElement($return);
        
        if(isset($return->error))
        {
            $mysql->query("INSERT INTO paylog(ip, pakket, datum, status) VALUES('".$_SERVER['REMOTE_ADDR']."', '1024', '".date("Y-m-d H:i:s")."', 'niet gelukt')");
            mail($admin_mail, 'Fout in de API', 'Een bezoeker met IP '.$_SERVER['REMOTE_ADDR'].' probeerde op '.date('d-m-Y H:i:s').' een server te bestellen, maar de API gaf dit terug: '.$return->error);
            
        }
        else
        {
            $mysql->query("INSERT INTO paylog(ip, pakket, datum, status) VALUES('".$_SERVER['REMOTE_ADDR']."', '1024', '".date("Y-m-d H:i:s")."', 'gelukt')");
            $mysql->query("INSERT INTO buys(locatie, user, pass, email) VALUES('".$return->channel->panel_location."', '".$return->channel->panel_user."', '".$return->channel->panel_pass."', '".$mysql->real_escape_string($_POST['os0'])."')");
        }
    } else {
        # Bezoeker komt op deze pagina en er is geen betaling gedaan. -> Toegang geweigerd, voorbeeld:
        echo 'Je mag deze pagina niet bekijken!';
    }
}


        
?>

Alleen als iemand betaald, krijgt hij 2 servers en 2 items in de log?!?!

hoe los ik het op
als er meer informatie nodig is dan hoor ik het wel.

Jesper
Wordt er niet twee keer achter elkaar op een knop geklikt? Ik zou in ieder geval een sessie aanmaken na de betaling.
Ik heb dit stukje code:
[code s=1 highlight=yes file=voorbeeld.php]<?php
include('../config.php');
// STEP 1: read POST data

// Reading POSTed data directly from $_POST causes serialization issues with array data in the POST.
// Instead, read raw POST data from the input stream.
$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$myPost = array();
foreach ($raw_post_array as $keyval) {
$keyval = explode ('=', $keyval);
if (count($keyval) == 2)
$myPost[$keyval[0]] = urldecode($keyval[1]);
}
// read the IPN message sent from PayPal and prepend 'cmd=_notify-validate'
$req = 'cmd=_notify-validate';
if(function_exists('get_magic_quotes_gpc')) {
$get_magic_quotes_exists = true;
}
foreach ($myPost as $key => $value) {
if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
$value = urlencode(stripslashes($value));
} else {
$value = urlencode($value);
}
$req .= "&$key=$value";
}


// STEP 2: POST IPN data back to PayPal to validate

$ch = curl_init('https://www.paypal.com/cgi-bin/webscr';);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));

// In wamp-like environments that do not come bundled with root authority certificates,
// please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set
// the directory path of the certificate as shown below:
// curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
if( !($res = curl_exec($ch)) ) {
// error_log("Got " . curl_error($ch) . " when processing IPN data");
curl_close($ch);
exit;
}
curl_close($ch);


// STEP 3: Inspect IPN validation result and act accordingly

if (strcmp ($res, "VERIFIED") == 0) {
// The IPN is verified, process it:
// check whether the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your Primary PayPal email
// check that payment_amount/payment_currency are correct
// process the notification

// assign posted variables to local variables
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];

// IPN message values depend upon the type of notification sent.
// To loop through the &_POST array and print the NV pairs to the screen:

$username = 'jespar';
$apicode = 'xT';
$testmode = true;
$admin_mail = '[email protected]';
$jouw_domein = '';
$return = file_get_contents('http://www.one2xs.com/api/bestel/handle?user='.$username.'&key='.sha1($apicode).'&product=mc&type=1024&whitelabel=2&testmode='.($testmode == true ? 1 : 0).'&whitelabel_server='.$jouw_domein);

$return = new SimpleXMLElement($return);

if(isset($return->error))
{
$mysql->query("INSERT INTO paylog(ip, pakket, datum, status) VALUES('".$_SERVER['REMOTE_ADDR']."', '1024', '".date("Y-m-d H:i:s")."', 'niet gelukt')");
mail($admin_mail, 'Fout in de API', 'Een bezoeker met IP '.$_SERVER['REMOTE_ADDR'].' probeerde op '.date('d-m-Y H:i:s').' een server te bestellen, maar de API gaf dit terug: '.$return->error);

}
else
{
$mysql->query("INSERT INTO paylog(ip, pakket, datum, status) VALUES('".$_SERVER['REMOTE_ADDR']."', '1024', '".date("Y-m-d H:i:s")."', 'gelukt')");
$mysql->query("INSERT INTO buys(locatie, user, pass, email) VALUES('".$return->channel->panel_location."', '".$return->channel->panel_user."', '".$return->channel->panel_pass."', '".$mysql->real_escape_string($_POST['os0'])."')");
}

} else if (strcmp ($res, "INVALID") == 0) {
// IPN invalid, log for manual investigation
echo "The response from IPN was: <b>" .$res ."</b>";
} else {
echo 'Onbekende error';
}
?>[/code]

Wanneer de betaling gelukt is word er een server aangemaakt, maar na een aantal seconden gebeurt dit weer en nog een keer. Ik weet niet waar het aanligt misschien dat paypal vaker VERIFIED terug stuurt?
Je zult ten aller tijden natuurlijk moeten bijhouden of een levering al gedaan is. de Transaction-id is een unieke sleutel. Je zult dus in je database de volgende dingen moeten controleren:

- of de transaction-id al voorkomt ja of nee.
- als de transaction-id voorkomt of de kolom 'geleverd' TRUE or FALSE is
- of de payment_status juist is


als alles ok is dan leveren en anders kun je de ipn vergeten.
Na levering zet je vervolgens direct de kolom 'geleverd' op TRUE.
Je moet je realiseren dat het script vanuit PayPal wordt aangeroepen. Dus die echo's hebben geen zin en leiden waarschijnlijk ook tot het meerdere keren aanroepen van het script.
Paypal

After receiving the IPN message from PayPal, your listener should return an empty HTTP 200 response to PayPal. PayPal will resend the IPN if you do not send an empty HTTP 200 response

Daarnaast denk ik dat je een (grote) vergissing begaat door te denken dat 'VERIFIED' betekent dat de betaling gelukt is.

Reageren