Version imprimable du sujet

Cliquez ici pour voir ce sujet dans son format original

Forum osCommerce-fr _ Modules de Paiement et de Livraison _ Module Systempay pour OsCommerce 2.2

Écrit par : mickael34 23 Mar 2016, 10:12

Bonjour,

Le problème a déjà été abordé mais jamais la solution n'a été clairement apportée.

Nous utilisons le module de paiement Systempay (version 2.7a) pour OsCommerce 2.2.

Le problème est le suivant :
2 personnes (ou plus) se retrouvent au même moment sur la page de paiement Systempay.
Les 2 paiements vont bien s'enregistrer côté Systempay.
Le 1er à valider son paiement aura bien sa commande d'enregistrée chez nous (dans notre backoffice).
Par contre le 2e se fera "refouler" pour un doublon sur le orders_id (tentative d'enregistrement sur le même orders_id que le client présent au même moment sur Systempay).

J'attends une réponse de la part de leur service technique mais le pb étant très "osCommerce", je viens demander de l'aide par ici.

Je pense que le problème vient de comment le orders_id est récupéré dans le module (d'ailleurs leur commentaire est assez explicite...) :

Code
    /**
     * Try to guess what will be the order's id when osCommerce will register it at the end of the payment process.
     * This is only used to set order_id in the request to the payment gateway. It might be inconsistent with the
     * final osCommerce order id (in cases like two clients going to the payment gateway at the same time...)
     *
     * @return int
     */
    function _guess_order_id() {
        $sql = "SELECT MAX(orders_id) FROM " . TABLE_ORDERS;

        $res = tep_db_query($sql);

        if(tep_db_num_rows($res) == 0) {
            return 0;
        } else {
            return mysql_result($res, 0, 0) + 1;
        }
    }

    /**
     * Test if order corresponding to entered trans_id is already saved.
     *
     * @return boolean true if order already saved
     */
    function _is_order_paid() {
        global $systempayResponse;
        
        $orderId = $systempayResponse->get('order_id');
        $customerId = $systempayResponse->get('cust_id');
        $transId = $systempayResponse->get('trans_id');
        
        $query = tep_db_query("SELECT * FROM " . TABLE_ORDERS .
                " WHERE orders_id >= $orderId" .
                " AND customers_id = $customerId" .
                " AND cc_owner LIKE '%Transaction: " . $transId . "'");
    
        return tep_db_num_rows($query) > 0;
    }
}


Si je comprend bien avec cette fonction, si 2 clients arrivent en même temps sur Systempay, ils auront comme référence le même "MAX(orders_id)", non ?
D'où dans ce cas l'erreur à la sortie sur la duplication de l'orders_id pour le "2e client".


J'utilise la superbe contribution ORDERSCHECK qui dès la page checkout_confirmation pré-enregistre la commande :

Code
// test last orders_id
  $_oders_max_query = tep_db_query("select max(orders_id) as max_id from " . TABLE_ORDERS . "");
  $_oders_max = tep_db_fetch_array($_oders_max_query);
  $_orders_id = $_oders_max["max_id"];

// test last holding_orders_id
  $holding_oders_max_query = tep_db_query("select max(orders_id) as max_id from " . TABLE_HOLDING_ORDERS . "");
  $holding_oders_max = tep_db_fetch_array($holding_oders_max_query);
  $holding_insert_id = $holding_oders_max["max_id"];

// assign last orders_in to prevent duplicate entry
   $insert_id = ($_orders_id >= $holding_insert_id )? $_orders_id+1 : $holding_insert_id+1;



Est-ce que ce n'est pas de ce côté là qu'il faudrait que le module aille chercher le orders_id ?

D'avance merci pour l'aide que vous pourrez m'apporter.

wink.gif


Écrit par : Djemai 18 Oct 2017, 18:27

Bonsoir
Avez vous résolu le problème avec ce module ?
Cordialement

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