Paypal IPN PHP
Ik heb een paypal ipn geprobeerd te maken
Code:
Code (php)
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
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!';
}
}
?>
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.
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
Code (voorbeeld.php) (php)
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
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';
}
?>
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?
- 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.
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.