Paypal IPN PHP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jesper Veldhuijsen

Jesper Veldhuijsen

27/04/2014 20:54:49
Quote Anchor link
Hey,

Ik heb een paypal ipn geprobeerd te maken
Code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?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
 
PHP hulp

PHP hulp

30/11/2024 20:57:22
 
- Ariën  -
Beheerder

- Ariën -

27/04/2014 21:09:43
Quote Anchor link
Wordt er niet twee keer achter elkaar op een knop geklikt? Ik zou in ieder geval een sessie aanmaken na de betaling.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

27/04/2014 21:16:27
Quote Anchor link
Paypal verwacht dat je de ipn terugstuurt in de POST method. Om dit te realiseren heb je CURL nodig. Indien je dit niet doet zal paypal namelijk de IPN blijven herhalen.

Begin beter even opnieuw en neem dit voorbeeld als uitgangspunt:

https://gist.github.com/xcommerce-gists/3440401#file-completelistener-php
Gewijzigd op 27/04/2014 21:17:49 door Frank Nietbelangrijk
 
Jesper Veldhuijsen

Jesper Veldhuijsen

28/04/2014 14:05:42
Quote Anchor link
Ik heb dit stukje code:
Code (voorbeeld.php) (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?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';
}
        
?>


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?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

28/04/2014 16:15:25
Quote Anchor link
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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

28/04/2014 20:34:09
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.