Advertisement
Guest User

IPN SCRIPT

a guest
May 12th, 2013
1,026
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.23 KB | None | 0 0
  1. <?php
  2. header('Content-type: text/html; charset=utf-8');
  3. ?>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <?php
  6. // tell PHP to log errors to ipn_errors.log in this directory
  7. ini_set('log_errors', true);
  8. ini_set('error_log', dirname(__FILE__).'/ipn_errors.log');
  9.  
  10. // intantiate the IPN listener
  11. include('ipnlistener.php');
  12. $listener = new IpnListener();
  13.  
  14. // For sandbox testing
  15. //$pp_hostname = "www.sandbox.paypal.com";
  16.  
  17. //live
  18. $pp_hostname = "www.paypal.com";
  19.  
  20. // tell the IPN listener to use the PayPal test sandbox
  21. //$listener->use_sandbox = true;
  22.  
  23. // try to process the IPN POST
  24. try {
  25.     $listener->requirePostMethod();
  26.     $verified = $listener->processIpn();
  27. } catch (Exception $e) {
  28.     error_log($e->getMessage());
  29.     exit(0);
  30. }
  31.  
  32. if ($verified) {
  33.     $errmsg = '';   // stores errors from fraud checks
  34.    
  35.     // 1. Make sure the payment status is "Completed"
  36.     if ($_POST['payment_status'] != 'Completed') {
  37.         // simply ignore any IPN that is not completed
  38.         exit(0);
  39.     }
  40.  
  41.     // 2. Make sure seller email matches your primary account email.
  42.     if ($_POST['receiver_email'] != 'anna@energyshop.se') {
  43.         $errmsg .= "'receiver_email' does not match: ";
  44.         $errmsg .= $_POST['receiver_email']."\n";
  45.     }
  46.  
  47.     // 3. Make sure the currency code matches
  48.     if ($_POST['mc_currency'] != 'SEK' && $_POST['mc_currency'] != 'USD') {
  49.         $errmsg .= "'mc_currency' does not match: ";
  50.         $errmsg .= $_POST['mc_currency']."\n";
  51.     }
  52.  
  53.     // 4. Ensure the transaction is not a duplicate.
  54.     mysql_connect('energyshop.se.mysql', 'energyshop_se', 'dxymNrJd') or exit(0);
  55.     mysql_select_db('energyshop_se') or exit(0);
  56.  
  57.     $txn_id = mysql_real_escape_string($_POST['txn_id']);
  58.     $sql = "SELECT COUNT(*) FROM orders WHERE txn_id = '$txn_id'";
  59.     $r = mysql_query($sql);
  60.    
  61.     if (!$r) {
  62.         error_log(mysql_error());
  63.         exit(0);
  64.     }
  65.    
  66.     $exists = mysql_result($r, 0);
  67.     mysql_free_result($r);
  68.    
  69.     if ($exists) {
  70.         $errmsg .= "'txn_id' has already been processed: ".$_POST['txn_id']."\n";
  71.     }
  72.    
  73.     if (!empty($errmsg)) {
  74.    
  75.         // manually investigate errors from the fraud checking
  76.         $body = "IPN failed fraud checks: \n$errmsg\n\n";
  77.         $body .= $listener->getTextReport();
  78.         mail('anna@energyshop.se', 'IPN Fraud Warning', $body);
  79.        
  80.     } else {
  81.    
  82.     // add this order to a table of completed orders
  83.     $payer_email = mysql_real_escape_string($_POST['payer_email']);
  84.     $mc_gross = mysql_real_escape_string($_POST['mc_gross']);
  85.     $sql = "INSERT INTO orders VALUES
  86.            (NULL, '$txn_id', '$payer_email', $mc_gross)";
  87.    
  88.     if (!mysql_query($sql)) {
  89.         error_log(mysql_error());
  90.         exit(0);
  91.     }}}
  92. // STEP 1: Read POST data
  93.  
  94. // reading posted data from directly from $_POST causes serialization
  95. // issues with array data in POST
  96. // reading raw POST data from input stream instead.
  97. $raw_post_data = file_get_contents('php://input');
  98. $raw_post_array = explode('&', $raw_post_data);
  99. $myPost = array();
  100. foreach ($raw_post_array as $keyval) {
  101.   $keyval = explode ('=', $keyval);
  102.   if (count($keyval) == 2)
  103.      $myPost[$keyval[0]] = urldecode($keyval[1]);
  104. }
  105. // read the post from PayPal system and add 'cmd'
  106. $req = 'cmd=_notify-validate';
  107. if(function_exists('get_magic_quotes_gpc')) {
  108.    $get_magic_quotes_exists = true;
  109. }
  110. foreach ($myPost as $key => $value) {        
  111.    if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
  112.         $value = urlencode(stripslashes($value));
  113.    } else {
  114.         $value = urlencode($value);
  115.    }
  116.    $req .= "&$key=$value";
  117. }
  118.  
  119.  
  120. // STEP 2: Post IPN data back to paypal to validate
  121.  
  122. $ch = curl_init();
  123. curl_setopt($ch, CURLOPT_URL, "https://www.paypal.com/cgi-bin/webscr");
  124. curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
  125. curl_setopt($ch, CURLOPT_POST, 1);
  126. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  127. curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
  128. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
  129. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
  130. curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
  131. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
  132.  
  133. // In wamp like environments that do not come bundled with root authority certificates,
  134. // please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set the directory path
  135. // of the certificate as shown below.
  136. // curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
  137. if( !($res = curl_exec($ch)) ) {
  138.     error_log("Got " . curl_error($ch) . " when processing IPN data");
  139.     curl_close($ch);
  140.     exit;
  141. }
  142. curl_close($ch);
  143.  
  144.  
  145. // STEP 3: Inspect IPN validation result and act accordingly
  146.  
  147. if (strcmp ($res, "VERIFIED") == 0) {
  148.     // check whether the payment_status is Completed
  149.     // check that txn_id has not been previously processed
  150.     // check that receiver_email is your Primary PayPal email
  151.     // check that payment_amount/payment_currency are correct
  152.     // process payment
  153.  
  154.     // assign posted variables to local variables
  155.     $item_name = $_POST['item_name'];
  156.     $item_number = $_POST['item_number'];
  157.     $payment_status = $_POST['payment_status'];
  158.     $payment_amount = $_POST['mc_gross'];
  159.     $payment_currency = $_POST['mc_currency'];
  160.     $txn_id = $_POST['txn_id'];
  161.     $receiver_email = $_POST['receiver_email'];
  162.     $payer_email = $_POST['payer_email'];
  163.    
  164.      // send user an email with a confirmation
  165.     $h1 = 0;
  166.     $h2 = 0;
  167.     $h3 = 0;
  168.     $h4 = 0;
  169.     $h5 = 0;
  170.     $h6 = 0;
  171.     $h7 = 0;
  172.     $h8 = 0;
  173.     $h9 = 0;
  174.     $h10 = 0;
  175.     $h11 = 0;
  176.     $h12 = 0;
  177.     $h13 = 0;
  178.     $h14 = 0;
  179.     $h15 = 0;
  180.     $h16 = 0;
  181.     $h17 = 0;
  182.     $h18 = 0;
  183.     $h19 = 0;
  184.     $h20 = 0;
  185.     $h21 = 0;
  186.     $h22 = 0;
  187.     $h23 = 0;
  188.     $h24 = 0;
  189.     $h25 = 0;
  190.     $h26 = 0;
  191.     $h27 = 0;
  192.     $h28 = 0;
  193.     $h29 = 0;
  194.     $h30 = 0;
  195.     $h31 = 0;
  196.     $num = $_POST['num_cart_items'];
  197.     $amount = $_POST['mc_gross'];
  198.     $firstname = $_POST['first_name'];
  199.     $lastname = $_POST['last_name'];
  200.     $to = filter_var($_POST['payer_email'], FILTER_SANITIZE_EMAIL);
  201.     $to2 = filter_var('anna@energyshop.se', FILTER_SANITIZE_EMAIL);
  202.     $date = date('Y-m-d');
  203.     $name = $_POST['item_name'];
  204.     $subject = "Tack för Ert köp! / Thank you for your order!";
  205.     $subject2 = "(COPY) Tack för Ert köp! / Thank you for your order!";
  206.     $headerFields = array(
  207.     'Date: ' . date('r', $_SERVER['REQUEST_TIME']),
  208.     "Subject: =?UTF-8?Q?".imap_8bit($subject)."?=",
  209.     "From: {$to}",
  210.     "MIME-Version: 1.0",
  211.     "Content-Type: text/html;charset=utf-8"
  212.     );
  213.     $headerFields2 = array(
  214.     'Date: ' . date('r', $_SERVER['REQUEST_TIME']),
  215.     "Subject: =?UTF-8?Q?".imap_8bit($subject2)."?=",
  216.     "From: {$to}",
  217.     "MIME-Version: 1.0",
  218.     "Content-Type: text/html;charset=utf-8"
  219.     );
  220.     $message = '<html><body>';
  221.     $message .= "$firstname $lastname, $payer_email \r\n";
  222.     $message .= '<br />';
  223.     $message .= "Tack för din beställning från energyshop.se. $date";
  224.     $message .= '<br>';
  225.     $message .= "Vi hoppas att varorna motsvarar dina förväntningar! \r\n";
  226.     $message .= '<br />';
  227.     $message .= "Du köpte $num produkter för totalt $amount kronor.";
  228.     $message .= '<br>';
  229.     $message .= 'Varor:';
  230.     $message .= "$name";
  231.     $message .= '<br>';
  232.     $message .= 'Moms är inkluderad i priset:';
  233.     $message .= '<br>';
  234.     $message .= "6% moms Böcker, 12% moms EnergyUnion, 25% moms på övriga sortimentet \r\n";
  235.     $message .= '<br />';
  236.     $message .= 'Har du köpt digitala varor, ska du direkt efter betalningen fått tillgång till en sida där du laddar ned din beställning.';
  237.     $message .= '<br>';
  238.     $message .= "Har du köpt fysiska varor, skickas de till dig så snart som möjligt med Posten, dock senast en vecka efter din beställning.\r\n";
  239.     $message .= '<br />';
  240.     $message .= 'Vi på energyshop.se önskar dig en trevlig dag.';
  241.     $message .= '<br>';
  242.     $message .= 'Välkommen tillbaka när du vill!';
  243.     $message .= '</body></html>';
  244.    
  245.     $message2 = "$message";
  246.     $message2 .= '<br />';
  247.     $message2 .= '(NOTE: THIS IS A COPY)';
  248.    
  249.     mail($to, $subject, $message,  implode("\r\n", $headerFields));
  250.     mail('anna@energyshop.se', $subject2, $message2,  implode("\r\n", $headerFields2));  
  251.     }
  252.      else {
  253.     // log for manual investigation
  254.     mail('anna@energyshop.se', 'Invalid IPN', $listener->getTextReport());
  255. }
  256. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement