Version imprimable du sujet

Cliquez ici pour voir ce sujet dans son format original

Forum osCommerce-fr _ Modules de Paiement et de Livraison _ CMCIC Cybermut P@iement 3.0

Écrit par : ThomasB 30 Jun 2010, 10:38

Bonjour à tous,

Mon problème :
Le package d'origine "CMCIC Cybermut P@iement 3.0" ne semble pas permettre la récupération des variables placées dans la table SESSION de OSCOMMERCE, que ce soit celles liées à "$language", "$order", "order_total", etc.
Les mails de confirmation ne sont pas envoyé au client.

Ma démarche
J'ai installé le pack "CMCIC Cybermut P@iement 3.0" sur ma version de OSCOMMERCE (v2.2 RC1), rentré les variables qui m'ont été fournies par ma banque (CLE, TPE et autres). Pour information, après avoir parcouru les forums, j'utilise bien la version "cmcic_response_rc1.php" (et non "cmcic_response.php").

Résultats
Le dialogue avec la banque fonctionne correctement, ma transaction est enregistrée. Pour autant, toutes les informations liée à la commande coté OSCOMMERCE ne s'enregistrent absolument pas, dans aucune des tables !

Solution temporaire
J'ai donc été contraint de modifier le fichier "cmcic_response_rc1.php" en y ajoutant des variables pour récupérer les valeurs en session :
- $customer_id = $_SESSION['customer_id'];
- $cart = $_SESSION['cart'];
- $language = $_SESSION['language'];
- ...
Pour autant, je n'arrive pas a récupérer toutes les informations de cette façon.

Je trouve ce fonctionnement vraiment bancale, obliger de créer un patch sur une solution éprouvée.
De doute évidence je pas utiliser la bonne méthode.

Si quelqu'un a déjà rencontré ce problème ou bien pense avoir une solution, alors je serai ravis d'en discuter.
Merci d'avance à tous ceux qui on prit de leur temps pour lire ce post.

Thomas

Écrit par : nilegoff 30 Jun 2010, 11:20

Bonjour,

Le problème je l'ai rencontré aussi.
De la contribution, je n'ai garder que la phase aller.

Pour le retour j'ai reecrit un fichier sur la base de mon checkout process en y incluant mon application top modifier afin de pouvoir recuperer la session qui est en texte libre.
Le fichier doit etre enregistrer sous le nom xyz-cmici.php et declarer comme fichier de retour directement au support technique.


a inclure dans l'application_top que l'on met en debut de fichier
// ********************************************************************************
************************************
// recuperation de l'id de session contenu dans texte-libre
tep_session_id($CMCIC_bruteVars['texte-libre']);
// ********************************************************************************
************************************

Puis reprendre leur fichier retour que l'on met à la fin

nilegoff

Écrit par : ThomasB 30 Jun 2010, 13:16

Merci pour ta réponse nilegoff.

Avant de modifier ma façon de procéder, je voudrais être certain d'un point important.
J'utilise déjà la récupération de l'ID session ( tep_session_id($CMCIC_bruteVars['texte-libre']); ) dans mon fichier "cmcic_response_rc1.php", que j'ai ensuite renommé pour qu'il soit appelé par la banque (lors du retour). Pour autant cela ne me permet pas de faire remonter automatiquement les variable de cession, c'est pourquoi je dois les inscrire à la main ( ex. $cart = $_SESSION['cart']; ).

Est-ce que le fait d'utiliser le fichier "application_top.php" d'origine résout ce problème ? Si oui, pourquoi ??
ou bien est-ce le fait de mettre la récupération de l'ID session en début de fichier ?

D'autre part, puisque tu as l'air d'avoir bien fait le tour de la question, comment cela se fait-il que l'on doive utiliser 2 modules pour remplir les fonctions de connexion bancaire et validation de commande ?

- "Liaison-SSL" pour la récupération du moyen de paiement et la connexion bancaire depuis OSCOMMERCE.
- "CyberMut P@iement" pour la validation de la transaction bancaire (provenant de la banque) et l'insertion des variables de commande dans les tables OSCOMMERCE.

Merci encore pour ta participation !
Thomas

Écrit par : nilegoff 30 Jun 2010, 13:23

Personnellement, je n'utilise pas de liaison SSL entre mon site et la banque (utilité?); la liaison ssl est utile seulement au moment de la communication des infos bancaires, c'est à dire directement sur le site du CIC ou du CM.

Pour recuperer les infos commandes, il suffit de rappeler toutes les infos juste apres l'application_top avec

Code
// if the customer is not logged on, redirect them to the login page
  if (!tep_session_is_registered('customer_id')) {
    $navigation->set_snapshot(array('mode' => 'SSL', 'page' => FILENAME_CHECKOUT_PAYMENT));
    tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
  }

  if (!tep_session_is_registered('sendto')) {
    tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));
  }

  if ( (tep_not_null(MODULE_PAYMENT_INSTALLED)) && (!tep_session_is_registered('payment')) ) {
    tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));
}

