Webdesign-Forum

Antworten auf alltägliche Fragen im Webdesign und der Internet-Programmierung
Fehler in PayPal IPN Modul (falsche Währung bei PayPal)

 
Neues Thema eröffnen   Neue Antwort erstellen    Webdesign-Forum Foren-Übersicht -> osCommerce
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ar
Site Admin


Anmeldedatum: 30.05.2006
Beiträge: 78

BeitragVerfasst am: 19.05.2008, 11:06    Titel: Fehler in PayPal IPN Modul (falsche Währung bei PayPal) Antworten mit Zitat

Das Modul hat als Währung immer Euro gewählt, auch wenn die Standardwährung im Shop auf Schweizer Franken gestellt war.

Grund war ein Fehler in der Datei paypal_ipn.php aus dem Verzeichnis includes/modules/payment

In der zweiten if-Anweisung der Funktion process_button() wird geprüft, welche Währungen für PayPal zugelassen sind.
Ich habe diese Währungen mal an die aktuell bei PayPal erlaubten Währungen angepasst (https://www.paypal.com/de/cgi-bin/webscr?cmd=p/sell/mc/mc_intro-outside):
Code:

/*
               * Kanadische Dollar (CAD)
             * Euro (EUR)
             * Britische Pfund (GBP)
             * US-Dollar (USD)
             * Japanische Yen (JPY)
             * Australische Dollar (AUD)
             * Neuseeländische Dollar (NZD)
             * Schweizer Franken (CHF)
             * Hongkong-Dollar (HKD)
             * Singapur-Dollar (SGD)
             * Schwedische Kronen (SEK)
             * Dänische Kronen (DKK)
             * Polnische Zloty (PLN)
             * Norwegische Kronen (NOK)
             * Ungarische Forint (HUF)
             * Tschechische Kronen (CZK)
      */
      
      if (!in_array($my_currency, array ('CAD', 'EUR', 'GBP', 'USD', 'JPY', 'AUD', 'NZD', 'CHF', 'HKD', 'SGD', 'SEK', 'DKK', 'PLN', 'NOK', 'HUF', 'CZK'))) {
         $my_currency = 'EUR';
      }


Dabei ist auch gleich noch ein weiterer Fehler im Script aufgefallen. In der ersten if-Anweisung der Funktion process_button() wurde eine Falsche Konstante verwendet. Hier muss MODULE_PAYMENT_PAYPAL_CURRENCY durch MODULE_PAYMENT_PAYPAL_IPN_CURRENCY ersetzt werden.

Die komplette Datei gibte es hier:
Code:

<?php
/* -----------------------------------------------------------------------------------------
   $Id: paypal_ipn.php v1.0 998 2005-08-16 14:18:20Z HHGAG $   

   XT-Commerce - community made shopping
   http://www.xt-commerce.com

   Copyright (c) 2005 XT-Commerce
   -----------------------------------------------------------------------------------------
   based on:
   (c) 2000-2001 The Exchange Project  (earlier name of osCommerce)
   (c) 2002-2003 osCommerce(paypal.php,v 1.39 2003/01/29); www.oscommerce.com
   (c) 2003    nextcommerce (paypal.php,v 1.8 2003/08/24); www.nextcommerce.org

   Released under the GNU General Public License
   ---------------------------------------------------------------------------------------*/
   
class paypal_ipn {
   var $code, $title, $description, $enabled, $identifier;
   
   function paypal_ipn() {
      global $order;
      
      $this->code = 'paypal_ipn';
      $this->title = MODULE_PAYMENT_PAYPAL_IPN_TEXT_TITLE;
      $this->description = MODULE_PAYMENT_PAYPAL_IPN_TEXT_DESCRIPTION;
      $this->sort_order = MODULE_PAYMENT_PAYPAL_IPN_SORT_ORDER;
      $this->enabled = ((MODULE_PAYMENT_PAYPAL_IPN_STATUS == 'True') ? true : false);
      $this->identifier = 'xt:Commerce PayPal IPN v1.0';
      
      if ((int)MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID > 0) {
         $this->order_status = MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID;
      }
      
      if (is_object($order))
         $this->update_status();
         
      $this->email_footer = MODULE_PAYMENT_PAYPAL_IPN_TEXT_EMAIL_FOOTER;
      
      if (MODULE_PAYMENT_PAYPAL_IPN_GATEWAY_SERVER == 'Live') {
         $this->form_action_url = 'https://www.paypal.com/cgi-bin/webscr';
      }else{
         $this->form_action_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
      }
   }

       
    function update_status() {
       global $order;
       
       if (($this->enabled == true) && ((int)MODULE_PAYMENT_PAYPAL_IPN_ZONE > 0)) {
          $check_flag = false;
          $check_query = xtc_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PAYPAL_IPN_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
          
          while ($check = xtc_db_fetch_array($check_query)) {
             if ($check['zone_id'] < 1) {
                $check_flag = true;
                break;
             }
             elseif ($check['zone_id'] == $order->billing['zone_id']) {
                $check_flag = true;
                break;
             }
          }
          
          if ($check_flag == false) {
             $this->enabled = false;
          }
       }
    }

   
    function javascript_validation() {
       return false;
    }
   
   
    function selection() {
       return array('id' => $this->code,
                 'module' => $this->title);
    }
   
   
    function pre_confirmation_check() {
       return false;
    }
   
   
    function confirmation() {
       global $cartID;
       
       if (xtc_session_is_registered('cartID')) {
            xtc_session_register('order_ident_key');
            $_SESSION['order_ident_key'] = xtc_input_validation(md5($_SESSION['cartID'] . '-' . $_SESSION['customer_id']),int,'');
      }
                  
      return array('title' => MODULE_PAYMENT_PAYPAL_IPN_TEXT_DESCRIPTION );
   }


   function process_button() {
      global $order, $xtPrice;
      
      if (MODULE_PAYMENT_PAYPAL_IPN_CURRENCY == 'Selected Currency') {
         $my_currency = $_SESSION['currency'];
      } else {
         $my_currency = substr(MODULE_PAYMENT_PAYPAL_IPN_CURRENCY, 5);
      }
      
      /*
              * Kanadische Dollar (CAD)
             * Euro (EUR)
             * Britische Pfund (GBP)
             * US-Dollar (USD)
             * Japanische Yen (JPY)
             * Australische Dollar (AUD)
             * Neuseeländische Dollar (NZD)
             * Schweizer Franken (CHF)
             * Hongkong-Dollar (HKD)
             * Singapur-Dollar (SGD)
             * Schwedische Kronen (SEK)
             * Dänische Kronen (DKK)
             * Polnische Zloty (PLN)
             * Norwegische Kronen (NOK)
             * Ungarische Forint (HUF)
             * Tschechische Kronen (CZK)
      */
      
      if (!in_array($my_currency, array ('CAD', 'EUR', 'GBP', 'USD', 'JPY', 'AUD', 'NZD', 'CHF', 'HKD', 'SGD', 'SEK', 'DKK', 'PLN', 'NOK', 'HUF', 'CZK'))) {
         $my_currency = 'EUR';
      }
      
      $parameters = array();
      
      $parameters['cmd'] = '_xclick';
      $parameters['item_name'] = STORE_NAME;

               
      if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status']['customers_status_add_tax_ot'] == 1) {
         $parameters['amount'] = $order->info['total'] + $order->info['tax'];
      } else {
         $parameters['amount'] = $order->info['total'];
      }
      if ($_SESSION['currency'] == $my_currency) {
         $parameters['shipping'] = round($order->info['shipping_cost'], $xtPrice->get_decimal_places($my_currency));
         $parameters['amount'] = round($parameters['amount'], $xtPrice->get_decimal_places($my_currency)) - $parameters['shipping'];
      } else {
         $parameters['shipping'] = round($xtPrice->xtcCalculateCurrEx($order->info['shipping_cost'], $my_currency), $xtPrice->get_decimal_places($my_currency));
         $parameters['amount'] = round($xtPrice->xtcCalculateCurrEx($parameters['amount'], $my_currency), $xtPrice->get_decimal_places($my_currency)) - $parameters['shipping'];
      }
   
      $parameters['business'] = MODULE_PAYMENT_PAYPAL_IPN_ID;
      $parameters['currency_code'] = $my_currency;
      $parameters['invoice'] = $_SESSION['order_ident_key'];
      $parameters['custom'] = $_SESSION['customer_id'];
      $parameters['no_shipping'] = '1';
      $parameters['no_note'] = '1';
      $parameters['notify_url'] = xtc_href_link('ipn.php', '', 'SSL', false, false);
      $parameters['return'] = xtc_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL');
      $parameters['cancel_return'] = xtc_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL');
      
      //  Add missing variables to prepopulate PayPal form. -- hostmistress 20050210
      $parameters['first_name'] = $order->billing['firstname'];
      $parameters['last_name'] = $order->billing['lastname'];
      $parameters['address1'] = $order->billing['street_address'];
      $parameters['address2'] = $order->billing['suburb'];
      $parameters['email'] = $order->customer['email_address'];
      $parameters['night_phone_a'] = $order->customer['telephone'];
      $parameters['city'] = $order->billing['city'];
      
      if ($order->billing['country']['iso_code_2']=='US') {
         $order->billing['state'] = xtc_get_zone_code($order->billing['country_id'], $order->billing['zone_id'], $order->billing['state']);
        }
       
        $parameters['state'] = $order->billing['state'];
        $parameters['zip'] = $order->billing['postcode'];
        $parameters['country'] = $order->billing['country']['iso_code_2'];
       
       
        $parameters['bn'] = $this->identifier;
       
        if(xtc_not_null(MODULE_PAYMENT_PAYPAL_IPN_PAGE_STYLE)) {
           $parameters['page_style'] = MODULE_PAYMENT_PAYPAL_IPN_PAGE_STYLE;
        }
       
        if (MODULE_PAYMENT_PAYPAL_IPN_EWP_STATUS == 'True') {
           $parameters['cert_id'] = MODULE_PAYMENT_PAYPAL_IPN_EWP_CERT_ID;
           $random_string = rand(100000, 999999) . '-' . $customer_id . '-';
         $data = '';
         
         while (list($key, $value) = each($parameters)) {
            $data .= $key . '=' . $value . "\n";
         }
         
         $fp = fopen(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt', 'w');
         fwrite($fp, $data);
         fclose($fp);
         
         unset($data);
         
         if (function_exists('openssl_pkcs7_sign') && function_exists('openssl_pkcs7_encrypt')) {
            openssl_pkcs7_sign(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt', MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt', file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_PUBLIC_KEY), file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_PRIVATE_KEY), array('From' => MODULE_PAYMENT_PAYPAL_IPN_ID), PKCS7_BINARY);
            unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt');
            
            // remove headers from the signature
            $signed = file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');
            $signed = explode("\n\n", $signed);
            $signed = base64_decode($signed[1]);
            
            $fp = fopen(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt', 'w');
            fwrite($fp, $signed);
            fclose($fp);
            
            unset($signed);
            
            openssl_pkcs7_encrypt(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt', MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt', file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_PAYPAL_KEY), array('From' => MODULE_PAYMENT_PAYPAL_IPN_ID), PKCS7_BINARY);
            
            unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');
            
            // remove headers from the encrypted result
            
            $data = file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');
            $data = explode("\n\n", $data);
            $data = '-----BEGIN PKCS7-----' . "\n" . $data[1] . "\n" . '-----END PKCS7-----';
            
            unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');
         }else{
            exec(MODULE_PAYMENT_PAYPAL_IPN_EWP_OPENSSL . ' smime -sign -in ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt -signer ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_PUBLIC_KEY . ' -inkey ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_PRIVATE_KEY . ' -outform der -nodetach -binary > ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');
            unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt');
            
            exec(MODULE_PAYMENT_PAYPAL_IPN_EWP_OPENSSL . ' smime -encrypt -des3 -binary -outform pem ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_PAYPAL_KEY . ' < ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt > ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');
            unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');
            
            $fh = fopen(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt', 'rb');
            $data = fread($fh, filesize(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt'));
            fclose($fh);
            
            unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');
         }
         
         $process_button_string = xtc_draw_hidden_field('cmd', '_s-xclick') . xtc_draw_hidden_field('encrypted', $data);
         
         unset($data);
      }else{
         while (list($key, $value) = each($parameters)) {
            $process_button_string.=xtc_draw_hidden_field($key, $value);
         }
      }
      
      return $process_button_string;
   }


   function before_process() {
      return false;
   }


   function after_process() {
      global $insert_id;
              if ($this->order_status)
                 xtc_db_query("UPDATE ". TABLE_ORDERS ." SET orders_status='0' WHERE orders_id='".$insert_id."'");
                 xtc_db_query("UPDATE ". TABLE_ORDERS_STATUS_HISTORY ." SET orders_status='0' WHERE orders_id='".$insert_id."'");
   }
   
   
   function output_error() {
      return false;
   }
   
   
   function check() {
      if(!isset($this->_check)) {
         $check_query = xtc_db_query("SELECT configuration_value
                               FROM " . TABLE_CONFIGURATION . "
                               WHERE configuration_key = 'MODULE_PAYMENT_PAYPAL_IPN_STATUS'");
         $this->_check = xtc_db_num_rows($check_query);
      }
      return $this->_check;
   }
   
   
   function install() {
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_STATUS', 'False', '6', '3', 'xtc_cfg_select_option(array(\'True\', \'False\'), ', now())");
       xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " ( configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                 VALUES ('MODULE_PAYMENT_PAYPAL_IPN_ID', '', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, date_added)
                 VALUES ('MODULE_PAYMENT_PAYPAL_IPN_CURRENCY', 'Only EUR', '6', '6', 'xtc_cfg_select_option(array(\'Selected Currency\',\'Only AUD\',\'Only USD\',\'Only CAD\',\'Only EUR\',\'Only GBP\',\'Only JPY\'), ', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                 VALUES ('MODULE_PAYMENT_PAYPAL_IPN_SORT_ORDER', '0', '6', '0', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_ALLOWED', '', '6', '0', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, use_function, set_function, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_ZONE', '0', '6', '2', 'xtc_get_zone_class_title', 'xtc_cfg_pull_down_zone_classes(', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, use_function, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID', '0', '6', '0', 'xtc_cfg_pull_down_order_statuses(', 'xtc_get_order_status_name', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, use_function, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_ORDER_STATUS_ID', '0', '6', '0', 'xtc_cfg_pull_down_order_statuses(', 'xtc_get_order_status_name', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id,sort_order, set_function, use_function, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_DENIED_ORDER_STATUS_ID', '0', '6', '0', 'xtc_cfg_pull_down_order_statuses(', 'xtc_get_order_status_name', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_GATEWAY_SERVER', 'Testing', '6', '6', 'xtc_cfg_select_option(array(\'Testing\',\'Live\'), ', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_PAGE_STYLE', '', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_DEBUG_EMAIL', '', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_EWP_STATUS', 'False', '6', '3', 'xtc_cfg_select_option(array(\'True\', \'False\'), ', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_EWP_PRIVATE_KEY', '', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_EWP_PUBLIC_KEY', '', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_EWP_PAYPAL_KEY', '', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_EWP_CERT_ID', '', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY', '/tmp', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                 VALUES ('MODULE_PAYMENT_PAYPAL_IPN_EWP_OPENSSL', '/usr/bin/openssl', '6', '4', now())");
      xtc_db_query("ALTER TABLE " . TABLE_ORDERS . " ADD paypal_ipn_success INT( 1 ) DEFAULT '0' NOT NULL");
   }


   function remove() {
      xtc_db_query("DELETE FROM " . TABLE_CONFIGURATION . " WHERE configuration_key in ('" . implode("', '", $this->keys()) . "')");
      xtc_db_query("ALTER TABLE " . TABLE_ORDERS . " DROP paypal_ipn_success");
   }


   function keys() {
      return array('MODULE_PAYMENT_PAYPAL_IPN_STATUS',
                'MODULE_PAYMENT_PAYPAL_IPN_ALLOWED',
                'MODULE_PAYMENT_PAYPAL_IPN_ID',
                'MODULE_PAYMENT_PAYPAL_IPN_CURRENCY',
                'MODULE_PAYMENT_PAYPAL_IPN_ZONE',
                'MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID',
                'MODULE_PAYMENT_PAYPAL_IPN_ORDER_STATUS_ID',
                'MODULE_PAYMENT_PAYPAL_IPN_DENIED_ORDER_STATUS_ID',
                'MODULE_PAYMENT_PAYPAL_IPN_GATEWAY_SERVER',
                'MODULE_PAYMENT_PAYPAL_IPN_PAGE_STYLE',
                'MODULE_PAYMENT_PAYPAL_IPN_DEBUG_EMAIL',
                'MODULE_PAYMENT_PAYPAL_IPN_SORT_ORDER',
                'MODULE_PAYMENT_PAYPAL_IPN_EWP_STATUS',
                'MODULE_PAYMENT_PAYPAL_IPN_EWP_PRIVATE_KEY',
                'MODULE_PAYMENT_PAYPAL_IPN_EWP_PUBLIC_KEY',
                'MODULE_PAYMENT_PAYPAL_IPN_EWP_PAYPAL_KEY',
                'MODULE_PAYMENT_PAYPAL_IPN_EWP_CERT_ID',
                'MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY',
                'MODULE_PAYMENT_PAYPAL_IPN_EWP_OPENSSL');
   } // function keys()
}
?>
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ar
Site Admin


Anmeldedatum: 30.05.2006
Beiträge: 78

BeitragVerfasst am: 08.07.2008, 08:08    Titel: Antworten mit Zitat

Noch ein Fehler!?

Ich glaube die Funktion after_process() muss wie folgt aussehen:
Code:

function after_process() {
   global $insert_id;
     if (!$this->order_status)
             xtc_db_query("UPDATE ". TABLE_ORDERS ." SET orders_status='0' WHERE orders_id='".$insert_id."'");
             xtc_db_query("UPDATE ". TABLE_ORDERS_STATUS_HISTORY ." SET orders_status_id='0' WHERE orders_id='".$insert_id."'");
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ar
Site Admin


Anmeldedatum: 30.05.2006
Beiträge: 78

BeitragVerfasst am: 25.07.2008, 07:24    Titel: Antworten mit Zitat

Nach weiteren Fehlern im IPN-Modul, habe ich das Modul heute aus dem XT:Commerce Shop entfernt.

Das Modul erledigt den "Handshake" mit PayPal nicht.

Die Bestellung müsste entweder angelegt werden, bevor der Nutzer zur PayPal Seite weitergeleitet wird (also in der "function confirmation()" der paypal_ipn.php Datei). Oder wenn der Handshake mir PayPal erfolgt (also in der ipn.php).
Beides geschieht nicht.
Ein Problem für die Lösung via confirmation() ist, dass die Bestellung ab der Bestellzusammenfassung angelegt ist. Bricht der Nutzer nun ab, haben wir eine Bestellung, die der Nutzer gar nicht bestätigt hat.
Besser wäre es also in der ipn.php. Hier muss man aber alle Daten zur Bestellung erst wieder zusammen stellen (Rechnungs- und Lieferdresse, Versandart, Bemerkungen etc.)

Also doch sehr aufwendig!
Vielleicht ist das Standard-PayPal Modul bei dem der Nutzer aus der Bestätigungs-E-Mail zu PayPal geleitet wird die bessere Wahl!?

Die letzten Versionen der paypal_ipn.php und ipn.php gibt es hier:
paypal_ipn.php
Code:
<?php
/* -----------------------------------------------------------------------------------------
   $Id: paypal_ipn.php v1.0 998 2005-08-16 14:18:20Z HHGAG $   

   XT-Commerce - community made shopping
   http://www.xt-commerce.com

   Copyright (c) 2005 XT-Commerce
   -----------------------------------------------------------------------------------------
   based on:
   (c) 2000-2001 The Exchange Project  (earlier name of osCommerce)
   (c) 2002-2003 osCommerce(paypal.php,v 1.39 2003/01/29); www.oscommerce.com
   (c) 2003    nextcommerce (paypal.php,v 1.8 2003/08/24); www.nextcommerce.org

   Released under the GNU General Public License
   ---------------------------------------------------------------------------------------*/
   
class paypal_ipn {
   var $code, $title, $description, $enabled, $identifier;
   
   function paypal_ipn() {
      global $order;
      
      $this->code = 'paypal_ipn';
      $this->title = MODULE_PAYMENT_PAYPAL_IPN_TEXT_TITLE;
      $this->description = MODULE_PAYMENT_PAYPAL_IPN_TEXT_DESCRIPTION;
      $this->sort_order = MODULE_PAYMENT_PAYPAL_IPN_SORT_ORDER;
      $this->enabled = ((MODULE_PAYMENT_PAYPAL_IPN_STATUS == 'True') ? true : false);
      $this->info = MODULE_PAYMENT_PAYPAL_IPN_TEXT_INFO;
      $this->identifier = 'xt:Commerce PayPal IPN v1.0';
      
      if ((int)MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID > 0) {
         $this->order_status = MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID;
      }
      
      if (is_object($order))
         $this->update_status();
         
      $this->email_footer = MODULE_PAYMENT_PAYPAL_IPN_TEXT_EMAIL_FOOTER;
      
      if (MODULE_PAYMENT_PAYPAL_IPN_GATEWAY_SERVER == 'Live') {
         $this->form_action_url = 'https://www.paypal.com/cgi-bin/webscr';
      }else{
         $this->form_action_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
      }
   }

       
    function update_status() {
       global $order;
       
       if (($this->enabled == true) && ((int)MODULE_PAYMENT_PAYPAL_IPN_ZONE > 0)) {
          $check_flag = false;
          $check_query = xtc_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PAYPAL_IPN_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
          
          while ($check = xtc_db_fetch_array($check_query)) {
             if ($check['zone_id'] < 1) {
                $check_flag = true;
                break;
             }
             elseif ($check['zone_id'] == $order->billing['zone_id']) {
                $check_flag = true;
                break;
             }
          }
          
          if ($check_flag == false) {
             $this->enabled = false;
          }
       }
    }

   
    function javascript_validation() {
       return false;
    }
   
   
    function selection() {       
       return array('id' => $this->code, 'module' => $this->title, 'description' => $this->info);
    }
   
   
    function pre_confirmation_check() {
       return false;
    }
   
   
    function confirmation() {
       global $cartID;
       
       if (xtc_session_is_registered('cartID')) {
            xtc_session_register('order_ident_key');
            $_SESSION['order_ident_key'] = xtc_input_validation(md5($_SESSION['cartID'] . '-' . $_SESSION['customer_id']),int,'');
      }
                  
      return array('title' => MODULE_PAYMENT_PAYPAL_IPN_TEXT_DESCRIPTION );
   }


   function process_button() {
      global $order, $xtPrice;
      
      if (MODULE_PAYMENT_PAYPAL_IPN_CURRENCY == 'Selected Currency') {
         $my_currency = $_SESSION['currency'];
      } else {
         $my_currency = substr(MODULE_PAYMENT_PAYPAL_IPN_CURRENCY, 5);
      }
      
      /*
              * Kanadische Dollar (CAD)
             * Euro (EUR)
             * Britische Pfund (GBP)
             * US-Dollar (USD)
             * Japanische Yen (JPY)
             * Australische Dollar (AUD)
             * Neuseeländische Dollar (NZD)
             * Schweizer Franken (CHF)
             * Hongkong-Dollar (HKD)
             * Singapur-Dollar (SGD)
             * Schwedische Kronen (SEK)
             * Dänische Kronen (DKK)
             * Polnische Zloty (PLN)
             * Norwegische Kronen (NOK)
             * Ungarische Forint (HUF)
             * Tschechische Kronen (CZK)
      */
      
      if (!in_array($my_currency, array ('CAD', 'EUR', 'GBP', 'USD', 'JPY', 'AUD', 'NZD', 'CHF', 'HKD', 'SGD', 'SEK', 'DKK', 'PLN', 'NOK', 'HUF', 'CZK'))) {
         $my_currency = 'EUR';
      }
      
      $parameters = array();
      
      $parameters['cmd'] = '_xclick';
      $parameters['item_name'] = STORE_NAME;

               
      if ($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status']['customers_status_add_tax_ot'] == 1) {
         $parameters['amount'] = $order->info['total'] + $order->info['tax'];
      } else {
         $parameters['amount'] = $order->info['total'];
      }
      if ($_SESSION['currency'] == $my_currency) {
         $parameters['shipping'] = round($order->info['shipping_cost'], $xtPrice->get_decimal_places($my_currency));
         $parameters['amount'] = round($parameters['amount'], $xtPrice->get_decimal_places($my_currency)) - $parameters['shipping'];
      } else {
         $parameters['shipping'] = round($xtPrice->xtcCalculateCurrEx($order->info['shipping_cost'], $my_currency), $xtPrice->get_decimal_places($my_currency));
         $parameters['amount'] = round($xtPrice->xtcCalculateCurrEx($parameters['amount'], $my_currency), $xtPrice->get_decimal_places($my_currency)) - $parameters['shipping'];
      }
   
      $parameters['business'] = MODULE_PAYMENT_PAYPAL_IPN_ID;
      $parameters['currency_code'] = $my_currency;
      $parameters['invoice'] = $_SESSION['order_ident_key'];
      $parameters['custom'] = $_SESSION['customer_id'];
      $parameters['no_shipping'] = '1';
      $parameters['no_note'] = '1';
      $parameters['notify_url'] = xtc_href_link('ipn.php', '', 'SSL', false, false);
      $parameters['return'] = xtc_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL');
      $parameters['cancel_return'] = xtc_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL');
      
      //  Add missing variables to prepopulate PayPal form. -- hostmistress 20050210
      $parameters['first_name'] = $order->billing['firstname'];
      $parameters['last_name'] = $order->billing['lastname'];
      $parameters['address1'] = $order->billing['street_address'];
      $parameters['address2'] = $order->billing['suburb'];
      $parameters['email'] = $order->customer['email_address'];
      $parameters['night_phone_a'] = $order->customer['telephone'];
      $parameters['city'] = $order->billing['city'];
      
      if ($order->billing['country']['iso_code_2']=='US') {
         $order->billing['state'] = xtc_get_zone_code($order->billing['country_id'], $order->billing['zone_id'], $order->billing['state']);
        }
       
        $parameters['state'] = $order->billing['state'];
        $parameters['zip'] = $order->billing['postcode'];
        $parameters['country'] = $order->billing['country']['iso_code_2'];
       
       
        $parameters['bn'] = $this->identifier;
       
        if(xtc_not_null(MODULE_PAYMENT_PAYPAL_IPN_PAGE_STYLE)) {
           $parameters['page_style'] = MODULE_PAYMENT_PAYPAL_IPN_PAGE_STYLE;
        }
       
        if (MODULE_PAYMENT_PAYPAL_IPN_EWP_STATUS == 'True') {
           $parameters['cert_id'] = MODULE_PAYMENT_PAYPAL_IPN_EWP_CERT_ID;
           $random_string = rand(100000, 999999) . '-' . $customer_id . '-';
         $data = '';
         
         while (list($key, $value) = each($parameters)) {
            $data .= $key . '=' . $value . "\n";
         }
         
         $fp = fopen(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt', 'w');
         fwrite($fp, $data);
         fclose($fp);
         
         unset($data);
         
         if (function_exists('openssl_pkcs7_sign') && function_exists('openssl_pkcs7_encrypt')) {
            openssl_pkcs7_sign(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt', MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt', file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_PUBLIC_KEY), file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_PRIVATE_KEY), array('From' => MODULE_PAYMENT_PAYPAL_IPN_ID), PKCS7_BINARY);
            unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt');
            
            // remove headers from the signature
            $signed = file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');
            $signed = explode("\n\n", $signed);
            $signed = base64_decode($signed[1]);
            
            $fp = fopen(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt', 'w');
            fwrite($fp, $signed);
            fclose($fp);
            
            unset($signed);
            
            openssl_pkcs7_encrypt(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt', MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt', file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_PAYPAL_KEY), array('From' => MODULE_PAYMENT_PAYPAL_IPN_ID), PKCS7_BINARY);
            
            unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');
            
            // remove headers from the encrypted result
            
            $data = file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');
            $data = explode("\n\n", $data);
            $data = '-----BEGIN PKCS7-----' . "\n" . $data[1] . "\n" . '-----END PKCS7-----';
            
            unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');
         }else{
            exec(MODULE_PAYMENT_PAYPAL_IPN_EWP_OPENSSL . ' smime -sign -in ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt -signer ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_PUBLIC_KEY . ' -inkey ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_PRIVATE_KEY . ' -outform der -nodetach -binary > ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');
            unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt');
            
            exec(MODULE_PAYMENT_PAYPAL_IPN_EWP_OPENSSL . ' smime -encrypt -des3 -binary -outform pem ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_PAYPAL_KEY . ' < ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt > ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');
            unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');
            
            $fh = fopen(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt', 'rb');
            $data = fread($fh, filesize(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt'));
            fclose($fh);
            
            unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');
         }
         
         $process_button_string = xtc_draw_hidden_field('cmd', '_s-xclick') . xtc_draw_hidden_field('encrypted', $data);
         
         unset($data);
      }else{
         while (list($key, $value) = each($parameters)) {
            $process_button_string.=xtc_draw_hidden_field($key, $value);
         }
      }
      
      return $process_button_string;
   }


   function before_process() {
      return false;
   }


   function after_process() {
      global $insert_id;
              if (!$this->order_status)
                 xtc_db_query("UPDATE ". TABLE_ORDERS ." SET orders_status='0' WHERE orders_id='".$insert_id."'");
                 xtc_db_query("UPDATE ". TABLE_ORDERS_STATUS_HISTORY ." SET orders_status_id='0' WHERE orders_id='".$insert_id."'");
   }
   
   
   function output_error() {
      return false;
   }
   
   
   function check() {
      if(!isset($this->_check)) {
         $check_query = xtc_db_query("SELECT configuration_value
                               FROM " . TABLE_CONFIGURATION . "
                               WHERE configuration_key = 'MODULE_PAYMENT_PAYPAL_IPN_STATUS'");
         $this->_check = xtc_db_num_rows($check_query);
      }
      return $this->_check;
   }
   
   
   function install() {
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_STATUS', 'False', '6', '3', 'xtc_cfg_select_option(array(\'True\', \'False\'), ', now())");
       xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " ( configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                 VALUES ('MODULE_PAYMENT_PAYPAL_IPN_ID', '', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, date_added)
                 VALUES ('MODULE_PAYMENT_PAYPAL_IPN_CURRENCY', 'Only EUR', '6', '6', 'xtc_cfg_select_option(array(\'Selected Currency\',\'Only AUD\',\'Only USD\',\'Only CAD\',\'Only EUR\',\'Only GBP\',\'Only JPY\'), ', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                 VALUES ('MODULE_PAYMENT_PAYPAL_IPN_SORT_ORDER', '0', '6', '0', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_ALLOWED', '', '6', '0', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, use_function, set_function, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_ZONE', '0', '6', '2', 'xtc_get_zone_class_title', 'xtc_cfg_pull_down_zone_classes(', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, use_function, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID', '0', '6', '0', 'xtc_cfg_pull_down_order_statuses(', 'xtc_get_order_status_name', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, use_function, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_ORDER_STATUS_ID', '0', '6', '0', 'xtc_cfg_pull_down_order_statuses(', 'xtc_get_order_status_name', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id,sort_order, set_function, use_function, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_DENIED_ORDER_STATUS_ID', '0', '6', '0', 'xtc_cfg_pull_down_order_statuses(', 'xtc_get_order_status_name', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_GATEWAY_SERVER', 'Testing', '6', '6', 'xtc_cfg_select_option(array(\'Testing\',\'Live\'), ', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_PAGE_STYLE', '', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_DEBUG_EMAIL', '', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_EWP_STATUS', 'False', '6', '3', 'xtc_cfg_select_option(array(\'True\', \'False\'), ', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_EWP_PRIVATE_KEY', '', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_EWP_PUBLIC_KEY', '', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_EWP_PAYPAL_KEY', '', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_EWP_CERT_ID', '', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                      VALUES ('MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY', '/tmp', '6', '4', now())");
      xtc_db_query("INSERT INTO " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added)
                 VALUES ('MODULE_PAYMENT_PAYPAL_IPN_EWP_OPENSSL', '/usr/bin/openssl', '6', '4', now())");
      xtc_db_query("ALTER TABLE " . TABLE_ORDERS . " ADD paypal_ipn_success INT( 1 ) DEFAULT '0' NOT NULL");
   }


   function remove() {
      xtc_db_query("DELETE FROM " . TABLE_CONFIGURATION . " WHERE configuration_key in ('" . implode("', '", $this->keys()) . "')");
      xtc_db_query("ALTER TABLE " . TABLE_ORDERS . " DROP paypal_ipn_success");
   }


   function keys() {
      return array('MODULE_PAYMENT_PAYPAL_IPN_STATUS',
                'MODULE_PAYMENT_PAYPAL_IPN_ALLOWED',
                'MODULE_PAYMENT_PAYPAL_IPN_ID',
                'MODULE_PAYMENT_PAYPAL_IPN_CURRENCY',
                'MODULE_PAYMENT_PAYPAL_IPN_ZONE',
                'MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID',
                'MODULE_PAYMENT_PAYPAL_IPN_ORDER_STATUS_ID',
                'MODULE_PAYMENT_PAYPAL_IPN_DENIED_ORDER_STATUS_ID',
                'MODULE_PAYMENT_PAYPAL_IPN_GATEWAY_SERVER',
                'MODULE_PAYMENT_PAYPAL_IPN_PAGE_STYLE',
                'MODULE_PAYMENT_PAYPAL_IPN_DEBUG_EMAIL',
                'MODULE_PAYMENT_PAYPAL_IPN_SORT_ORDER',
                'MODULE_PAYMENT_PAYPAL_IPN_EWP_STATUS',
                'MODULE_PAYMENT_PAYPAL_IPN_EWP_PRIVATE_KEY',
                'MODULE_PAYMENT_PAYPAL_IPN_EWP_PUBLIC_KEY',
                'MODULE_PAYMENT_PAYPAL_IPN_EWP_PAYPAL_KEY',
                'MODULE_PAYMENT_PAYPAL_IPN_EWP_CERT_ID',
                'MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY',
                'MODULE_PAYMENT_PAYPAL_IPN_EWP_OPENSSL');
   } // function keys()
}
?>


ipn.php
Code:
<?php
/* -----------------------------------------------------------------------------------------
   $Id: paypal_ipn.php v1.0 998 2005-08-16 14:18:20Z HHGAG $   

   XT-Commerce - community made shopping
   http://www.xt-commerce.com

   Copyright (c) 2005 XT-Commerce
   -----------------------------------------------------------------------------------------
   based on:
   (c) 2000-2001 The Exchange Project  (earlier name of osCommerce)
   (c) 2002-2003 osCommerce(paypal.php,v 1.39 2003/01/29); www.oscommerce.com
   (c) 2003    nextcommerce (paypal.php,v 1.8 2003/08/24); www.nextcommerce.org

   Released under the GNU General Public License
   ---------------------------------------------------------------------------------------*/

require('includes/application_top.php');

$parameters = 'cmd=_notify-validate';

foreach ($_POST as $key => $value) {
     $parameters .= '&' . $key . '=' . urlencode(stripslashes($value));
}
 
if(MODULE_PAYMENT_PAYPAL_IPN_GATEWAY_SERVER == 'Live') {
   $server = 'www.paypal.com';
}else{
   $server = 'www.sandbox.paypal.com';
}

$fsocket = false;
$curl = false;
$result = false;

if ((PHP_VERSION >= 4.3) && ($fp = @fsockopen('ssl://' . $server, 443, $errno, $errstr, 30)))   {
     $fsocket = true;
}
elseif (function_exists('curl_exec')) {
   $curl = true;
}
elseif ($fp = @fsockopen($server, 80, $errno, $errstr, 30)) {
    $fsocket = true;
}

if ($fsocket == true) {
    $header = 'POST /cgi-bin/webscr HTTP/1.0' . "\r\n" .
              'Host: ' . $server . "\r\n" .
              'Content-Type: application/x-www-form-urlencoded' . "\r\n" .
              'Content-Length: ' . strlen($parameters) . "\r\n" .
              'Connection: close' . "\r\n\r\n";

    @fputs($fp, $header . $parameters);

    $string = '';
    while (!@feof($fp)) {
      $res = @fgets($fp, 1024);
      $string .= $res;

      if (($res == 'VERIFIED') || ($res == 'INVALID')) {
        $result = $res;
        break;
      }
    }

    @fclose($fp);
}
elseif ($curl == true) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, 'https://' . $server . '/cgi-bin/webscr');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    $result = curl_exec($ch);

    curl_close($ch);
}
 
if(isset($_POST['invoice']) && is_numeric($_POST['invoice']) && ($_POST['invoice'] > 0)) {
     $order_query = xtc_db_query("SELECT   currency, currency_value
                           FROM " . TABLE_ORDERS . "
                           WHERE orders_ident_key = '" . xtc_db_prepare_input($_POST['invoice']) . "'
                         AND customers_id = '" . (int)$_POST['custom'] . "'");
                        
   if(xtc_db_num_rows($order_query) > 0) {
      $order = xtc_db_fetch_array($order_query);
      $total_query = xtc_db_query("SELECT value
                            FROM " . TABLE_ORDERS_TOTAL . "
                            WHERE orders_ident_key = '" . xtc_db_prepare_input($_POST['invoice']) . "'
                            AND class = 'ot_total' limit 1");
      
      $total = xtc_db_fetch_array($total_query);
      
      $comment_status = xtc_db_prepare_input($_POST['payment_status']) . ' ' . xtc_db_prepare_input($_POST['mc_gross']) . xtc_db_prepare_input($_POST['mc_currency']) . '.';
      $comment_status .= ' ' . xtc_db_prepare_input($_POST['first_name']) . ' ' . xtc_db_prepare_input($_POST['last_name']) . ' ' . xtc_db_prepare_input($_POST['payer_email']);
      
      if(isset($_POST['payer_status'])) {
         $comment_status .= ' is ' . xtc_db_prepare_input($_POST['payer_status']);
      }
      
      $comment_status .= '.' . $crlf . $crlf . ' [';
      
      if(isset($_POST['test_ipn']) && is_numeric($_POST['test_ipn']) && ($_POST['test_ipn'] > 0)) {
         $debug = '(Sandbox-Test Mode) ';
      }
      
      $comment_status .= $crlf . 'Fee=' . xtc_db_prepare_input($_POST['mc_fee']) . xtc_db_prepare_input($_POST['mc_currency']);
      
      if(isset($_POST['pending_reason'])) {
         $comment_status .= $crlf . ' Pending Reason=' . xtc_db_prepare_input($_POST['pending_reason']);
      }
      
      if(isset($_POST['reason_code'])) {
         $comment_status .= $crlf . ' Reason Code=' . xtc_db_prepare_input($_POST['reason_code']);
      }
      
      $comment_status .= $crlf . ' Payment=' . xtc_db_prepare_input($_POST['payment_type']);
      $comment_status .= $crlf . ' Date=' . xtc_db_prepare_input($_POST['payment_date']);
      
      if(isset($_POST['parent_txn_id'])) {
         $comment_status .= $crlf . ' ParentID=' . xtc_db_prepare_input($_POST['parent_txn_id']);
      }
      
      $comment_status .= $crlf . ' ID=' . xtc_db_prepare_input($_POST['txn_id']);
      
      //Set status for default (Pending)
      $order_status_id = MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID;
      
      if($result == 'VERIFIED') {
         //Set status for Completed
         if(($_POST['payment_status'] == 'Completed') AND ($_POST['business'] == MODULE_PAYMENT_PAYPAL_IPN_ID) AND ($_POST['mc_gross'] == number_format($total['value'] * $order['currency_value'], $xtPrice->get_decimal_places($order['currency'])))) {
            if (MODULE_PAYMENT_PAYPAL_IPN_ORDER_STATUS_ID > 0) {
               $order_status_id = MODULE_PAYMENT_PAYPAL_IPN_ORDER_STATUS_ID;
            }
         }
         //Set status for Denied, Failed, Refunded or Reversed
         elseif(($_POST['payment_status'] == 'Denied') OR ($_POST['payment_status'] == 'Failed') OR ($_POST['payment_status'] == 'Refunded') OR ($_POST['payment_status'] == 'Reversed')) {
            $order_status_id = MODULE_PAYMENT_PAYPAL_IPN_DENIED_ORDER_STATUS_ID;
         } // if(($_POST['payment_status'] == 'Completed') AND ($_POST['business'] == MODULE_PAYMENT_PAYPAL_IPN_ID) AND ($_POST['mc_gross'] == number_format($total['value'] * $order['currency_value'], $currencies->get_decimal_places($order['currency'])))) elseif(($_POST['payment_status'] == 'Denied') OR ($_POST['payment_status'] == 'Failed') OR ($_POST['payment_status'] == 'Refunded') OR ($_POST['payment_status'] == 'Reversed'))
      }else{
         $debug .= '[INVALID VERIFIED FAILED] ';
         $order_status_id = MODULE_PAYMENT_PAYPAL_IPN_DENIED_ORDER_STATUS_ID;
         $error_reason = 'Received INVALID responce but invoice and Customer matched.' ;
      }
      
      $comment_status .= ']' ;
      
      xtc_db_query("UPDATE " . TABLE_ORDERS . "
                 SET orders_status = '" . $order_status_id . "',
                    last_modified = now()
                 WHERE orders_id = '" . xtc_db_prepare_input($_POST['invoice']) . "'");
      
      $sql_data_array = array('orders_id' => xtc_db_prepare_input($_POST['invoice']),
                        'orders_status_id' => $order_status_id,
                        'date_added' => 'now()',
                        'customer_notified' => '0',
                        'comments' => 'PayPal IPN ' . $debug . $comment_status . '');
      
      xtc_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
   }else{
      $error_reason = 'No order found for invoice=' . xtc_db_prepare_input($_POST['invoice']) . ' with customer=' . (int)$_POST['custom'] . '.' ;
   }
}else{
      $error_reason = 'No invoice id found on received data.' ;
}

if(xtc_not_null(MODULE_PAYMENT_PAYPAL_IPN_DEBUG_EMAIL) && strlen($error_reason)) {
   $email_body = $error_reason . "\n\n";
   $email_body .= $_SERVER["REQUEST_METHOD"] . " - " .$_SERVER["REMOTE_ADDR"] . " - " .$_SERVER["HTTP_REFERER"] . " - " .$_SERVER["HTTP_ACCEPT"] . "\n\n";
   $email_body .= '$_POST:' . "\n\n";

   foreach($_POST as $key => $value) {
      $email_body .= $key . '=' . $value . "\n";
   }
      
   $email_body .= "\n" . '$_GET:' . "\n\n";

   foreach ($_GET as $key => $value) {
      $email_body .= $key . '=' . $value . "\n";
   }

   xtc_php_mail(
      EMAIL_BILLING_ADDRESS,
      EMAIL_BILLING_NAME,
      MODULE_PAYMENT_PAYPAL_IPN_DEBUG_EMAIL,
      MODULE_PAYMENT_PAYPAL_IPN_DEBUG_EMAIL,
      '',
      EMAIL_BILLING_ADDRESS,
      EMAIL_BILLING_NAME,
      false,
      false,
      'PayPal IPN Invalid Process',
      $email_body,
      $email_body
   );
}
require('includes/application_bottom.php');
?>
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Webdesign-Forum Foren-Übersicht -> osCommerce Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de
RedSilver 1.03 Theme was programmed by DEVPPL JavaScript Forum
Images were made by DEVPPL Flash Games