// avoid hack attempts during the checkout procedure by checking the internal cartID
  if (isset($cart->cartID) && tep_session_is_registered('cartID')) {
    if ($cart->cartID != $cartID) {
      tep_redirect(tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
    }
  }

  include(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CHECKOUT_PROCESS);

// load selected payment module
// require(DIR_WS_CLASSES . 'payment.php');
//  $payment_modules = new payment($payment);

// load the selected shipping module
  require(DIR_WS_CLASSES . 'shipping.php');
  $shipping_modules = new shipping($shipping);

  require(DIR_WS_CLASSES . 'order.php');
  $order = new order;

  require(DIR_WS_CLASSES . 'order_total.php');
  $order_total_modules = new order_total;

  $order_totals = $order_total_modules->process();


nilegoff

Écrit par : ThomasB 30 Jun 2010, 13:51

Ok, je comprends effectivement qu'il n'est pas nécessaire d'utiliser le module "liaison SSL" pour me connecter à la banque. Le module utile reste donc "CMCIC Cybermut P@iement 3.0" qui permet de valider la transaction avec la banque puis de valider la commande et d'insérer les information dans les tables OSC.

Pour ce qui est de la récupération des informations, je me suis apparemment mal expliqué sur la gestion du fichier réponse (cmcic_response_rc1.php).
Tous les morceaux de code dont tu fais mention sont bien inclus dans le fichier que j'utilise. Tout y est, les "require", les contrôle de session, la récupération de l'ID session, les commandes d'insertion en base, etc.

Le problème est que les variables déclarées dans ce fichier et prévues pour être insérer dans les tables sont vides. La récupération de l'ID session ( tep_session_id($CMCIC_bruteVars['texte-libre']); ) ne permet pas d'en récupérer la valeur.

Exemple pour ORDER : $sql_data_array = array('customers_id' => $customer_id, 'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'], 'customers_company' => $order->customer['company'] ...

Exemple pour ORDER TOTAL : $sql_data_array = array('orders_id' => $insert_id, 'title' => $order_totals[$i]['title'], 'text' => $order_totals[$i]['text'], 'value' => $order_totals[$i]['value'] ...


$customer_id, $order->customer['firstname'], ..., $order_totals[$i]['title'] ... sont vides.

Il me faut déclarer ces variables à la main dans le code :
- $customer_id = $_SESSION['customer_id'];
- $cart = $_SESSION['cart'];
- $language = $_SESSION['language'];
- ...

Je ne sais pas comment faire pour quelles remontent directement, c'est vraiment étrange que le module en question ne prévoit pas cela automatiquement.

J'espère avoir été clair cette fois-ci, merci encore pour ton temps. Si jamais je peux te contacter directement pour éviter de t'en faire perdre plus, je serai ravis de le faire.

Thomas

Écrit par : nilegoff 30 Jun 2010, 14:28

Essaye mon fichier directement: (Partie I car je ne peux tout envoyer dans le meme message)

Code
/*
  $Id: $

  osCommerce, Open Source E-Commerce Solutions
  [url="http://www.oscommerce.com"]http://www.oscommerce.com[/url]

  Copyright © 2007 osCommerce

  Released under the GNU General Public License
*/

// start the timer for the page parse time log
  define('PAGE_PARSE_START_TIME', microtime());

// set the level of error reporting
  error_reporting(E_ALL & ~E_NOTICE);
//  error_reporting(E_ALL | E_STRICT);
// check support for register_globals
  if (function_exists('ini_get') && (ini_get('register_globals') == false) && (PHP_VERSION < 4.3) ) {
    exit('Server Requirement Error: register_globals is disabled in your PHP configuration. This can be enabled in your php.ini configuration file or in the .htaccess file in your catalog directory. Please use PHP 4.3+ if register_globals cannot be enabled on the server.');
  }

// Set the local configuration parameters - mainly for developers
  if (file_exists('includes/local/configure.php')) include('includes/local/configure.php');

// include server parameters
  require('includes/configure.php');

  if (strlen(DB_SERVER) < 1) {
    if (is_dir('install')) {
      header('Location: install/index.php');
    }
  }

// define the project version
  define('PROJECT_VERSION', 'osCommerce Online Merchant v2.2 RC1 W3C Valid FR');

// some code to solve compatibility issues
  require(DIR_WS_FUNCTIONS . 'compatibility.php');

// set the type of request (secure or not)
  $request_type = (getenv('HTTPS') == 'on') ? 'SSL' : 'NONSSL';

// set php_self in the local scope
  if (!isset($PHP_SELF)) $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF'];
  
  
$request_method = $_SERVER["REQUEST_METHOD"];
$wRequestVars = "_" . $request_method;
$CMCIC_bruteVars = ${$wRequestVars};



  if ($request_type == 'NONSSL') {
    define('DIR_WS_CATALOG', DIR_WS_HTTP_CATALOG);
  } else {
    define('DIR_WS_CATALOG', DIR_WS_HTTPS_CATALOG);
  }

// include the list of project filenames
  require(DIR_WS_INCLUDES . 'filenames.php');

// include the list of project database tables
  require(DIR_WS_INCLUDES . 'database_tables.php');

// customization for the design layout
  define('BOX_WIDTH', 125); // how wide the boxes should be in pixels (default: 125)

// include the database functions
  require(DIR_WS_FUNCTIONS . 'database.php');

// make a connection to the database... now
  tep_db_connect() or die('Connexion impossible à la Base de Données!');

// set the application parameters
  $configuration_query = tep_db_query('select configuration_key as cfgKey, configuration_value as cfgValue from ' . TABLE_CONFIGURATION);
  $config_flag_in = array('Oui', 'Non');
  $config_flag_out = array('true', 'false');
  while ($configuration = tep_db_fetch_array($configuration_query)) {
    $configuration['cfgValue'] = str_replace($config_flag_in, $config_flag_out, $configuration['cfgValue']);
    define($configuration['cfgKey'], $configuration['cfgValue']);
  }

// if gzip_compression is enabled, start to buffer the output
  if ( (GZIP_COMPRESSION == 'true') && ($ext_zlib_loaded = extension_loaded('zlib')) && (PHP_VERSION >= '4') ) {
    if (($ini_zlib_output_compression = (int)ini_get('zlib.output_compression')) < 1) {
      if (PHP_VERSION >= '4.0.4') {
        ob_start('ob_gzhandler');
      } else {
        include(DIR_WS_FUNCTIONS . 'gzip_compression.php');
        ob_start();
        ob_implicit_flush();
      }
    } else {
      ini_set('zlib.output_compression_level', GZIP_LEVEL);
    }
  }

// set the HTTP GET parameters manually if search_engine_friendly_urls is enabled
  if (SEARCH_ENGINE_FRIENDLY_URLS == 'true') {
    if (strlen(getenv('PATH_INFO')) > 1) {
      $GET_array = array();
      $PHP_SELF = str_replace(getenv('PATH_INFO'), '', $PHP_SELF);
      $vars = explode('/', substr(getenv('PATH_INFO'), 1));
      for ($i=0, $n=sizeof($vars); $i<$n; $i++) {
        if (strpos($vars[$i], '[]')) {
          $GET_array[substr($vars[$i], 0, -2)][] = $vars[$i+1];
        } else {
          $HTTP_GET_VARS[$vars[$i]] = $vars[$i+1];
        }
        $i++;
      }

      if (sizeof($GET_array) > 0) {
        while (list($key, $value) = each($GET_array)) {
          $HTTP_GET_VARS[$key] = $value;
        }
      }
    }
  }

// define general functions used application-wide
  require(DIR_WS_FUNCTIONS . 'general.php');
  require(DIR_WS_FUNCTIONS . 'html_output.php');

// set the cookie domain
  $cookie_domain = (($request_type == 'NONSSL') ? HTTP_COOKIE_DOMAIN : HTTPS_COOKIE_DOMAIN);
  $cookie_path = (($request_type == 'NONSSL') ? HTTP_COOKIE_PATH : HTTPS_COOKIE_PATH);

// include cache functions if enabled
  if (USE_CACHE == 'true') include(DIR_WS_FUNCTIONS . 'cache.php');

// include shopping cart class
  require(DIR_WS_CLASSES . 'shopping_cart.php');

// include navigation history class
  require(DIR_WS_CLASSES . 'navigation_history.php');

// check if sessions are supported, otherwise use the php3 compatible session class
  if (!function_exists('session_start')) {
    define('PHP_SESSION_NAME', 'osCsid');
    define('PHP_SESSION_PATH', $cookie_path);
    define('PHP_SESSION_DOMAIN', $cookie_domain);
    define('PHP_SESSION_SAVE_PATH', SESSION_WRITE_DIRECTORY);

    include(DIR_WS_CLASSES . 'sessions.php');
  }

// define how the session functions will be used
  require(DIR_WS_FUNCTIONS . 'sessions.php');

// set the session name and save path
  tep_session_name('osCsid');
  tep_session_save_path(SESSION_WRITE_DIRECTORY);
// ********************************************************************************
************************************
// recuperation de l'id de session contenu dans texte-libre
tep_session_id(substr($CMCIC_bruteVars['texte-libre'],0,26));
// ********************************************************************************
************************************
// set the session cookie parameters
   if (function_exists('session_set_cookie_params')) {
    session_set_cookie_params(0, $cookie_path, $cookie_domain);
  } elseif (function_exists('ini_set')) {
    ini_set('session.cookie_lifetime', '0');
    ini_set('session.cookie_path', $cookie_path);
    ini_set('session.cookie_domain', $cookie_domain);
  }

// set the session ID if it exists
   if (isset($HTTP_POST_VARS[tep_session_name()])) {
     tep_session_id($HTTP_POST_VARS[tep_session_name()]);
   } elseif ( ($request_type == 'SSL') && isset($HTTP_GET_VARS[tep_session_name()]) ) {
     tep_session_id($HTTP_GET_VARS[tep_session_name()]);
   }

// start the session
  $session_started = false;
  if (SESSION_FORCE_COOKIE_USE == 'true') {
    tep_setcookie('cookie_test', 'please_accept_for_session', time()+60*60*24*30, $cookie_path, $cookie_domain);

    if (isset($HTTP_COOKIE_VARS['cookie_test'])) {
      tep_session_start();
      $session_started = true;
    }
  } elseif (SESSION_BLOCK_SPIDERS == 'true') {
    $user_agent = strtolower(getenv('HTTP_USER_AGENT'));
    $spider_flag = false;

    if (tep_not_null($user_agent)) {
      $spiders = file(DIR_WS_INCLUDES . 'spiders.txt');

      for ($i=0, $n=sizeof($spiders); $i<$n; $i++) {
        if (tep_not_null($spiders[$i])) {
          if (is_integer(strpos($user_agent, trim($spiders[$i])))) {
            $spider_flag = true;
            break;
          }
        }
      }
    }

    if ($spider_flag == false) {
      tep_session_start();
      $session_started = true;
    }
  } else {
    tep_session_start();
    $session_started = true;
  }

  if ( ($session_started == true) && (PHP_VERSION >= 4.3) && function_exists('ini_get') && (ini_get('register_globals') == false) ) {
    extract($_SESSION, EXTR_OVERWRITE+EXTR_REFS);
  }

// set SID once, even if empty
  $SID = (defined('SID') ? SID : '');

// verify the ssl_session_id if the feature is enabled
  if ( ($request_type == 'SSL') && (SESSION_CHECK_SSL_SESSION_ID == 'true') && (ENABLE_SSL == true) && ($session_started == true) ) {
    $ssl_session_id = getenv('SSL_SESSION_ID');
    if (!tep_session_is_registered('SSL_SESSION_ID')) {
      $SESSION_SSL_ID = $ssl_session_id;
      tep_session_register('SESSION_SSL_ID');
    }

    if ($SESSION_SSL_ID != $ssl_session_id) {
      tep_session_destroy();
      tep_redirect(tep_href_link(FILENAME_SSL_CHECK));
    }
  }

// verify the browser user agent if the feature is enabled
  if (SESSION_CHECK_USER_AGENT == 'true') {
    $http_user_agent = getenv('HTTP_USER_AGENT');
    if (!tep_session_is_registered('SESSION_USER_AGENT')) {
      $SESSION_USER_AGENT = $http_user_agent;
      tep_session_register('SESSION_USER_AGENT');
    }

    if ($SESSION_USER_AGENT != $http_user_agent) {
      tep_session_destroy();
      tep_redirect(tep_href_link(FILENAME_LOGIN));
    }
  }

// verify the IP address if the feature is enabled
  if (SESSION_CHECK_IP_ADDRESS == 'true') {
    $ip_address = tep_get_ip_address();
    if (!tep_session_is_registered('SESSION_IP_ADDRESS')) {
      $SESSION_IP_ADDRESS = $ip_address;
      tep_session_register('SESSION_IP_ADDRESS');
    }

    if ($SESSION_IP_ADDRESS != $ip_address) {
      tep_session_destroy();
      tep_redirect(tep_href_link(FILENAME_LOGIN));
    }
  }

// create the shopping cart & fix the cart if necesary
  if (tep_session_is_registered('cart') && is_object($cart)) {
    if (PHP_VERSION < 4) {
      $broken_cart = $cart;
      $cart = new shoppingCart;
      $cart->unserialize($broken_cart);
    }
  } else {
    tep_session_register('cart');
    $cart = new shoppingCart;
  }

// include currencies class and create an instance
  require(DIR_WS_CLASSES . 'currencies.php');
  $currencies = new currencies();

// include the mail classes
  require(DIR_WS_CLASSES . 'mime.php');
  require(DIR_WS_CLASSES . 'email.php');

// set the language
  if (!tep_session_is_registered('language') || isset($HTTP_GET_VARS['language'])) {
    if (!tep_session_is_registered('language')) {
      tep_session_register('language');
      tep_session_register('languages_id');
    }

    include(DIR_WS_CLASSES . 'language.php');
    $lng = new language();

    if (isset($HTTP_GET_VARS['language']) && tep_not_null($HTTP_GET_VARS['language'])) {
      $lng->set_language($HTTP_GET_VARS['language']);
    } else {
      $lng->get_browser_language();
    }

    $language = $lng->language['directory'];
    $languages_id = $lng->language['id'];
  }

// include the language translations
  require(DIR_WS_LANGUAGES . $language . '.php');

// Ultimate SEO URLs v2.1
  if ((!defined(SEO_ENABLED)) || (SEO_ENABLED == 'true')) {
    include_once(DIR_WS_CLASSES . 'seo.class.php');
    if ( !is_object($seo_urls) ){
      $seo_urls = new SEO_URL($languages_id);
    }
  }

// currency
  if (!tep_session_is_registered('currency') || isset($HTTP_GET_VARS['currency']) || ( (USE_DEFAULT_LANGUAGE_CURRENCY == 'true') && (LANGUAGE_CURRENCY != $currency) ) ) {
    if (!tep_session_is_registered('currency')) tep_session_register('currency');

    if (isset($HTTP_GET_VARS['currency']) && $currencies->is_set($HTTP_GET_VARS['currency'])) {
      $currency = $HTTP_GET_VARS['currency'];
    } else {
      $currency = (USE_DEFAULT_LANGUAGE_CURRENCY == 'true') ? LANGUAGE_CURRENCY : DEFAULT_CURRENCY;
    }
  }

// navigation history
  if (tep_session_is_registered('navigation')) {
    if (PHP_VERSION < 4) {
      $broken_navigation = $navigation;
      $navigation = new navigationHistory;
      $navigation->unserialize($broken_navigation);
    }
  } else {
    tep_session_register('navigation');
    $navigation = new navigationHistory;
  }
  $navigation->add_current_page();

// Shopping cart actions
  if (isset($HTTP_GET_VARS['action'])) {
// redirect the customer to a friendly cookie-must-be-enabled page if cookies are disabled
    if ($session_started == false) {
      tep_redirect(tep_href_link(FILENAME_COOKIE_USAGE));
    }

    if (DISPLAY_CART == 'true') {
      $goto =  FILENAME_SHOPPING_CART;
      $parameters = array('action', 'cPath', 'products_id', 'pid');
    } else {
      $goto = basename($PHP_SELF);
      if ($HTTP_GET_VARS['action'] == 'buy_now') {
        $parameters = array('action', 'pid', 'products_id');
      } else {
        $parameters = array('action', 'pid');
      }
    }
    switch ($HTTP_GET_VARS['action']) {
      // customer wants to update the product quantity in their shopping cart
      case 'update_product' : for ($i=0, $n=sizeof($HTTP_POST_VARS['products_id']); $i<$n; $i++) {
                                if (in_array($HTTP_POST_VARS['products_id'][$i], (is_array($HTTP_POST_VARS['cart_delete']) ? $HTTP_POST_VARS['cart_delete'] : array()))) {
                                  $cart->remove($HTTP_POST_VARS['products_id'][$i]);
                                } else {
                                  if (PHP_VERSION < 4) {
                                    // if PHP3, make correction for lack of multidimensional array.
                                    reset($HTTP_POST_VARS);
                                    while (list($key, $value) = each($HTTP_POST_VARS)) {
                                      if (is_array($value)) {
                                        while (list($key2, $value2) = each($value)) {
                                          if (ereg ("(.*)\]\[(.*)", $key2, $var)) {
                                            $id2[$var[1]][$var[2]] = $value2;
                                          }
                                        }
                                      }
                                    }
                                    $attributes = ($id2[$HTTP_POST_VARS['products_id'][$i]]) ? $id2[$HTTP_POST_VARS['products_id'][$i]] : '';
                                  } else {
                                    $attributes = ($HTTP_POST_VARS['id'][$HTTP_POST_VARS['products_id'][$i]]) ? $HTTP_POST_VARS['id'][$HTTP_POST_VARS['products_id'][$i]] : '';
                                  }
                                  $cart->add_cart($HTTP_POST_VARS['products_id'][$i], $HTTP_POST_VARS['cart_quantity'][$i], $attributes, false);
                                }
                              }
                              tep_redirect(tep_href_link($goto, tep_get_all_get_params($parameters)));
                              break;
      // customer adds a product from the products page
      case 'add_product' :    if (isset($HTTP_POST_VARS['products_id']) && is_numeric($HTTP_POST_VARS['products_id'])) {
                                $cart->add_cart($HTTP_POST_VARS['products_id'], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'], $HTTP_POST_VARS['id']))+1, $HTTP_POST_VARS['id']);
                              }
                              tep_redirect(tep_href_link($goto, tep_get_all_get_params($parameters)));
                              break;
    // BOF: Product Listing in Columns
    // add to cart
      case 'buy_now_form' :   if (isset($HTTP_POST_VARS['products_id']) && is_numeric($HTTP_POST_VARS['products_id'])) {
                                $cart->add_cart($HTTP_POST_VARS['products_id'], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'], $HTTP_POST_VARS['id']))+($HTTP_POST_VARS['cart_quantity']), $HTTP_POST_VARS['id']);
                              }
                              tep_redirect(tep_href_link($goto, tep_get_all_get_params($parameters)));
                              break;
    // customer adds multiple products from the products_listing page
      case 'add_multiple' :   while (list($key, $val) = each($HTTP_POST_VARS)) {
                                if (substr($key,0,11) == "Qty_ProdId_" || substr($key,0,11) == "Qty_NPrdId_") {
                                  $prodId = substr($key, 11);
                                  $qty = $val;
                                  if ($qty <= 0) continue;
                                  if (isset($HTTP_POST_VARS["id_$prodId"]) && is_array($HTTP_POST_VARS["id_$prodId"])) {
                                  // We have attributes
                                    $cart->add_cart($prodId, $cart->get_quantity(tep_get_uprid($prodId,$HTTP_POST_VARS["id_$prodId"]))+$qty, $HTTP_POST_VARS["id_$prodId"]);
                                  } else {
                                    // No attributes
                                    $cart->add_cart($prodId, $cart->get_quantity($prodId)+$qty);
                                  }
                                }
                              }
                              tep_redirect(tep_href_link($goto, tep_get_all_get_params($parameters)));
                              break;
    // BOF: Product Listing in Columns
      // performed by the 'buy now' button in product listings and review page
      case 'buy_now' :        if (isset($HTTP_GET_VARS['products_id'])) {
                                if (tep_has_product_attributes($HTTP_GET_VARS['products_id'])) {
                                  tep_redirect(tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['products_id']));
                                } else {
                                  $cart->add_cart($HTTP_GET_VARS['products_id'], $cart->get_quantity($HTTP_GET_VARS['products_id'])+1);
                                }
                              }
                              tep_redirect(tep_href_link($goto, tep_get_all_get_params($parameters)));
                              break;
      case 'notify' :         if (tep_session_is_registered('customer_id')) {
                                if (isset($HTTP_GET_VARS['products_id'])) {
                                  $notify = $HTTP_GET_VARS['products_id'];
                                } elseif (isset($HTTP_GET_VARS['notify'])) {
                                  $notify = $HTTP_GET_VARS['notify'];
                                } elseif (isset($HTTP_POST_VARS['notify'])) {
                                  $notify = $HTTP_POST_VARS['notify'];
                                } else {
                                  tep_redirect(tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action', 'notify'))));
                                }
                                if (!is_array($notify)) $notify = array($notify);
                                for ($i=0, $n=sizeof($notify); $i<$n; $i++) {
                                  $check_query = tep_db_query("select count(*) as count from " . TABLE_PRODUCTS_NOTIFICATIONS . " where products_id = '" . $notify[$i] . "' and customers_id = '" . $customer_id . "'");
                                  $check = tep_db_fetch_array($check_query);
                                  if ($check['count'] < 1) {
                                    tep_db_query("insert into " . TABLE_PRODUCTS_NOTIFICATIONS . " (products_id, customers_id, date_added) values ('" . $notify[$i] . "', '" . $customer_id . "', now())");
                                  }
                                }
                                tep_redirect(tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action', 'notify'))));
                              } else {
                                $navigation->set_snapshot();
                                tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
                              }
                              break;
      case 'notify_remove' :  if (tep_session_is_registered('customer_id') && isset($HTTP_GET_VARS['products_id'])) {
                                $check_query = tep_db_query("select count(*) as count from " . TABLE_PRODUCTS_NOTIFICATIONS . " where products_id = '" . $HTTP_GET_VARS['products_id'] . "' and customers_id = '" . $customer_id . "'");
                                $check = tep_db_fetch_array($check_query);
                                if ($check['count'] > 0) {
                                  tep_db_query("delete from " . TABLE_PRODUCTS_NOTIFICATIONS . " where products_id = '" . $HTTP_GET_VARS['products_id'] . "' and customers_id = '" . $customer_id . "'");
                                }
                                tep_redirect(tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action'))));
                              } else {
                                $navigation->set_snapshot();
                                tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
                              }
                              break;
      case 'cust_order' :     if (tep_session_is_registered('customer_id') && isset($HTTP_GET_VARS['pid'])) {
                                if (tep_has_product_attributes($HTTP_GET_VARS['pid'])) {
                                  tep_redirect(tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['pid']));
                                } else {
                                  $cart->add_cart($HTTP_GET_VARS['pid'], $cart->get_quantity($HTTP_GET_VARS['pid'])+1);
                                }
                              }
                              tep_redirect(tep_href_link($goto, tep_get_all_get_params($parameters)));
                              break;
    }
  }

// include the who's online functions
  require(DIR_WS_FUNCTIONS . 'whos_online.php');
  tep_update_whos_online();

// include the password crypto functions
  require(DIR_WS_FUNCTIONS . 'password_funcs.php');

// include validation functions (right now only email address)
  require(DIR_WS_FUNCTIONS . 'validations.php');

// split-page-results
  require(DIR_WS_CLASSES . 'split_page_results.php');

(Fin de la partie I)

Mais attention, il est basé sur mon application_top et devra peut etre modifié un peu vis a vis des utilisateurs ulterieurs.
Pa contre, modifier le nom du repertoire appelé 'REPERTOIRE_CMCIC' dans les requires

Bon courrage
(pour infos, comme je n'arrivais pas à faire fonctionner le fichier retour de la contribution, j'en ai ecrit un mois meme)
Nico

Écrit par : nilegoff 30 Jun 2010, 14:30

Partie II (la Suite du code)

Code
// infobox
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//Site thema configuration
  $configuration_query = tep_db_query("select  configuration_key as themaKey, configuration_value as themaValue from " . TABLE_CONFIGURATION . " where configuration_key = 'SITE_THEMA'");
  $configuration = tep_db_fetch_array($configuration_query);
  define($configuration['themaKey'], $configuration['themaValue']);
  if($configuration['themaKey']==""){
  define(THEMA_STYLE, "stylesheet.css");
  // infobox
  require(DIR_WS_CLASSES . 'boxes.php'); }
  else{
  // Thema_infobox
  require(DIR_WS_CLASSES . 'thema_boxes.php');
  define(THEMA_STYLE, DIR_WS_CLASSES . "thema/" . SITE_THEMA . "/stylesheet.css");
  }
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

// auto activate and expire banners
  require(DIR_WS_FUNCTIONS . 'banner.php');
  tep_activate_banners();
  tep_expire_banners();

// auto expire special products
  require(DIR_WS_FUNCTIONS . 'specials.php');
  tep_expire_specials();

// calculate category path
  if (isset($HTTP_GET_VARS['cPath'])) {
    $cPath = $HTTP_GET_VARS['cPath'];
  } elseif (isset($HTTP_GET_VARS['products_id']) && !isset($HTTP_GET_VARS['manufacturers_id'])) {
    $cPath = tep_get_product_path($HTTP_GET_VARS['products_id']);
  } else {
    $cPath = '';
  }

  if (tep_not_null($cPath)) {
    $cPath_array = tep_parse_category_path($cPath);
    $cPath = implode('_', $cPath_array);
    $current_category_id = $cPath_array[(sizeof($cPath_array)-1)];
  } else {
    $current_category_id = 0;
  }

// include the breadcrumb class and start the breadcrumb trail
  require(DIR_WS_CLASSES . 'breadcrumb.php');
  $breadcrumb = new breadcrumb;

  $breadcrumb->add(' ', HTTP_SERVER);
  //$breadcrumb->add(HEADER_TITLE_CATALOG, tep_href_link(FILENAME_DEFAULT));





// initialize the message stack for output messages
  require(DIR_WS_CLASSES . 'message_stack.php');
  $messageStack = new messageStack;

// set which precautions should be checked
  define('WARN_INSTALL_EXISTENCE', 'true');
  define('WARN_CONFIG_WRITEABLE', 'true');
  define('WARN_SESSION_DIRECTORY_NOT_WRITEABLE', 'true');
  define('WARN_SESSION_AUTO_START', 'true');
  define('WARN_DOWNLOAD_DIRECTORY_NOT_READABLE', 'true');
  
  require_once(DIR_WS_CLASSES . 'preventDuplicates.php');
    $preventDuplicates = new preventDuplicates();
?>

<?
/*****************************************************************************
*
* "Open source" kit for CM-CIC P@iement(TM).
* Process CMCIC Payment. Sample RFC2104 compliant with PHP4 skeleton.
*
* File "Phase2Retour.php":
*
* Author   : Euro-Information/e-Commerce (contact: centrecom@e-i.com)
* Version  : 1.04
* Date     : 01/01/2009
*
* Copyright: (c) 2009 Euro-Information. All rights reserved.
* License  : see attached document "Licence.txt".
*
*****************************************************************************/
          tep_session_unregister('ip_adresse');
        $ip = $ip_address;
        $client = gethostbyaddr($ip_address);
        $str = preg_split("/\./", $client);
        $i = count($str);
        $x = $i - 1;
        $n = $i - 2;
        $isp = $str[$n] . "." . $str[$x];
// include('includes/application_top.php');

// if the customer is not logged on, redirect them to the login page
  if (!tep_session_is_registered('customer_id')) {
    $navigation->set_snapshot(array('mode' => 'SSL', 'page' => FILENAME_CHECKOUT_PAYMENT));
    tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
  }

  if (!tep_session_is_registered('sendto')) {
    tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));
  }

  if ( (tep_not_null(MODULE_PAYMENT_INSTALLED)) && (!tep_session_is_registered('payment')) ) {
    tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));
}

// avoid hack attempts during the checkout procedure by checking the internal cartID
  if (isset($cart->cartID) && tep_session_is_registered('cartID')) {
    if ($cart->cartID != $cartID) {
      tep_redirect(tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
    }
  }

  include(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CHECKOUT_PROCESS);

// load selected payment module
// require(DIR_WS_CLASSES . 'payment.php');
//  $payment_modules = new payment($payment);

// load the selected shipping module
  require(DIR_WS_CLASSES . 'shipping.php');
  $shipping_modules = new shipping($shipping);

  require(DIR_WS_CLASSES . 'order.php');
  $order = new order;

  require(DIR_WS_CLASSES . 'order_total.php');
  $order_total_modules = new order_total;

  $order_totals = $order_total_modules->process();


// TPE Settings
// Warning !! CMCIC_Config contains the key, you have to protect this file with all the mechanism available in your development environment.
// You may for instance put this file in another directory and/or change its name. If so, don't forget to adapt the include path below.

require_once("REPERTOIRE_CMCIC/CMCIC_Config.php");

// --- PHP implementation of RFC2104 hmac sha1 ---
require_once("REPERTOIRE_CMCIC/CMCIC_Tpe.inc.php");


// Begin Main : Retrieve Variables posted by CMCIC Payment Server
$CMCIC_bruteVars = getMethode();

// TPE init variables
$oTpe = new CMCIC_Tpe();
$oHmac = new CMCIC_Hmac($oTpe);

// Message Authentication
$cgi2_fields = sprintf(CMCIC_CGI2_FIELDS, $oTpe->sNumero,
                      $CMCIC_bruteVars["date"],
                          $CMCIC_bruteVars['montant'],
                          $CMCIC_bruteVars['reference'],
                          $CMCIC_bruteVars['texte-libre'],
                          $oTpe->sVersion,
                          $CMCIC_bruteVars['code-retour'],
                      $CMCIC_bruteVars['cvx'],
                      $CMCIC_bruteVars['vld'],
                      $CMCIC_bruteVars['brand'],
                      $CMCIC_bruteVars['status3ds'],
                      $CMCIC_bruteVars['numauto'],
                      $CMCIC_bruteVars['motifrefus'],
                      $CMCIC_bruteVars['originecb'],
                      $CMCIC_bruteVars['bincb'],
                      $CMCIC_bruteVars['hpancb'],
                      $CMCIC_bruteVars['ipclient'],
                      $CMCIC_bruteVars['originetr'],
                      $CMCIC_bruteVars['veres'],
                      $CMCIC_bruteVars['pares']
                    );


if ($oHmac->computeHmac($cgi2_fields) == strtolower($CMCIC_bruteVars['MAC']))
    {
    switch($CMCIC_bruteVars['code-retour']) {
        case "Annulation" :
                //________________________________________________________________________________
_____________________
                // on archive les données reçues de la banque dans la table cmcic_response
                tep_db_perform('cmcic_response', array(
                    'ref_number' => tep_db_input($CMCIC_bruteVars['reference']),
                    //'MAC' => $CMCIC_bruteVars['MAC'],
                    'TPE' => tep_db_input($CMCIC_bruteVars['TPE']),
                    'date' => tep_db_input($CMCIC_bruteVars['date']),
                    'montant' => tep_db_input($CMCIC_bruteVars['montant']),
                    'texte_libre' => tep_db_input($CMCIC_bruteVars['texte-libre']),
                    'motifrefus' => tep_db_input($CMCIC_bruteVars['motifrefus']),
                    'cvx' => tep_db_input($CMCIC_bruteVars['cvx']),
                    'vld' => tep_db_input($CMCIC_bruteVars['vld']),
                    'brand' => tep_db_input($CMCIC_bruteVars['brand']),
                    'status3ds' => tep_db_input($CMCIC_bruteVars['status3ds']),
                    'originecb' => tep_db_input($CMCIC_bruteVars['originecb']),
                    'bincb' => tep_db_input($CMCIC_bruteVars['bincb']),
                    'ipclient' => tep_db_input($CMCIC_bruteVars['ipclient']),
                    'originetr' => tep_db_input($CMCIC_bruteVars['originetr']),
                    'hpancb' => tep_db_input($CMCIC_bruteVars['hpancb']),
                    'code_retour' => tep_db_input($CMCIC_bruteVars['code-retour']),
                    'customers_name' => $order->customer['lastname'] . ' ' . $order->customer['firstname'],
                    'custumers_id' => $customer_id));
//________________________________________________________________________________
_________________________
                    break;

        case "payetest":
        
//  $payment_modules->before_process();

  $sql_data_array = array('customers_id' => $customer_id,
                          'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'],
                          'customers_company' => $order->customer['company'],
                          'customers_street_address' => $order->customer['street_address'],
                          'customers_suburb' => $order->customer['suburb'],
                          'customers_city' => $order->customer['city'],
                          'customers_postcode' => $order->customer['postcode'],
                          'customers_state' => $order->customer['state'],
                          'customers_country' => $order->customer['country']['title'],
                          'customers_telephone' => $order->customer['telephone'],
                          'customers_fax' => $order->customer['fax'],
                          'customers_email_address' => $order->customer['email_address'],
                          'customers_address_format_id' => $order->customer['format_id'],
                          'delivery_name' => $order->delivery['firstname'] . ' ' . $order->delivery['lastname'],
                          'delivery_company' => $order->delivery['company'],
                          'delivery_street_address' => $order->delivery['street_address'],
                          'delivery_suburb' => $order->delivery['suburb'],
                          'delivery_city' => $order->delivery['city'],
                          'delivery_postcode' => $order->delivery['postcode'],
                          'delivery_state' => $order->delivery['state'],
                          'delivery_country' => $order->delivery['country']['title'],
                          'delivery_address_format_id' => $order->delivery['format_id'],
                          'billing_name' => $order->billing['firstname'] . ' ' . $order->billing['lastname'],
                          'billing_company' => $order->billing['company'],
                          'billing_street_address' => $order->billing['street_address'],
                          'billing_suburb' => $order->billing['suburb'],
                          'billing_city' => $order->billing['city'],
                          'billing_postcode' => $order->billing['postcode'],
                          'billing_state' => $order->billing['state'],
                          'billing_country' => $order->billing['country']['title'],
                          'billing_address_format_id' => $order->billing['format_id'],
                          'sms' => $order->info['sms'],
                'payment_method' => '*** Carte Bancaire Test ***',
                'transaction_id' => tep_db_input($CMCIC_bruteVars['numauto']),
                'complementary_info' => tep_db_input($CMCIC_bruteVars['status3ds']).'|'.tep_db_input($CMCIC_bruteVars['originecb']).'|'.tep_db_input($CMCIC_bruteVars['hpancb']).'|'.tep_db_input($CMCIC_bruteVars['ipclient']).'|'.tep_db_input($CMCIC_bruteVars['originetr']),
                'cc_type' => tep_db_input($CMCIC_bruteVars['brand']),
                'cc_owner' => tep_db_input($CMCIC_bruteVars['reference']),
                'cc_number' => substr(tep_db_input($CMCIC_bruteVars['bincb']),0,4).' #### #### ##'.substr(tep_db_input($CMCIC_bruteVars['bincb']),4,2),
                'cc_bin' => tep_db_input($CMCIC_bruteVars['bincb']),
                'cc_expires' => tep_db_input($CMCIC_bruteVars['vld']),
                'date_purchased' => 'now()',
                'orders_status' => '1',
                'ip' => $ip,
                'isp' => $isp,
                'currency' => $order->info['currency'],
                'customers_referer_url' => $referer_url,
                'shipping_module' => $shipping['id'],
                'currency_value' => $order->info['currency_value']);
  tep_db_perform(TABLE_ORDERS, $sql_data_array);
  $insert_id = tep_db_insert_id();
  for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
    $sql_data_array = array('orders_id' => $insert_id,
                            'title' => $order_totals[$i]['title'],
                            'text' => $order_totals[$i]['text'],
                            'value' => $order_totals[$i]['value'],
                            'class' => $order_totals[$i]['code'],
                            'sort_order' => $order_totals[$i]['sort_order']);
    tep_db_perform(TABLE_ORDERS_TOTAL, $sql_data_array);
  }

  $customer_notification = (SEND_EMAILS == 'true') ? '1' : '0';
  $sql_data_array = array('orders_id' => $insert_id,
                          'orders_status_id' => '1',
                          'date_added' => 'now()',
                          'customer_notified' => $customer_notification,
                          'comments' => $order->info['comments']);
  tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);

// initialized for the email confirmation
  $products_ordered = '';
  $subtotal = 0;
  $total_tax = 0;

  for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
// Stock Update - Joao Correia
    if (STOCK_LIMITED == 'true') {
      if (DOWNLOAD_ENABLED == 'true') {
        $stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename
                            FROM " . TABLE_PRODUCTS . " p
                            LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES . " pa
                             ON p.products_id=pa.products_id
                            LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
                             ON pa.products_attributes_id=pad.products_attributes_id
                            WHERE p.products_id = '" . tep_get_prid($order->products[$i]['id']) . "'";
// Will work with only one option for downloadable products
// otherwise, we have to build the query dynamically with a loop
        $products_attributes = $order->products[$i]['attributes'];
        if (is_array($products_attributes)) {
          $stock_query_raw .= " AND pa.options_id = '" . $products_attributes[0]['option_id'] . "' AND pa.options_values_id = '" . $products_attributes[0]['value_id'] . "'";
        }
        $stock_query = tep_db_query($stock_query_raw);
      } else {
        $stock_query = tep_db_query("select products_quantity from " . TABLE_PRODUCTS . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
      }
      if (tep_db_num_rows($stock_query) > 0) {
        $stock_values = tep_db_fetch_array($stock_query);
// do not decrement quantities if products_attributes_filename exists
        if ((DOWNLOAD_ENABLED != 'true') || (!$stock_values['products_attributes_filename'])) {
          $stock_left = $stock_values['products_quantity'] - $order->products[$i]['qty'];
        } else {
          $stock_left = $stock_values['products_quantity'];
        }

        tep_db_query("update " . TABLE_PRODUCTS . " set products_quantity = '" . $stock_left . "' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
        
        $desactive_query = mysql_query("SELECT conditionnement from products where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
        while($row = mysql_fetch_array($desactive_query))
       {
        if ($row[conditionnement]==-100) {
        if ( ($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false') ) { // pour annuler disparition produit qd stock=0; $stock_left < 1 est devenu $stock_left < 0
          tep_db_query("update " . TABLE_PRODUCTS . " set products_status = '0' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
        }}
        else {
        if ( ($stock_left < 0) && (STOCK_ALLOW_CHECKOUT == 'false') ) { // pour annuler disparition produit qd stock=0; $stock_left < 1 est devenu $stock_left < 0
          tep_db_query("update " . TABLE_PRODUCTS . " set products_status = '0' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
        }}}
      }
    }

Écrit par : nilegoff 30 Jun 2010, 14:34

Partie 3 et FIN

Code
// Update products_ordered (for bestsellers list)
    tep_db_query("update " . TABLE_PRODUCTS . " set products_ordered = products_ordered + " . sprintf('%d', $order->products[$i]['qty']) . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");

    $sql_data_array = array('orders_id' => $insert_id,
                            'products_id' => tep_get_prid($order->products[$i]['id']),
                            'products_model' => $order->products[$i]['model'],
                            'products_name' => $order->products[$i]['name'],
                            'products_price' => $order->products[$i]['price'],
                            'final_price' => $order->products[$i]['final_price'],
                            'products_tax' => $order->products[$i]['tax'],
                            'products_quantity' => $order->products[$i]['qty']);
    tep_db_perform(TABLE_ORDERS_PRODUCTS, $sql_data_array);
    $order_products_id = tep_db_insert_id();

//------insert customer choosen option to order--------
    $attributes_exist = '0';
    $products_ordered_attributes = '';
    if (isset($order->products[$i]['attributes'])) {
      $attributes_exist = '1';
      for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
        if (DOWNLOAD_ENABLED == 'true') {
          $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
                               from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa
                               left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
                                on pa.products_attributes_id=pad.products_attributes_id
                               where pa.products_id = '" . $order->products[$i]['id'] . "'
                                and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "'
                                and pa.options_id = popt.products_options_id
                                and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "'
                                and pa.options_values_id = poval.products_options_values_id
                                and popt.language_id = '" . $languages_id . "'
                                and poval.language_id = '" . $languages_id . "'";
          $attributes = tep_db_query($attributes_query);
        } else {
          $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . $order->products[$i]['id'] . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $languages_id . "' and poval.language_id = '" . $languages_id . "'");
        }
        $attributes_values = tep_db_fetch_array($attributes);

        $sql_data_array = array('orders_id' => $insert_id,
                                'orders_products_id' => $order_products_id,
                                'products_options' => $attributes_values['products_options_name'],
                                'products_options_values' => $attributes_values['products_options_values_name'],
                                'options_values_price' => $attributes_values['options_values_price'],
                                'price_prefix' => $attributes_values['price_prefix']);
        tep_db_perform(TABLE_ORDERS_PRODUCTS_ATTRIBUTES, $sql_data_array);

        if ((DOWNLOAD_ENABLED == 'true') && isset($attributes_values['products_attributes_filename']) && tep_not_null($attributes_values['products_attributes_filename'])) {
          $sql_data_array = array('orders_id' => $insert_id,
                                  'orders_products_id' => $order_products_id,
                                  'orders_products_filename' => $attributes_values['products_attributes_filename'],
                                  'download_maxdays' => $attributes_values['products_attributes_maxdays'],
                                  'download_count' => $attributes_values['products_attributes_maxcount']);
          tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
        }
        $products_ordered_attributes .= "\n\t" . $attributes_values['products_options_name'] . ' ' . $attributes_values['products_options_values_name'];
      }
    }
//------insert customer choosen option eof ----
    $total_weight += ($order->products[$i]['qty'] * $order->products[$i]['weight']);
    $total_tax += tep_calculate_tax($total_products_price, $products_tax) * $order->products[$i]['qty'];
    $total_cost += $total_products_price;

    $products_ordered .= "<tr><td><FONT color=#000000 size=2 face=Arial>".$order->products[$i]['qty'] . "</font></td><td><FONT color=#000000 size=2 face=Arial>x</font></td><td><FONT color=#000000 size=2 face=Arial>" . $order->products[$i]['name'] . "</font></td><td align='right'><FONT color=#000000 size=2 face=Arial>" . $currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']) . $products_ordered_attributes . "</font></td></tr>\n";
  }

// lets start with the email confirmation

$email_order  =   "<a href=\"http://www.ton-site.com\"><img src=\"http://www.ton-site.com/images/ton_logo.jpg\" alt=\"ton-site.com\" border=\"0\"></a><br><br><FONT color=#000000 size=2 face=Arial>Bonjour ".$order->customer['firstname'] . " " . $order->customer['lastname']."\n\n";
  $email_order .= "ton-site.com a bien enregistr&eacute; votre commande\n</FONT>";                
     $email_order .="<table border='1' width='600px' bordercolor='#000000' cellpadding='10'  cellspacing='0'><tr><td width='300px'><FONT color=#000000 size=2 face=Arial>Commande n°" . $insert_id . "</font></td><td width='300px' align='right'><FONT color=#000000 size=2 face=Arial>Date de Commande: ". strftime(DATE_FORMAT_SHORT) . "</font></td></tr>\n";
$email_order .="<tr><td colspan='2' align='center'><FONT color=#000000 size=2 face=Arial>Contact: <u>".$order->customer['email_address']."</u></font></td></tr>";
  
      $email_order .="<tr><td width='300px' valign='top'><FONT color=#000000 size=2 face=Arial>";
  if ($order->content_type != 'virtual') {
    $email_order .=  "<b><u>".EMAIL_TEXT_DELIVERY_ADDRESS . "</u>:</b><br>" .
                    tep_address_label($customer_id, $sendto, 0, '', "<br>") . "<br>";
  }
$email_order .="</font></td><td width='300px' valign='top'><FONT color=#000000 size=2 face=Arial>";
  $email_order .=  "<b></u>".EMAIL_TEXT_BILLING_ADDRESS . "</u>:</b><br>" .
                  tep_address_label($customer_id, $billto, 0, '', "<br>") . "<br>";
                  
$email_order .="</font></td></tr>\n";    

  
  $email_order .= "<tr><td colspan='2'><FONT color=#000000 size=2 face=Arial><b><u>Liste des produits command&eacute;s</u>:</b><br>" .
                  "<br><table width='100%' border='0'>".$products_ordered . "\n";
                  
  $email_order .="<tr><td colspan='3'>&nbsp;</td><td align='right'>__________</font></tr> ";
for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
    $email_order .= "<tr><td align='right' colspan='3'><FONT color=#000000 size=2 face=Arial>".strip_tags($order_totals[$i]['title']) . "</font></td><td align='right'><FONT color=#000000 size=2 face=Arial>" . strip_tags($order_totals[$i]['text']) . "</font></td></tr>";
  }
    $email_order .="</table></td></tr>\n";
    
  if ($order->info['comments']) {
    $email_order .= "<tr><td colspan='2'><FONT color=#000000 size=2 face=Arial><b><u>Commentaire</u>:</b><br> ".strip_tags(tep_db_output($order->info['comments']),'<br>') . "</font></td></tr>\n";
  }
  

   $email_order .="<tr><td colspan='2' align='left'><FONT color=#000000 size=2 face=Arial><b><u>".EMAIL_TEXT_PAYMENT_METHOD . "</u>:</b> Carte Bancaire<br><br>".$textepaiement."</font></td></tr></table>";              

  tep_mail($order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address'], 'Enregistrement de votre commande', $email_order, 'ton-site.com','service.clients@ton-site.com');

// send emails to other people
  if (SEND_EXTRA_ORDER_EMAILS_TO != '') {
   // tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
  }

// load the after_process function from the payment modules
//  $payment_modules->after_process();

  $cart->reset(true);

// unregister session variables used during checkout
  tep_session_unregister('sendto');
  tep_session_unregister('billto');
  tep_session_unregister('shipping');
  tep_session_unregister('payment');
  tep_session_unregister('comments');
  tep_session_unregister('sms');
            break;

        case "paiement":
//  $payment_modules->before_process();

  $sql_data_array = array('customers_id' => $customer_id,
                          'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'],
                          'customers_company' => $order->customer['company'],
                          'customers_street_address' => $order->customer['street_address'],
                          'customers_suburb' => $order->customer['suburb'],
                          'customers_city' => $order->customer['city'],
                          'customers_postcode' => $order->customer['postcode'],
                          'customers_state' => $order->customer['state'],
                          'customers_country' => $order->customer['country']['title'],
                          'customers_telephone' => $order->customer['telephone'],
                          'customers_fax' => $order->customer['fax'],
                          'customers_email_address' => $order->customer['email_address'],
                          'customers_address_format_id' => $order->customer['format_id'],
                          'delivery_name' => $order->delivery['firstname'] . ' ' . $order->delivery['lastname'],
                          'delivery_company' => $order->delivery['company'],
                          'delivery_street_address' => $order->delivery['street_address'],
                          'delivery_suburb' => $order->delivery['suburb'],
                          'delivery_city' => $order->delivery['city'],
                          'delivery_postcode' => $order->delivery['postcode'],
                          'delivery_state' => $order->delivery['state'],
                          'delivery_country' => $order->delivery['country']['title'],
                          'delivery_address_format_id' => $order->delivery['format_id'],
                          'billing_name' => $order->billing['firstname'] . ' ' . $order->billing['lastname'],
                          'billing_company' => $order->billing['company'],
                          'billing_street_address' => $order->billing['street_address'],
                          'billing_suburb' => $order->billing['suburb'],
                          'billing_city' => $order->billing['city'],
                          'billing_postcode' => $order->billing['postcode'],
                          'billing_state' => $order->billing['state'],
                          'billing_country' => $order->billing['country']['title'],
                          'billing_address_format_id' => $order->billing['format_id'],
                          'sms' => $order->info['sms'],
                'payment_method' => 'Carte Bancaire',
                'transaction_id' => tep_db_input($CMCIC_bruteVars['numauto']),
                'complementary_info' => tep_db_input($CMCIC_bruteVars['status3ds']).'|'.tep_db_input($CMCIC_bruteVars['originecb']).'|'.tep_db_input($CMCIC_bruteVars['hpancb']).'|'.tep_db_input($CMCIC_bruteVars['ipclient']).'|'.tep_db_input($CMCIC_bruteVars['originetr'].'|'.substr(tep_db_input($CMCIC_bruteVars['texte-libre']),29,8)),
                'cc_type' => tep_db_input($CMCIC_bruteVars['brand']),
                'cc_owner' => tep_db_input($CMCIC_bruteVars['reference']),
                'cc_number' => substr(tep_db_input($CMCIC_bruteVars['bincb']),0,4).' #### #### ##'.substr(tep_db_input($CMCIC_bruteVars['bincb']),4,2),
                'cc_bin' => tep_db_input($CMCIC_bruteVars['bincb']),
                'cc_expires' => tep_db_input($CMCIC_bruteVars['vld']),
                'date_purchased' => 'now()',
                'orders_status' => '1',
                'ip' => $ip,
                'isp' => $isp,
                'currency' => $order->info['currency'],
                'customers_referer_url' => $referer_url,
                'shipping_module' => $shipping['id'],
                'currency_value' => $order->info['currency_value']);
  tep_db_perform(TABLE_ORDERS, $sql_data_array);
  $insert_id = tep_db_insert_id();
  for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
    $sql_data_array = array('orders_id' => $insert_id,
                            'title' => $order_totals[$i]['title'],
                            'text' => $order_totals[$i]['text'],
                            'value' => $order_totals[$i]['value'],
                            'class' => $order_totals[$i]['code'],
                            'sort_order' => $order_totals[$i]['sort_order']);
    tep_db_perform(TABLE_ORDERS_TOTAL, $sql_data_array);
  }

  $customer_notification = (SEND_EMAILS == 'true') ? '1' : '0';
  $sql_data_array = array('orders_id' => $insert_id,
                          'orders_status_id' => '1',
                          'date_added' => 'now()',
                          'customer_notified' => $customer_notification,
                          'comments' => $order->info['comments']);
  tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);

// initialized for the email confirmation
  $products_ordered = '';
  $subtotal = 0;
  $total_tax = 0;

  for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
// Stock Update - Joao Correia
    if (STOCK_LIMITED == 'true') {
      if (DOWNLOAD_ENABLED == 'true') {
        $stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename
                            FROM " . TABLE_PRODUCTS . " p
                            LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES . " pa
                             ON p.products_id=pa.products_id
                            LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
                             ON pa.products_attributes_id=pad.products_attributes_id
                            WHERE p.products_id = '" . tep_get_prid($order->products[$i]['id']) . "'";
// Will work with only one option for downloadable products
// otherwise, we have to build the query dynamically with a loop
        $products_attributes = $order->products[$i]['attributes'];
        if (is_array($products_attributes)) {
          $stock_query_raw .= " AND pa.options_id = '" . $products_attributes[0]['option_id'] . "' AND pa.options_values_id = '" . $products_attributes[0]['value_id'] . "'";
        }
        $stock_query = tep_db_query($stock_query_raw);
      } else {
        $stock_query = tep_db_query("select products_quantity from " . TABLE_PRODUCTS . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
      }
      if (tep_db_num_rows($stock_query) > 0) {
        $stock_values = tep_db_fetch_array($stock_query);
// do not decrement quantities if products_attributes_filename exists
        if ((DOWNLOAD_ENABLED != 'true') || (!$stock_values['products_attributes_filename'])) {
          $stock_left = $stock_values['products_quantity'] - $order->products[$i]['qty'];
        } else {
          $stock_left = $stock_values['products_quantity'];
        }

        tep_db_query("update " . TABLE_PRODUCTS . " set products_quantity = '" . $stock_left . "' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
        
        $desactive_query = mysql_query("SELECT conditionnement from products where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
        while($row = mysql_fetch_array($desactive_query))
       {
        if ($row[conditionnement]==-100) {
        if ( ($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false') ) { // pour annuler disparition produit qd stock=0; $stock_left < 1 est devenu $stock_left < 0
          tep_db_query("update " . TABLE_PRODUCTS . " set products_status = '0' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
        }}
        else {
        if ( ($stock_left < 0) && (STOCK_ALLOW_CHECKOUT == 'false') ) { // pour annuler disparition produit qd stock=0; $stock_left < 1 est devenu $stock_left < 0
          tep_db_query("update " . TABLE_PRODUCTS . " set products_status = '0' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
        }}}
      }
    }

// Update products_ordered (for bestsellers list)
    tep_db_query("update " . TABLE_PRODUCTS . " set products_ordered = products_ordered + " . sprintf('%d', $order->products[$i]['qty']) . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");

    $sql_data_array = array('orders_id' => $insert_id,
                            'products_id' => tep_get_prid($order->products[$i]['id']),
                            'products_model' => $order->products[$i]['model'],
                            'products_name' => $order->products[$i]['name'],
                            'products_price' => $order->products[$i]['price'],
                            'final_price' => $order->products[$i]['final_price'],
                            'products_tax' => $order->products[$i]['tax'],
                            'products_quantity' => $order->products[$i]['qty']);
    tep_db_perform(TABLE_ORDERS_PRODUCTS, $sql_data_array);
    $order_products_id = tep_db_insert_id();

//------insert customer choosen option to order--------
    $attributes_exist = '0';
    $products_ordered_attributes = '';
    if (isset($order->products[$i]['attributes'])) {
      $attributes_exist = '1';
      for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
        if (DOWNLOAD_ENABLED == 'true') {
          $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
                               from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa
                               left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
                                on pa.products_attributes_id=pad.products_attributes_id
                               where pa.products_id = '" . $order->products[$i]['id'] . "'
                                and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "'
                                and pa.options_id = popt.products_options_id
                                and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "'
                                and pa.options_values_id = poval.products_options_values_id
                                and popt.language_id = '" . $languages_id . "'
                                and poval.language_id = '" . $languages_id . "'";
          $attributes = tep_db_query($attributes_query);
        } else {
          $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . $order->products[$i]['id'] . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $languages_id . "' and poval.language_id = '" . $languages_id . "'");
        }
        $attributes_values = tep_db_fetch_array($attributes);

        $sql_data_array = array('orders_id' => $insert_id,
                                'orders_products_id' => $order_products_id,
                                'products_options' => $attributes_values['products_options_name'],
                                'products_options_values' => $attributes_values['products_options_values_name'],
                                'options_values_price' => $attributes_values['options_values_price'],
                                'price_prefix' => $attributes_values['price_prefix']);
        tep_db_perform(TABLE_ORDERS_PRODUCTS_ATTRIBUTES, $sql_data_array);

        if ((DOWNLOAD_ENABLED == 'true') && isset($attributes_values['products_attributes_filename']) && tep_not_null($attributes_values['products_attributes_filename'])) {
          $sql_data_array = array('orders_id' => $insert_id,
                                  'orders_products_id' => $order_products_id,
                                  'orders_products_filename' => $attributes_values['products_attributes_filename'],
                                  'download_maxdays' => $attributes_values['products_attributes_maxdays'],
                                  'download_count' => $attributes_values['products_attributes_maxcount']);
          tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
        }
        $products_ordered_attributes .= "\n\t" . $attributes_values['products_options_name'] . ' ' . $attributes_values['products_options_values_name'];
      }
    }
//------insert customer choosen option eof ----
    $total_weight += ($order->products[$i]['qty'] * $order->products[$i]['weight']);
    $total_tax += tep_calculate_tax($total_products_price, $products_tax) * $order->products[$i]['qty'];
    $total_cost += $total_products_price;

    $products_ordered .= "<tr><td><FONT color=#000000 size=2 face=Arial>".$order->products[$i]['qty'] . "</font></td><td><FONT color=#000000 size=2 face=Arial>x</font></td><td><FONT color=#000000 size=2 face=Arial>" . $order->products[$i]['name'] . "</font></td><td align='right'><FONT color=#000000 size=2 face=Arial>" . $currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']) . $products_ordered_attributes . "</font></td></tr>\n";
  }

// lets start with the email confirmation

$email_order  =   "<a href=\"http://www.ton-site.com\"><img src=\"http://www.ton-site.com/images/ton_logo.jpg\" alt=\"ton-site.com\" border=\"0\"></a><br><br><FONT color=#000000 size=2 face=Arial>Bonjour ".$order->customer['firstname'] . " " . $order->customer['lastname']."\n\n";
  $email_order .= "ton-site.com a bien enregistr&eacute; votre commande\n</FONT>";                
     $email_order .="<table border='1' width='600px' bordercolor='#000000' cellpadding='10'  cellspacing='0'><tr><td width='300px'><FONT color=#000000 size=2 face=Arial>Commande n°" . $insert_id . "</font></td><td width='300px' align='right'><FONT color=#000000 size=2 face=Arial>Date de Commande: ". strftime(DATE_FORMAT_SHORT) . "</font></td></tr>\n";
$email_order .="<tr><td colspan='2' align='center'><FONT color=#000000 size=2 face=Arial>Contact: <u>".$order->customer['email_address']."</u></font></td></tr>";
  
      $email_order .="<tr><td width='300px' valign='top'><FONT color=#000000 size=2 face=Arial>";
  if ($order->content_type != 'virtual') {
    $email_order .=  "<b><u>".EMAIL_TEXT_DELIVERY_ADDRESS . "</u>:</b><br>" .
                    tep_address_label($customer_id, $sendto, 0, '', "<br>") . "<br>";
  }
$email_order .="</font></td><td width='300px' valign='top'><FONT color=#000000 size=2 face=Arial>";
  $email_order .=  "<b></u>".EMAIL_TEXT_BILLING_ADDRESS . "</u>:</b><br>" .
                  tep_address_label($customer_id, $billto, 0, '', "<br>") . "<br>";
                  
$email_order .="</font></td></tr>\n";    

  
  $email_order .= "<tr><td colspan='2'><FONT color=#000000 size=2 face=Arial><b><u>Liste des produits command&eacute;s</u>:</b><br>" .
                  "<br><table width='100%' border='0'>".$products_ordered . "\n";
                  
  $email_order .="<tr><td colspan='3'>&nbsp;</td><td align='right'>__________</font></tr> ";
for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
    $email_order .= "<tr><td align='right' colspan='3'><FONT color=#000000 size=2 face=Arial>".strip_tags($order_totals[$i]['title']) . "</font></td><td align='right'><FONT color=#000000 size=2 face=Arial>" . strip_tags($order_totals[$i]['text']) . "</font></td></tr>";
  }
    $email_order .="</table></td></tr>\n";
    
  if ($order->info['comments']) {
    $email_order .= "<tr><td colspan='2'><FONT color=#000000 size=2 face=Arial><b><u>Commentaire</u>:</b><br> ".strip_tags(tep_db_output($order->info['comments']),'<br>') . "</font></td></tr>\n";
  }
  
  $email_order .="<tr><td colspan='2' align='left'><FONT color=#000000 size=2 face=Arial><b><u>".EMAIL_TEXT_PAYMENT_METHOD . "</u>:</b> Carte Bancaire<br><br>".$textepaiement."</font></td></tr></table>";              

  tep_mail($order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address'], 'Enregistrement de votre commande', $email_order, 'ton-site.com','service.clients@ton-site.com');

// send emails to other people
  if (SEND_EXTRA_ORDER_EMAILS_TO != '') {
   // tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
  }

// load the after_process function from the payment modules
//  $payment_modules->after_process();

  $cart->reset(true);

// unregister session variables used during checkout
  tep_session_unregister('sendto');
  tep_session_unregister('billto');
  tep_session_unregister('shipping');
  tep_session_unregister('payment');
  tep_session_unregister('comments');
  tep_session_unregister('sms');
            break;

            
    }

    $receipt = CMCIC_CGI2_MACOK;

}
else
{
    // your code if the HMAC doesn't match
    $receipt = CMCIC_CGI2_MACNOTOK.$cgi2_fields;
}

//-----------------------------------------------------------------------------
// Send receipt to CMCIC server
//-----------------------------------------------------------------------------
printf (CMCIC_CGI2_RECEIPT, $receipt);
// Copyright (c) 2009 Euro-Information ( mailto:centrecom@e-i.com )
// All rights reserved. ---
?>

Les 3 parties de codes font le meme fichier

Écrit par : ThomasB 30 Jun 2010, 15:26

Merci Nico !

Je vais regarder ça de plus près. A première vue la différence qu'il y a dans le fichier d'origine et le tien, c'est ta façon de gérer la partie "session". J'ai pu noté une intervention répété du code "$PHP_SELF", chose que je n'ai pas dans mon fichier de base.

Te serait-il possible, sans trop prendre de ton temps, de me décrire spécifiquement ce que tu as du ajouter ou modifier pour faire remonter les variables inclus dans la session (table session) ?
Cela m'aidera à y voir plus clair. Pour le reste, j'arrive à peu près à gérer.

Encore merci, à charge de revanche (si tant est que cela soit possible smile.gif )
Thomas

Écrit par : nilegoff 30 Jun 2010, 16:14

En realité, comme je l'ai deja dit, je fonctionne exactement comme le checkout process.
Une fois la session recupéré, j'appele la class order.php qui me redonne toute les variables de la commande en cours.

A ce moment là, il n'y a plus qu'a verifier que la reponse vient bien ce Cybermut

puis en fonction de la reponse, l'enregistre le teste, l'annulation ou le paiement (ou encore un des paiements fractionnés)

Le fichier est long, car je n'ai pas enlevé tout ce qui ne servait à rien dans l'application_top et peut etre epuré.

nilegoff

Écrit par : ThomasB 5 Jul 2010, 07:57

Une nouvelle fois merci.
J'ai mis en place une partie des lignes de code que tu m'as communiqué, ça fonctionne parfaitement.

Thomas

Écrit par : valerie22 27 Oct 2010, 19:12

bonjour
je rencontre le meme pb, j'ai installe order_check comme preconisé par Grindal mais c'est une solution paliative... je suis donc preneuse de ton explication et des 3 codes de ton fichier... simplement il composent quel fichier ? cmic-reponse ou chekout success ?
merci de ton aide*
val

Écrit par : nilegoff 27 Oct 2010, 22:50

Bonsoir,

Les 3 bouts de code composent le fichier cmcic-reponse.php (que je te conseille de renommer par principe (mais ne pas oublier de donner le nouveau nom au centre de gestion CIC ou CM)).
Ce fichier cmcic-response.php a exactement la meme fonction que checkout-process.php mais est dedié au retour du centre CB du CIC et CM. Il a été fabriqué à partir de mon checkout-process.php et peut necessité quelques adaptations pour une autre boutique

nilegoff

Écrit par : valerie22 28 Oct 2010, 09:31

Bonjour Nilegof
merci de ta reponse... ca va etre un peu au dela de mes connaissances techniques
j'ai introduit ton code mais en effet ca me fait des erreur... peux tu m'aiguiller pour demarrer a partir de mon checkout success?
merci d'avance
val

Écrit par : nilegoff 28 Oct 2010, 14:58

Peux tu nous dire quelles erreurs as tu?
Verifie bien que

Code
require_once("REPERTOIRE_CMCIC/CMCIC_Config.php");
indique bien le chemin de ton repertoire avec le fichier config

nilegoff

Écrit par : valerie22 28 Oct 2010, 15:31

oui j'ai bien le require
je vais proceder par elimination... voici la 1ere erreur renvoyee par cmic :
REPONSE DE VOTRE CGI DE CONFIRMATION :
<br />
<b>Warning</b>: reset() [<a href='function.reset?osCsid=10373b7618f7c11f9eec5cf53b26ce5d'>function.reset</a>]: Passed variable is not an array or object in <b>/serveur/www/boutique/includes/classes/navigation_history.php</b> on line <b>130</b><br /> <br />
<b>Warning</b>: Variable passed to each() is not an array or object in <b>/serveur/www/boutique/includes/classes/navigation_history.php</b> on line <b>131</b><br /> <br />
<b>Warning</b>: reset() [<a href='function.reset?osCsid=10373b7618f7c11f9eec5cf53b26ce5d'>function.reset</a>]: Passed variable is not an array or object in <b>/serveur/www/boutique/includes/classes/navigation_history.php</b> on line <b>130</b><br /> <br />
<b>Warning</b>: Variable passed to each() is not an array or object in <b>/serveur/www/boutique/includes/classes/navigation_history.php</b> on line <b>131</b><br />


voila....




Écrit par : valerie22 28 Oct 2010, 16:36

apres quelques modifs je n'ai plus d'erreur et le retour du cgi est ok ce qui est deja bien, mais toujours pas de trace de la commande dans l'admin, ni d'envoi de mail de confirmation au client test.
en relisant ton precedent post je m'appercois que je n'ai pas de cmci_config... j'ai installé la contrib cmcic_contrib_3.0b
as tu une idee ?
merci en tout cas
valerie

Écrit par : valerie22 29 Oct 2010, 14:24

Bonjour Nilegoff
je patauge si tu as 5 min pour m'aiguiller ce serait super sympa
merci d'avance
val

Écrit par : nilegoff 29 Oct 2010, 14:34

Si tu as le retour CGI ok, c'est presque gagné.
Il ne reste plus qu'a enregistrer la commande

remplace pour faire un teste le contenue de l'action de paytest par echo '1321321321321321321321321321321321321'; et regarde si ce texte apparait.

Si apparait, remplace le par le contenu de ton checkout_process qui enregistre la commande

nilegoff

Écrit par : chti_poupon 29 Oct 2010, 14:36

Citation (chti_poupon @ 18 Sep 2010, 17:26) *
Citation (zattara @ 17 Apr 2009, 10:29) *
Bonjour tout le monde,

Depuis le 1er Avril 2009 le module CyberMut est obsolète, car le groupement CMCIC a changé son protocole de cryptage des données.
A la demande de plusieurs de mes clients j'ai créé une contribution CyberMut 3.0, compatible avec les clés SHA1 de nouvelle génération.

Vous trouverez cette contribution, qui supporte le Crédit Mutuel, le CiC et OBC à cette adresse : http://addons.oscommerce.com/info/6691. Il vous suffit d'uploader, de placer la clé XXXXXXX.key fournie dans le répertoire cmcic. Activez et renseignez trois champs dans l'admin, le tour est joué.

En vous souhaitant de bonnes ventes !

Voilà la version utilisée sur osCommerce actuellement.
En suivant scrupuleusement les indications, y compris celles données dans le code, et en prenant bien la version adaptée à l'osC utilisé, l'installation, les tests et les indications du très aimable service clientèle Cybermut tout se passe bien. Les ennuis rencontrés sont à la suite de cet épinglé et souvent dus à une lecture trop rapide des instructions.
Bonne installation !
Chti poupon


Bonjour !
Rien à ajouter sauf à insister sur le scrupuleusement.
Chti poupon

Écrit par : valerie22 29 Oct 2010, 16:30

Merci Nilegoff
apres maintes et maintes tentatives et sur tes conseils, tout fonctionne !!!
quelle merveille !!!
merci encore de ton aide et bravo a ce forum pour debrouiller les pbs...
merci val

Écrit par : valerie22 3 Nov 2010, 16:27

Bonjour
une chose étrange tout est ok desormais pour cmic cybermut, mais dans l'outil d'admin comme dans le compte des clients lorsqu'ils reglent par cb (uniquement) la commande apparait en double... c'est le meme numero de commande mais elles est visibles deux fois, idem dans l'historique des commandes et dans l'outil d'admin...
dans la bdd elle n'est pas doublee pourtant... quelqu'un peut il m'aider ?
merci d'avance
val

Écrit par : chti_poupon 3 Nov 2010, 20:13

smile.gif Bonsoir !
Vérifier dans catalog/cmcic_response.php qu'un break; n'a pas été accidentellement avant la partie exploitation: il faut avoir :

Code
  break;
  
  case "paiement":

sinon la partie test fait son travail sauvegarde, courriels... puis la partie exploitation recommence happy.gif
Réponse non transcendante, mais çà serait trop bête ! tongue.gif
Chti poupon

Écrit par : valerie22 4 Nov 2010, 10:29

bonjour
merci de ta reponse .. dans le fichier en question j'ai 3 break :
1 -
break;
case "payetest":
2-
// on enregistre la valeur de la derniere commande
$order_id = $insert_id;
tep_session_register('order_id');
tep_db_perform('cmcic_reference', array('order_id' => $order_id), 'update', "ref_number='". $CMCIC_bruteVars['reference']."'");
break;

case "paiement":
3-
// ________________________________________________________________________________
________________________________
// on enregistre la valeur de la derniere commande
$order_id = $insert_id;
tep_session_register('order_id');
tep_db_perform('cmcic_reference', array('order_id' => $order_id), 'update', "ref_number='". $CMCIC_bruteVars['reference']."'");
break;
}
$receipt = CMCIC_CGI2_MACOK;

est ce normal ?

merci


Écrit par : chti_poupon 5 Nov 2010, 22:56

smile.gif Bonjour !
Alors là n'est pas la cause de ce bégaiement.... wub.gif
Ton code ne se répète pas 2 fois entre case et break ??
Car la ( blush.gif ) contrib est fournie avec un morceau de checkout_process.php, à remplacer si le tien est différent. Si tu l'as ajouté, tu l'as ajouté biggrin.gif !
Une Belle Journée à toi !
Chti Poupon
PS cette partie vient aussi à l'identique après
case "paiement":

Écrit par : valerie22 6 Nov 2010, 11:36

c'etait aussi bete que ca...
merci encore de ton aide
cdt
val

Écrit par : valerie22 8 Nov 2010, 19:47

bonjour
je reviens avec le meme pb...
je pensais que c'etait resolu avec la redondance du 'break' et cela fonctionnait en mode test parfaitement, mais en production cela continue a incrementer deux fois la commande dans le compte client et dans l'outil d'admin...
si vousavez une solution je suis preneuse...
merci de votre aide
val

Écrit par : chti_poupon 8 Nov 2010, 22:12

idea.gif Bonjour !
bis repetita ! twisted.gif

Structure de cmcic_response.php :

Citation
blabla
switch
case "annulation" :
blabla
break;
case "payetest":
if (bla)
_________
morceau de checkout_process.php offert avec la contribution
A VIRER pour mettre son propre morceau à soi, avec ses contrib à soi en place
_________________
blabla
break;
case "paiement":

_________
morceau de checkout_process.php offert avec la contribution
A VIRER pour mettre son propre morceau à soi, avec ses contrib à soi en place
_________________
blabla
break;
blabla
fin

Si je ne m'abuse, même cause, même effets: code en double => action doublée
(Autrement dit, tu as eu 4 versions du même code au lieu de 2, et à l'heure qu'il est, il t'en reste 3 ! rolleyes.gif )
Une Belle journée !
Chti poupon

Écrit par : valerie22 9 Nov 2010, 09:59

oui je comprend bien le pb mais j'ai beau chercher... mes competences sont limites...
j'ai mis le contenu du fichier si tu vois qq chose ????

code illisible supprimé

Écrit par : chti_poupon 9 Nov 2010, 17:34

wub.gif
Il manque la moitié du code extrait de checkout_process.php plus des bouts de l'original !
Pour réparer :
Tout à la fin, dans :

Code
break;

case "paiement":
}
$receipt = CMCIC_CGI2_MACOK;
}
else
{
// your code if the HMAC doesn't match
$receipt = CMCIC_CGI2_MACNOTOK.$cgi2_fields;

RETIRER la ligne :
Code
case "paiement":


Puis copier ce qu'il faut pour obtenir, sans doublonner les lignes:
Code
// unregister session variables used during checkout
$cart->reset(true);
tep_session_unregister('sendto');
tep_session_unregister('billto');
tep_session_unregister('shipping');
tep_session_unregister('payment');
tep_session_unregister('comments');
// _______________________________________________________________
     // on enregistre la valeur de la derniere commande
     $order_id = $insert_id;
     tep_session_register('order_id');
     tep_db_perform('cmcic_reference', array('order_id' => $order_id), 'update', "ref_number='". $CMCIC_bruteVars['reference']."'");
   }
   else
   {
     tep_mail(STORE_NAME . ': CYBERMUT', STORE_OWNER_EMAIL_ADDRESS , "Commande Testée : " . $CMCIC_bruteVars['reference'],
     "Cette commande a été testée", STORE_NAME, STORE_OWNER_EMAIL_ADDRESS);
     tep_mail(STORE_NAME . ': CYBERMUT', 'informatiquedefrance@gmail.com' , "Commande Testée : " . $CMCIC_bruteVars['reference'],
     "Cette commande a été testée", STORE_NAME, 'informatiquedefrance@gmail.com');
     $cart->reset(true);
   }
   break;

   case "paiement":


Enfin, COPIER toutes les lignes ( y compris les lignes que je donne ci-dessous) entre :
Code
// Payment has been accepeted on the test server
// on procede à la validation de la commande et on envoi l'accusé de réception;
// ------------------ copie du code de checkout_process, uniquement ce qu'il faut pour valider la commande ----------------
// attention à certaines contributions qui sont suceptibles de demander la modification de checkout_process, les modifs sont à apporter aussi ici
$sql_data_array = array('customers_id' => $customer_id,
'customers_name' => $order->customer['firstname'] . ' ' . $order->customer[' ..

et
Code
$cart->reset(true);

// unregister session variables used during checkout
tep_session_unregister('sendto');
tep_session_unregister('billto');
tep_session_unregister('shipping');
tep_session_unregister('payment');
tep_session_unregister('comments');
// ________________________________________________________________________________
________________________________


le coller juste avant (tout près de la fin de ton code).
Code
// ________________________________________________________________________________
________________________________
// on enregistre la valeur de la derniere commande
$order_id = $insert_id;
tep_session_register('order_id');
tep_db_perform('cmcic_reference', array('order_id' => $order_id), 'update', "



Voila !
Chti poupon

Écrit par : valerie22 10 Nov 2010, 09:03

bon apres une soiree passee a coller les bout indiques ca ne marche pas, je dois me louper qq part... ca t'ennuierais de me les mettre dans le fichier ? car je ne comprend pas tes explications, qui je pense doivent etre tres claires pour unpro et pas trop pour moi... ce serait top !!!
tu me dit ? merci bien
valerie

Écrit par : chti_poupon 10 Nov 2010, 09:46

Bon ! mrgreen.gif
A ce stade des travaux, renommes ton fichier actuel pour le sauvegarder.
Recharges cmcic_response.php (ou le rc1 si nécessaire) depuis la contrib http://addons.oscommerce.com/info/6691
Renommes-le comme tu as dit à la banque.
Essayes tel quel.
A suivre
Chti poupon

Écrit par : valerie22 10 Nov 2010, 13:04

alors avec cmcic que j'ai posté sur le site le retour cgi est ok, tout se passe correctement sauf ce doublon dans les comptes clients et outil d'admin.
En reinstallant laversion que tu m'as signigié j'ai le retour cgi suivant :
REPONSE DE VOTRE CGI DE CONFIRMATION :

<br />

<b>Warning</b>: require(includes/languages/.php) [<a href='function.require?osCsid=7c4edb2d055e2b9c38cb1d35cd1447f5'>function.require</a>]: failed to open stream: No such file or directory in <b>/serveur/cmcic_response.php</b> on line <b>118</b><br /> <br /> <b>Fatal error</b>: require() [<a href='function.require?osCsid=7c4edb2d055e2b9c38cb1d35cd1447f5'>function.require</a>]: Failed opening required 'includes/languages/.php' (include_path='.:/usr/local/lib/php') in <b>/serveur/cmcic_response.php</b> on line <b>118</b><br />

c'est grave docteur ???
je me demande s'il nevaut mieux pas continuer a travailler surcelui qui fonctionne et trouver ou se fait le doublon ?



Écrit par : chti_poupon 10 Nov 2010, 18:56

smile.gif Bonjour !
Vieux gag : la fonction php est vide car la langue n'est pas définie, car l'admin met true false au lieu de oui non.
Chercher au debut les deux commentaires ci dessous et remplacer ce qu'il y a entre deux (lignes 43 à 46 en version de base) par ce qu'il y a ci-dessous:

Code
......
// set the application parameters
$configuration_query = tep_db_query('select configuration_key as cfgKey, configuration_value as cfgValue from ' . TABLE_CONFIGURATION);
$config_flag_in = array('Oui', 'Non');
$config_flag_out = array('true', 'false');
while ($configuration = tep_db_fetch_array($configuration_query))
{
  $configuration['cfgValue'] = str_replace($config_flag_in, $config_flag_out, $configuration['cfgValue']);
  define($configuration['cfgKey'], $configuration['cfgValue']);
}
// define general functions used application-wide
.....

çà devrait aller mieux !

Bons essais !
Chti poupon

Écrit par : valerie22 17 Nov 2010, 10:12

Bonjour Chti poupon

je suis reparti du fichier original de la contribes cmic
j'ai resolu le pb de langue, tout fonctionne (decrementation, retour cgi ok) j'ai toujours ce doublon... dans le compte client et dans l'outil d'admin
c'est le dernier point a regler ....

Écrit par : chti_poupon 17 Nov 2010, 21:10

Bizarre unsure.gif !
Ce n'est donc pas çà !
J'ai pourtant eu ce problème mais la solution ne me revient pas. blush.gif
Essaie toujours de mettre

Code
$language = 'french';

avant la ligne 119 pour voir la suite... (provisoirement)
Chti poupon
EDITION: Ce message est une réponse au message 33, inutile puisque 35 donne ce problème résolu

Écrit par : valerie22 18 Nov 2010, 10:37

bonjour
rien n'y change... si qq a une idee concernant le pb d'affichage en doublon je suis preneuse !!!!
merci
val

Écrit par : chti_poupon 18 Nov 2010, 17:22

smile.gif Bonjour !
Je lis sous la plume de valerie22 :

Citation
je rencontre le meme pb, j'ai installe order_check comme preconisé par Grindal mais c'est une solution paliative... je suis don...

Et, dans Order check (en date du 22/10/10)
Citation
First i should thank Geoffrey for this contribution. This was the contribution that i badly required.

I have modified to
a) Delete the duplicate records
b) To reduce the product quantity which was not taken care by quantity ordered when the orders in holding is converted into actual order.

I have enclosed the modifed ordersholding.php which is to be uploaded at catalog/admin folder and readme file with instructions on where changes are done.


çà serait-y-donc-pas qu'order_check n'efface pas quand la procédure CB est normale , parce que tu l'as chargé avant la modif ?
Bonne recherche !
Chti Poupon

Écrit par : valerie22 20 Nov 2010, 11:21

ce serait donc ca ....
que faut il faire desinstaller order check ?en meme temps c'est une bonne securite pour controler les commandes ????
ton avis ?
merci en tout cas de ton aide precieuse
val

Écrit par : chti_poupon 20 Nov 2010, 11:58

smile.gif Bonjour !
Ben, j'en sais pas plus que ce que j'ai lu dans le tableau de présentation de cette contrib order check que je n'utilise pas.
J'aurais tendance à te conseiller de pointer encore pas à pas et jusqu'au bout son installation. Il suffit parfois de peu de chose pour qu'un code ne fonctionne pas correctement.
Ensuite, il y a peut être une activation dans l'admin ? ou quelque réglage ?
Très belle journée !
Chti Poupon

Écrit par : valerie22 20 Nov 2010, 15:18

ce qui me pose une interrogation c'est qu'en mode test le doublon ne se fait pas, uniquement en production... or order check fonctionne dans les deux cas????
est ce une piste ???

Écrit par : valerie22 24 Nov 2010, 14:30

alors j'ai supprime order check et ledoublon est toujours la....
y a til qq pour m'aider avant que je ne devienne folle ????
merci

Écrit par : valerie22 1 Dec 2010, 12:04

le pb est regle avis a ceux qui ont le meme pb que moi
il suffisait de commenter //$order_totals = $order_total_modules->process();
ligne 444 environ du cmic_response
voila plus de doublon...
pb resolu
merci a tous

Écrit par : jumper 4 Jan 2011, 18:31

Bonjour
Je viens d'installer la contribution cmcic_contrib_3.0b , renseigné le fichier .key avec la clé fournie par la banque, renommé ce fichier en montpe.key et envoyé celà dans le dossier cmcic à la racine. Le module est installé aussi mais je me retrouve face un un problème 'en mode test à savoir:

Citation
La signature des informations transmises n'a pas été validée.

Notre serveur n'est pas en mesure de traiter la demande de paiement relative à votre commande.
Tous les champs requis sont présents.

La valeur du MAC est erronée. Le MAC est un sceau certifiant l'authenticité des données.

J'ai pourtant effectué des test en local avec le pack livré par la banque (mise en place du dossier php4 dans wamp) en renseignant de la meme façon que j'ai fait dans l'admin du site le fichier CMCIC_Config.php avec le bon tpe, code société, .... etc et aussi la fameuse clé livrée par la banque.
Là pas de problème, en lançant le fichier phase1_aller.php puis connexion, j'arrive bien sur le serveur test de paiement ou je peux payer avec une carte de test.
Je ne comprend pas pourquoi avec les memes données sur le site, j'ai l'erreur citée plus haut (j'ai vérifié mille fois la valeur de la clé).
Help !!!

Écrit par : chti_poupon 5 Jan 2011, 08:56

smile.gif Bonjour !
Juste pour être sûr :

Citation
renommé ce fichier en montpe.key

en fait, à la place de "montpay" il y a bien ton n° de TPE virtuel ? (genre 123456.key)
Bonne Journée ! happy.gif
Chti poupon

Écrit par : jumper 5 Jan 2011, 09:30

Oui absolument !!! j'ai bien mis montpe du style 123456.key.
Par contre dans ce fichier il ne faut que la clé de 40 caracteres ? Dans le fichier que la banque nous a fait passer il y a plusieur données le fichier se présente comme ça:

Citation
VERSION 1 123456789ABCEF123456789ABCDEF0123456789A
HMAC-SHA1
#
f156c4f5e5a10f21e412a3a1f5e4a4b5c6a5f105

J'utilise donc dans mon fichier .key uniquement la suite des 40 caracteres du haut

Écrit par : jumper 5 Jan 2011, 13:19

Bonjour,
celà fonctionne en partie maintenant à savoir que j'arrives à faire un test de paiement avec la carte test mais apres validation, retour direct au site et le panier n'est pas vidé , aucune commande dans l'admin.
J'ai fait l'essai sur un autre site et ça marche parfaitement à savoir apres test de paiement, pas de retour direct au site mais une indication sur le serveur de paiement qui me dit que le cgi2 est ok, apres retour sur le site , le panier se vide et la commande est bien dans l'admin.
Les 2 sites sont identiques......je comprend pas

Écrit par : chti_poupon 5 Jan 2011, 20:38

smile.gif Bonjour !
Si je ne m'abuse, un n° de TPE = 1 clé = 1 adresse de retour.
Pour un autre site, il faut un autre TPE ! - Ou c'est contractuel pour plusieurs sites : mais alors les adresses de retour...???
Bonne journée !
Chti Poupon

Écrit par : jumper 6 Jan 2011, 09:24

Bonjour, étant donné que c'est le meme compte, le tpe et la clé sont identiques, il n'y a que le code société qui change et le lien du cmcic_response.
En fait il y avait plusieur problèmes dont un assez curieux , au lieu de pointer sur le fichier de reponse, le serveur donnait plusieur choix car j'avais plusieur fichiers cmcic_response.php renommés dans le style cmcic_response.php_04-01-2011. Visiblement il ne faisait pas la différence entre les extensions ....bizare mais bon.... Ensuite lorsque le fichier s'est retrouvé seul, j'avais un problème de TABLE_COUPONS et là il a fallu que definisse la table (define('TABLE_COUPONS', 'coupons') dans database_tables.php , et là c'est encore plus bizarre car les fichiers sont identiques quel que soit le site, seule l'interface graphique change. Bon enfin à force de gratter à gauche à droite, mes site apres les essais en test sont enfin en production, merci à tous les intervenants qui ont pu me mettre sur la voie et tant que je suis là , je vous souhaite une tres bonne année 2011 smile.gif

Écrit par : mihelicjm 9 Apr 2011, 09:56

Bonjour,

Pour ceux qui seraient aussi dans la situation où j'étais, difficultés entre les paniers qui ne se vident pas, les commandes qui ne s'enregistrent pas, doublons de commande dans l'admin je récapitule les solutions adaptées trouvées ici et là:

1/ concernant les paniers et commandes non enregistrés j'ai du agir personnellement à la fois sur le htaccess du dossier de la clé (le supprimer temporairement pour test puis le modifier s'il est en cause) et sur les permissions de fichier via le ftp sur le dossier cmcic mais aussi sur le cmcic_response.php lui-même!!

2/ si vous etes confrontés à des doublons de commande dans l'admin, j'ai pu y remédier en commentant la ligne suivant dans le fichier cmcic_response.php:
$order_totals = $order_total_modules->process();

ce qui donne:
//$order_totals = $order_total_modules->process();

3/ enfin, pour celui qui est ok en test mais ko en production, il peut être judicieux de penser à bien dupliquer le contenu de la case "test" vers la case "paiement" du cmcic_response.php et ce jusqu'au "break;".

Bon code!

Écrit par : spiCommerce 11 Jul 2011, 13:23

Bonjour tout le monde.

Bon c'est à devenir dingue cette histoire.
J'ai installé la version d'OsCOmmerce 2.3.1 et le dernier module de payement CIC en date.
Tout se passe très bien jusqu'à validation de la commande, mais comme pour le message d'origine, cette commande n'est pas enregistrée dans l'admin.

J'ai donc passé deux jours à chercher sur le net des infos concernant ce problème recensé depuis 2005 !!!!
A ce jour je n'ai pas trouvé de solution simple pour corriger ce problème connu, ce qui me semble complétement dingue.

J'ai bien sur tenté les diverses solutions glanées sur le net, aussi éthéroclites soit-elles.
Que tout ne soit pas parfait, surtout moi qui débute en PHP, je le conçoit tout à fait, je suis débutant c'est normal de galérer un peu, mais vous avouerez que, pour le débutant, c'est simplement le parcours du combattant pour trouver de l'info.

J'ai tenté de suivre les indications d'installation de OrderCheck (OrderCheck_v2.5.1b) et je bloque à la première modif...
J'ai pourtant réussi à faire tout le reste (relooking, modules de payements, configuration etc...) tout seul mais là je bloque.
J'en suis donc réduit à faire mon gros noob et à demander de l'aide sur un truc qui doit être tout con.

Quelqu'un aurait-il donc une solution ou des explications adaptée à la version 2.3.1 de base de OsCommerce ?
Le but est simplement de corriger le fait que les commandes ne s'enregistrent pas.

Je devient dingue à bloquer sur un truc qui est surement tout bête mais quand on sais pas on sais pas...

Pour info :

Version OSC installée : 2.3.1
Version module de payement : cmcic_contrib_3.0b
URL de retour : cmcic_response _rc1.php

Merci d'avance.

Écrit par : chti_poupon 12 Jul 2011, 08:46

Bonjour,
La version cmcic réclame d'installer le même code (partiel) de chechout_process.php deux fois (dans 2 parties: test et exploitation) : C'est là que se remplissent les tables orders.
La version fournie contient - d'office - le code de la 2.2. RC1... Essayer de le remplacer par le code correspondant de la 2.3.1 me paraît être la première chose à faire.
Ces deux parties sont dans un switch case: la première qui traite du non paiement est hors circuit, les secondes et troisièmes sont à aménager.
Bons essais
Chti poupon
PS voir aussi les différences 2.2 RC1 et 2.2 RC2...

Écrit par : spiCommerce 12 Jul 2011, 09:04

Salut chti_poupon et merci,

Je vais tenter ça dans la journée et je vous tiendrais au courant.

Écrit par : spiCommerce 12 Jul 2011, 13:17

Re,

Bon d'abord merci chti_poupon, le problème n'est pas résolu mais tu semble être la personne qui répond à la plupart les débutants (à ce que j'ai lu sur le forum) et tu gardes ton calme malgré nos errements, donc merci d'avance. Je vais me permettre de faire un retour pas à pas de tous les tests que j'effectue au fur et à mesure au cas où cela pourrait servir à d'autres et pour être le plus clair possible. Désolé si le problème à été débattu de nombreuses fois mais j'ai beau chercher je ne trouve pour le moment aucune solution qui semble me sortir de la mouise. Je sais bien que pour ceux qui nagent dedans ça semble évident (comme pour tout framework ou workflow dont on a pris l'habitude de se servir) mais pour ceux qui prennent le truc en route c'est vraiment pas si simple tongue.gif

mellow.gif D'abord quelques infos pour me situer :

Ceci est ma première installation/paramétrage/relookage d'une release d'OSC.
Je suis débutant en PHP, mais pas sur d'autres langages (AS3, Javascript, Java, notions de C++, ...).
J'ai l'habitude de travailler sur des CMS simples du genre Spip, Joomla, Wordpress et un peu (je débute là aussi) de Drupal.

Ma version de OSC est la 2.3.1
La version du module CIC est la : cmcic_contrib_3.0b
Aucun autre module n'est installé pour le moment.

Je vais essayer d'expliquer en détail mon problème histoire de faire avancer les choses et au cas où d'autres débutants seraient aussi bloqués.
Même si il existe à première vue de nombreux threads qui traitent de ce problème qui semble récurent, je n'ai rien trouvé qui regroupe les tests.
(pour les autres débutants qui tomberaient ici après recherches pensez à lire le début de ce thread, il y a aussi des infos intéressantes)

--------------------------------------------------------------------------------------------------

Description du problème

Après payement la banque propose de revenir sur "checkout_success.php", mais au retour plusieurs problèmes se posent :


Côté admin :

Dans « modules / Paiement / CyberMut P@iement », le mode utilisation est en « test » et le mode simulation est sur « oui ».
Dans « Clients/Commandes / Commandes », les commandes sont là mais vides de toute références.
Dans le résumé de l'admin les commandes sont bien enregistrées mais tous les totaux sont à 0.

Voici deux captures qui montrent le problème :

Résumé de l'admin.


Commandes


Côté base de données :

Dans « cmcic_response » j'ai bien mes commandes qui s'enregistrent sous la forme : Resp_id / MAC / ref_number / TPE / date / montant / texte libre / code retour (payetest)
Dans « orders » j'ai bien des entrées qui se créent mais toutes les commandes sont vides.
Dans « order_products » je n'ai rien, aucun enregistrement.
Dans « order_statuts » j'ai bien les id de chaque étape
Dans « orders_total » toutes les commandes sont enregistrées.

Côté front :

Lorsque le client effectue une commande puis revient sur le site via le bouton dédié il se retrouve sur son panier vide.
Mais n'est plus loggué, si il se reloggue son panier n'est pas vide sa dernière commande est toujours présente.
Si le client se loggue et sort du site puis y revient le cookie est bien enregistré et le client est automatiquement loggué.

Infos de la phase test – « Données du formulaire bancaire » :
// … (au dessus infos valides que j'ai supprimé pour ce forum)
Code
<input type="hidden" name="url_retour"        value="http://www.monSite.fr/boutique/catalog/index.php" />
      <input type="hidden" name="url_retour_ok"    value="http://www.monSite.fr/boutique/catalog/checkout_success.php" />
      <input type="hidden" name="url_retour_err"   value="http://www.monSite.fr/boutique/catalog/checkout_payment.php" />
      <input type="hidden" name="texte-libre"      value="8b9v3ajt1n30ho1mkrplakofe3" />

// … (en dessous infos valides que j'ai supprimé pour ce forum)


--------------------------------------------------------------------------------------------------

Tests effectués


idea.gif Test 1 : http://faq.oscommerce-fr.info/qa_info.php?qID=151

Pourquoi mon panier se vide complètement et je suis renvoyé sur la page de login ?

Le défaut est probablement une mauvaise gestion des sessions.
Avant de chercher à gérer les sessions en "dur" on peut déjà s'assurer du fonctionnement avec les sessions en base mysql:
Vérifier dans includes/configure.php de l'admin et du catalog que STORE_SESSIONS est bien défini sur mysql:

Code
define('STORE_SESSIONS', 'mysql');


Attention également à la gestion des sessions dans l'admin->Configuration->Sessions
Tout doit être sur False sauf les deux cités true ou false

Ne marche pas dans mon cas.


--------------------------------------------------------------------------------------------------


Test 2 : http://www.oscommerce-fr.info/faq/qa_info.php?qID=201

Les commandes n'apparaissent pas dans le panneau d'administration.

Avant toutes choses vérifiez la table orders_status.
Avant de creuser plus que ça, vérifiez que la table 'orders_status' est correctement renseignée pour le langage de l'admin (Localisation -> Statut des Commandes).
Si ce n'est pas le cas, corrigez le défaut par phpmyadmin pour ajouter les champs manquants.

Par exemple :
Code
INSERT INTO `orders_status` (`orders_status_id`, `language_id`, `orders_status_name`) VALUES ('1', '4', 'En attente');


Pour ajouter le statut par défaut "en attente" et faire de même pour les autres statuts manquants.

Sinon, suivez les instructions suivantes.

Le problème :

Il peut arriver après des modifications des scripts ou un changement dans la base de données qu'une commande pourtant correctement terminée par le client ne soit pas accessible dans le panneau d'administration ou n'apparaisse même pas.

Les Symptômes :


Solutions :

Il y en a deux dont la première semble suffisante mais sans certitude.

Mettre les connexion persistantes sur "false" dans la base de donnée.

Code
define('USE_PCONNECT', 'false'); // use persistent connections?


Modifier la fonction tep_db_insert_id dans includes/functions/database.php

Code
               function tep_db_insert_id($link = 'db_link') {
                       global $link;
                       return mysql_insert_id( $link );
                       }


NB: Il est souhaitable de modifier aussi cette même fonction dans la partie admin.
La seconde modification permet de conserver les connexions persistantes vers la BDD.
Même si ce n'est pas conseillé avec un hébergement mutualisé par exemple.

Remarque :

Ne pas confondre ce problème avec la perte de commande due à une procédure de commande mal effectuée. Il peut arriver en effet que le client ne revienne pas vers la boutique après le paiement dans la fenêtre du prestataire. osCommerce ne peut donc savoir que la commande a été terminée : le panier ne se vide pas, la commande n'est pas enregistrée comme valide. Pour ce dernier cas, l'installation d'une contribution de pré-enregistrement de la commande comme "Check Order" est à envisager.

Ne marche pas dans mon cas.


--------------------------------------------------------------------------------------------------


Test 3 : http://www.oscommerce-fr.info/forum/index.php?showtopic=66528&view=findpost&p=350339

J'ai comparé les deux fichiers ("cmcic_response.php" et "checkout_process.php") les deux semblent identiques en ce qui concerne les parties encadrées.
Par acquis de conscience j'ai quand même remplacé le code de "cmcic_response_rc1.php" par celui de ma release.
J'ai comparé ligne par ligne, les seules différences sont les suivantes (présentes dans "cmcic_response.php" et pas "checkout_process.php") :

Concerne le mail de validation :
Code
// initialized for the email confirmation
   $products_ordered = '';
   $subtotal = 0;
   $total_tax = 0;



Concerne les options produits choisies par l'utilisateur
Code
//------insert customer choosen option eof ----
   $total_weight += ($order->products[$i]['qty'] * $order->products[$i]['weight']);
   $total_tax += tep_calculate_tax($total_products_price, $products_tax) * $order->products[$i]['qty'];
   $total_cost += $total_products_price;


Concerne le mail de validation
Code
if (is_object($payment)) {
     if ($payment_class->email_footer) {
       $email_order .= $payment_class->email_footer . "\n\n";
    }
}



Ne marche pas dans mon cas.


--------------------------------------------------------------------------------------------------

Test 4 : http://www.oscommerce-fr.info/forum/index.php?showtopic=66528&view=findpost&p=346251

Solution donnée par nilegoff avec une réécriture complète du fichier "cmcic_response_rc1.php".

Dans mon cas je retourne bien sur la session du client mais le panier n'est pas vidé et la commande n'est du coup plus du tout enregistrée.
Mais c'est déjà un grand pas de fait, je pense qu'en combinant les deux fichiers je devrais m'en sortir.
Reste à mettre les mains dans le camboui pour voir où se trouve l'erreur.


--------------------------------------------------------------------------------------------------


Note : pour éviter les effets de bords d'un test à l'autre je remet en place les version d'origines des fichiers après chaque test infructueux.

Je vais continuer les tests cet après midi et viendrais ajouter les résultats ici au cas ou.
Merci d'avance de la patience dont ceux qui répondent font preuve.

Prochain test prévu : installation de OrderCheck (galère de versions en prévision...) smile.gif

Écrit par : zattara 17 Oct 2011, 18:24

Bonjour à tous,

J'ai amélioré, entre autres, la gestion des variables de sessions dans une nouvelle version de la contribution :
http://addons.oscommerce.com/info/6691

En vous souhaitant de bonnes ventes !

Écrit par : chlorophylle 6 Jul 2012, 13:30

Bonjour

Je vais devenir fou !!

J'utilise la version 3.0c du module de paiement CMCIC.
J'ai tout installé et résinstallé plusieurs fois.
Et j'obtiens toujours : CGI NOT OK.
Le panier ne se vide pas. Rien ne s'enregistre dans la BDD.
J'utilise bien le fichier cmcic_response.php pour la en RC1.

Voilà la formulaire :

Citation
<form action="https://ssl.paiement.cic-banques.fr/test/paiement.cgi" method="post" id="PaymentRequest"> <input type="hidden" name="MAC" value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" /> <input type="hidden" name="version" value="3.0" /> <input type="hidden" name="TPE" value="xxxxxxx" /> <input type="hidden" name="date" value="06/07/2012:14:27:08" /> <input type="hidden" name="montant" value="8.15EUR" /> <input type="hidden" name="reference" value="000000000017" /> <input type="hidden" name="lgue" value="FR" /> <input type="hidden" name="societe" value="xxxxxxxx" /> <input type="hidden" name="url_retour" value="http://www.mon_site.fr/catalog/index.php" /> <input type="hidden" name="url_retour_ok" value="http://www.mon_site.fr /catalog/checkout_success.php" /> <input type="hidden" name="url_retour_err" value="http://www.mon_site.fr /catalog/checkout_payment.php" /> <input type="hidden" name="texte-libre" value="xxxxxxxxxxxxxxxxxxxxxxxxxx" /> <input type="hidden" name="mail" value="www@www.fr" /> <input type="submit" name="bouton" value="Paiement CB" /> </form>


Quelqu'un a-t-il un tout petit bout d'idée SVP ???

Écrit par : nilegoff 6 Jul 2012, 15:27

As tu précisé à cmcic qu'il fallait qu'ils renvoient la reponse sur "cmcic_response.php"?

nilegoff

Écrit par : chti_poupon 6 Jul 2012, 17:37

Bonjour
Ton blog n'est bien sûr pas osC.
Ton projet de site est dans quelle version ?
As-tu déjà installé des contrib?
Travailles-tu en local ou en distant...
Va voir http://www.oscommerce-fr.info/forum/index.php?showtopic=7241 pour savoir bien faire.
Pour la RC1, la version adaptée est http://addons.oscommerce.com/info/6691
Chti poupoon

Écrit par : chlorophylle 6 Jul 2012, 19:38

Bonjour

Merci pour vos réponses rapides. Ça me donne de nouvelles pistes.
Je me disais qu'il fallait que je vérifie vers quel fichier j'ai demandé d'envoyer le retour. Je vais contrôler ça.
J'utilise une 2.2 RC1, mais la contrib en 3.0c. Je vais tenter de rétrograder alors. Pourtant j'utilise bien le fichier dédié à la RC1.
Ma boutique tourne depuis 3 ans, j'en ai installé des tas des contrib !!! Ça faisait presque un an que j'avais rien bricolé dessus, mais je sens que je perds la main.

Encore merci. Je vous tiens au courant de la suite des événements.

Écrit par : chlorophylle 14 Jul 2012, 08:47

Bonjour

C'était un problème de fichier retour mal déclaré au CMCIC.
Pour cette partie là, c'est donc réglé.
Maintenant, j'ai les commandes qui s'affichent en double dans l'admin avec le même numéro. C'est une bricole que j'ai mal géré ça, je m'en sortir.

Merci encore !

Écrit par : aurelou 5 Aug 2012, 14:32

Bonjour,

Comme mes commandes ne s'affichent pas dans l'admin et que j'ai tout essayé sans succès, j'aimerais essayer le fichier de http://www.oscommerce-fr.info/forum/index.php?showuser=6327 en l'adaptant à mon application_top.

Il y a juste une chose que je ne comprends pas :
Comment modifier le nom repertoire appelé 'REPERTOIRE_CMCIC' dans les requires ?

Voici les lignes en question :

Citation
require_once("REPERTOIRE_CMCIC/CMCIC_Config.php");

// --- PHP implementation of RFC2104 hmac sha1 ---

require_once("REPERTOIRE_CMCIC/CMCIC_Tpe.inc.php");


Je n'ai pas de fichier s'intitulant CMCIC_Config.php

Merci pour votre aide.

Écrit par : chti_poupon 5 Aug 2012, 18:26

@chlorophyle
Voir http://www.oscommerce-fr.info/forum/index.php?showtopic=66528&view=findpost&p=350271 en cas d'admin bègue !

Écrit par : aurelou 11 Aug 2012, 15:01

Bonjour,

J'utilise la contribution cmcic_contrib_3.0c et la phase de paiement fonctionne bien, le retour est OK, tout est bon sauf que :

- les commandes ne s'affichent pas dans l'admin (elles sont pourtant enregistrées dans la base de données)
- le client ne reçoit pas le mail de confirmation de commande de ma part (il reçoit pourtant l'accusé de paiement du CIC)
- au niveau du stock rien ne bouge, le panier ne se vide pas non plus (mais ça peut-être que c'est parce que je suis en phase test ?)

J'ai essayé beaucoup de solutions proposées sur le forum mais je suis toujours perdue et je n'arrive pas à mettre ce module en place wacko.gif

Le temps passe et je continue à perdre de l'argent avec Paypal..

Si quelqu'un a une piste elle serait vraiment la bienvenue !

Merci à tous !

Écrit par : chti_poupon 12 Aug 2012, 10:16

Bonjour,

C'est défendu de faire un UP ! ce message sera raccroché à la série problèmes cmcic. mrgreen.gif

Ton extrait de code est très mal présenté et décourage les bonnes volontés. Sauf à passer 1/2 h à remettre en forme pour y retrouver ses jeunes.
J'ai ainsi pu découvrir, dans ton checkout_process.php ton paiement en plusieurs fois herdcodé à mort (comment changes-tu tes conditions ? et accessoirement, est-ce légal en France? (règles à plus de 3 fois))
Dans cmcic_response.php, il y a un seul mode de paiement, l'étalement est réglé par la banque (si tu prends le risque !).
Donc, tu peux virer dans cmcic_response.php uniquement mais 2 fois (partie test ET partie exploitation) le code suivant:

Code
f(is_object($$payment)) {
$email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" . EMAIL_SEPARATOR . "\n";
$payment_class = $$payment;
$email_order .= $order->info['payment_method'] . "\n\n";
if ($payment_class->email_footer) {
$email_order .= $payment_class->email_footer . "\n\n";
//Begin of checkout_process installment payments addition
if ($payment_class->code=='installment'){
$payment = $currencies->price();
$downpayment= number_format(($payment * 0.15),2);
$monthly_payment= ($payment - $downpayment) * 0.10573;
$salary = ($monthly_payment / 0.2);
$installment12= "\n" . 'Please Note:' . "\n" . 'Down Payment: ' . $downpayment . "\n" . '12 payments of : ' . number_format($monthly_payment, 2) . "\n" . 'To apply for this credit line, your minimum salary must be at least:' . number_format($salary, 2) . ' monthly';
$email_order .= $installment12;
}
//End of checkout_process installment payments addition
}
}

Car, étant en exploitation (je te l'avais pourtant demandé) les messages d'erreur sont normalement masqués.
Tiens nous au courant !
Chti poupon

Écrit par : aurelou 12 Aug 2012, 11:20

Merci beaucoup chti_poupon c'est vraiment gentil de m'aider !

Je me suis permise de créer un nouveau post car je me suis dis que ça ne venait pas de mon checkout_process étant donné que j'avais essayé de modifier le fichier cmcic_response en fonction. Ce n'était pas mon intention de faire un UP sur le post précédent même s'il est évident que je cherche activement une solution ! smile.gif

Dans mon checkout_process il s'agit du module de paiement par chèque où je permet de payer en 3 fois sans frais pour les montants de plus de 100 € (je pense que c'est légal, non ?). Les conditions se changent directement dans le fichier du module.

Je n'avais pas copié ce bout de code dans mon fichier cmcic_response.php car il s'agit des paiements par chèque (j'avais quand même essayé pour voir si ça fonctionnait avec mais ça ne changeait rien), donc j'ai essayé de supprimer seulement ces bouts de code :

Citation
if(is_object($payment)) {
$email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
EMAIL_SEPARATOR . "\n";
$payment_class = $payment;
$email_order .=
$order->info['payment_method'] . "\n\n";
if
($payment_class->email_footer) {
$email_order .=
$payment_class->email_footer . "\n\n";

}
}

Mais le problème est toujours là...

Je ne suis pas en local, je suis en exploitation en mode test.

Quand il y a des erreurs je les reçoie dans le mail de du CIC suite à une commande. Exemple :
Citation
Nous vous informons que votre interface de retour a emis un accuse de reception INVALIDE et la commande a ete VALIDEE.

Avec les lignes de code remises en cause.

Mais quand tout est VALIDE, ça ne fonctionne pas non plus...

Je vais devenir folle wacko.gif


Écrit par : chti_poupon 12 Aug 2012, 23:07

Es-tu bien en
mode: test,
simulation: oui
ou pas ?
Sinon, es-tu dans le cas cité par la FAQ http://www.oscommerce-fr.info/faq/qa_info.php?qID=182

Écrit par : aurelou 13 Aug 2012, 13:35

Bonjour chti_poupon !

Je suis en mode test et en simulation : oui !

Sinon je ne suis pas dans le cas cité par la FAQ, je n'ai pas de page blanche.

J'ai lu dans le forum que certaines applications comme http://addons.oscommerce.com/info/2823 pouvaient géner au bon fonctionnement de CMCIC. J'ai une plus ancienne version que j'ai essayé de désactiver et ça ne change rien. Peut-être y a-t-il d'autres contributions qui peuvent géner ?

Écrit par : chti_poupon 13 Aug 2012, 19:45

Bonjour
Tu nous dit:

Citation
- les commandes ne s'affichent pas dans l'admin (elles sont pourtant enregistrées dans la base de données)
- le client ne reçoit pas le mail de confirmation de commande de ma part (il reçoit pourtant l'accusé de paiement du CIC)
- au niveau du stock rien ne bouge, le panier ne se vide pas non plus (mais ça peut-être que c'est parce que je suis en phase test ?)


Citation
Les commandes ne s'affichent pas + au niveau du stock rien ne bouge + le panier ne se vide pas non plus + elles sont pourtant enregistrées dans la base de données
: Peux-tu vérifier que order_total, order_status_history et order_products aussi les contient ? Sinon, rien ne s'affiche.

Citation
le client ne reçoit pas le mail de confirmation de commande de ma part
: C'est que la commande est vide ou que l'envoi de courriel ne fonctionne pas -> peux tu envoyer un courriel à un client depuis l'admin (admin - outils - envoyer courrier électronique) et vérifier ?

Citation
il reçoit pourtant l'accusé de paiement du CIC
: C'est que, côté CIC tout est bon, et son adresse courriel bien transmise.

Toutes ces vérifications pour vérifier la cause de ta panne.
A te lire !
Chti poupon

Écrit par : aurelou 13 Aug 2012, 22:20

Bonsoir !

Voici mes vérifications :

Citation
Peux-tu vérifier que order_total, order_status_history et order_products aussi
les contient ? Sinon, rien ne s'affiche.

orders_total : ne les contient pas
orders_status_history : les contient
orders_products : les contient

Citation
C'est que la commande est vide ou que l'envoi de courriel ne fonctionne pas
-> peux tu envoyer un courriel à un client depuis l'admin (admin - outils -
envoyer courrier électronique) et vérifier ?

L'envoi du courriel à un client depuis l'admin fonctionne, je pense donc que c'est que la commande est vide

Merci beaucoup pour ton aide !

Écrit par : chti_poupon 15 Aug 2012, 10:56

C'est donc la partie de cmcic_response qui gère order_total qui est déficiente

Écrit par : aurelou 15 Aug 2012, 13:32

CA MARCHE !!

Alors je vous explique... J'ai de nouveau comparé mes fichiers, les parties de code qui gèrent order_total, essayé de remplacer mon fichier checkout_success par celui d'origine... Enfin plein de choses qui ne fonctionnaient pas.

J'ai donc essayé à tout hazard le fichier cmcic_response_rc1 et voilà que ça marche, tout bêtement.

J'ai pourtant suivi les instructions à la lettre, dans mon fichier "application_top" il est inscrit que ma version est "osCommerce Online Merchant v2.2 RC2a", c'est pour cela que j'utilisais le fichier cmcic_response_rc2.

Enfin voilà ça marche et c'est le principal !

Merci beaucoup chti_poupon d'avoir pris le temps de m'aider.

Écrit par : chti_poupon 18 May 2013, 17:40

COMPATIBILITE Order Check 2.2

Bonjour
Il apparaît que la compatibilité peut être assurée :

  1. En recopiant bien 2 fois (partie test et partie production) les modifications de checkout_process
  2. en écartant dans catalog l'option application_top_contributions.php: cmcic_response.php n'utilise en effet pas ce fichier. Il faut donc copier les define dans catalog/includes/filenames.php et catalog/includes/database_tables.php
  3. L'astuce peut être conservée dans l'admin


Bonnes modifications !

Chti poupon

PS Le second point est aussi valable pour OrcerCheck 2.5.1b qui utilise la même astuce

Propulsé par Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)