Jump to content

Ajout d'une requête SQL après paiement validé ?


Recommended Posts

Bonjour,

Suite au paiement de la commande, je souhaiterai effectuer une requête SQL et récupéré le nom, mail, produit(s) achetés et les insérer dans une table distante. Pour ensuite faire une liaison de table avec un autre CMS.

Est il possible d’ajouter un script lors du retour de paiement valide ?

Récupérer toutes les infos précédentes et les ajouter dans le mail du client comme recap pour lui expliquer comment se connecter à cet autre site!

Merci de votre aide

amicalement,

franck

Link to comment
Share on other sites

bonjour, oui c'est possible.

Maintenant, soit tu places le script dans le traitement du retour valide de paiement par la banque dans le cas d'un paiement CB. Soit, et c'est peut-être plus judicieux (pour les divers modes de paiements), tu ajoutes ton traitement après le changement de statut de la commande vers "paiement accepté".

Link to comment
Share on other sites

Génial et serait-il possible de savoir où se trouve le traitement du retour valide de paiement par la banque.

ou alors le changement de statut de la commande vers le paiement accepté ?

je ne sais pas dans la BDD ou se trouve le récapitulatif d'une commande, ID du client et ID des produits achetés...

merci de votre réponse rapide, j'en suis très content car c'est pressé !

amicalement,

Link to comment
Share on other sites

Pour le paiement par cb, tout dépend du module que vous utilisez, ATOS, CyberMut, etc... et bien sur tous sont différents dans leur code

Pour le changement de statut de la commande reportez-vous à la classe en charge de cette fonction : /classes/PayementModule.php

votre code à placer (après les conditions nécessaires sur le paiement, en fonction du statut "paiement accepté") la fonction est :

function validateOrder($id_cart, $id_order_state, ... etc)

Link to comment
Share on other sites

Je pense que c'est cette fonction qui genre l'insert dans la bdd

$query = 'INSERT INTO `'._DB_PREFIX_.'order_detail`
(`id_order`, `product_id`, `product_attribute_id`, `product_name`, `product_quantity`, `product_quantity_in_stock`, `product_price`, `product_quantity_discount`, `product_ean13`, `product_reference`, `product_supplier_reference`, `product_weight`, `tax_name`, `tax_rate`, `ecotax`, `download_deadline`, `download_hash`)


par contre dans ps_order_detail, il y a les détails d'une commande...

mais je ne vois pas comment se fait le lien avec le client !

j'aimerai savoir si quelqu'un pourrait m'apporter une aide très précieuse pour m'aider à créer une requête quand le paiement est validé qui insérerait dans une nouvelle table les mêmes informations détails d'une commande (cad tous les produits avec les référence) et en plus l'adresse mail du client et son nom...

merci de votre aide ou de votre guidance...

amicalement

Link to comment
Share on other sites

Et ceux qui sont très habitués à Prestashop, peuvent-ils me donner un coup de main ?

Car je ne comprends pas toutes les fonctions et tous les appels, le code est peu commenté et difficile à suivre quelque fois !

merci de votre aide !

Link to comment
Share on other sites

Alors pour ne pas être trop demandeur et exigeant,

j'aimerai seulement que quelqu'un me donne la ligne après laquelle je doit insérer ma requête si je veux qu'elle s'exécute uniquement après la validation d'une commande (paiement pas chèque ou carte).

par exemple lorsque le dernier mail de confirmation part ou quelque chose comme ça !

merci encore de votre aide !

Link to comment
Share on other sites

Quelqu'un pourrait peut-être me dire (peut-être un dev)

comment "valid" dans ps_orders passe à 1 et surtout ou cela se produit ?

je ne trouve pas dans "PayementModule.php"

merci de votre aide --> j'avance doucement mais sûrement !

Link to comment
Share on other sites

Regarde du côté du hook updateOrderStatus(), ca me parait plus simple que le validateOrder.

Je pense qu'il est appelé automatique en retour de payment, quelque soit le mode de payment.
Il faut tester le nouveau status pour savoir que c'est payé

Link to comment
Share on other sites

ou aussi dans OrderHistory::changeIdOrderState()
qui appelle ensuite Hook::updateOrderStatus()


l'avantage de la fonction changeIdOrderState() de OrderHistory c'est qu'elle te permet de récupérer le panier précédemment validé en paiement par :

$oldOrderStatus = OrderHistory::getLastOrderState(intval($id_order));

$cart = Cart::getCartByOrderId($id_order);



dans $cart tu auras tout ton bonheur pour envoyé les éléments que tu veux vers ton autre bdd !

A+

Link to comment
Share on other sites

L'avantage d'un hook est qu'il évite de toucher au code dans le core.

Il suffit d'écrire un module qui s'abonne au hook et de tout faire dans le hook.
En particulier, ce updateOrderStatus reçoit le id_order en paramètre, il n'y a plus qu'à regarder la liste des produits dans ce Order.

Link to comment
Share on other sites

L'avantage d'un hook est qu'il évite de toucher au code dans le core.

Il suffit d'écrire un module qui s'abonne au hook et de tout faire dans le hook.
En particulier, ce updateOrderStatus reçoit le id_order en paramètre, il n'y a plus qu'à regarder la liste des produits dans ce Order.

+1
j'adhère à ce que tu viens de dire
Link to comment
Share on other sites

Merci de vos pistes !

Faut-il faire une verif du champs "valid" de "ps_orders" ? pour vérifier qu'il est bien à "1" ou alors est-ce déjà le cas lors de :

$oldOrderStatus = OrderHistory::getLastOrderState(intval($id_order));

$cart = Cart::getCartByOrderId($id_order);




???

merci encore

Link to comment
Share on other sites

  • 1 month later...

Bonjour Franck, merci pour ta réponse rapide.

Je souhaiterai un peu comme toi, effectuer une requête SQL qui récupère le nom, mail, produit(s) achetés mais au lieu de les insérer dans une table distante, faire un script qui envoi un mail automatique contenant les informations commandes et clients à mon transporteur une fois la commande validée. (en réfléchissant je pourrai même les insérer dans une table distante à la manière de ton script et ensuite générer les actions qui m'intéressent)

Ainsi il serait notifié automatiquement et pourrait envoyer le colis directement.

J'ai regardé du côté des modules, les module Alerte email fait a peu près ça sauf que celui-ci notifie par email lorsque une nouvelle commande est passée mais celle-ci n'est pas encore validée, donc le risque c'est que le transporteur envoie une commande pour un paiement refusé ou non validé.

Ou peut-être que quelqu'un connait une solution alternative ?

D'où ma question, pourrais-tu faire partager tes avancés sur ce point ?

Merci pour ta réponse !

Link to comment
Share on other sites

PRESTASHOP dans la page prestashop/classes/OrderHistory.php

Dans ce bout de code, j'enregistre des produits qui respectent certaines conditions (payés / référence commençant par un certain mot) dans une BDD externe ...

trouver à la ligne 79
/* The order is valid only if the invoice is available and the order is not cancelled */

$order->valid = $newOS->logable;
           $order->update();

           #Ajout du traitement Francky pour table externe
           if ($order->valid == 1 && intval($new_order_state)==2)
           {

               $sql_externe = "INSERT INTO `base_externe` (id_order, email, passwd, firstname, lastname, product_reference) SELECT `ps_orders`.id_order, `ps_customer`.email, `ps_customer`.passwd, `ps_customer`.firstname, `ps_customer`.lastname, `ps_order_detail`.product_reference  FROM `ps_orders`,  `ps_customer`,  `ps_order_detail` WHERE `ps_orders`.id_customer = `ps_customer`.id_customer  AND `ps_orders`.id_order = `ps_order_detail`.id_order  AND `ps_orders`.id_order = ".intval($order->id)." AND `ps_orders`.valid=1 AND `ps_order_detail`.product_reference != '' AND `ps_order_detail`.product_reference LIKE 'motcle_%'";
               $db2 = Db::getInstance();
               $result = $db2->Execute($sql_externe);

#LIKE 'motcle_%' permet de n'enregistrer dans cette base externe que certains produits qui ont comme début de référence "motcle_"

               $sql_externe2 = "INSERT INTO `base_externe2` (id_order, email, passwd, firstname, lastname, product_reference) SELECT `ps_orders`.id_order, `ps_customer`.email, `ps_customer`.passwd, `ps_customer`.firstname, `ps_customer`.lastname, `ps_order_detail`.product_reference  FROM `ps_orders`,  `ps_customer`,  `ps_order_detail` WHERE `ps_orders`.id_customer = `ps_customer`.id_customer  AND `ps_orders`.id_order = `ps_order_detail`.id_order  AND `ps_orders`.id_order = ".intval($order->id)." AND `ps_orders`.valid=1 AND `ps_order_detail`.product_reference != '' AND `ps_order_detail`.product_reference LIKE 'autremotcle_%'";
               $db3 = Db::getInstance();
               $result2 = $db3->Execute($sql_externe2);


#LIKE 'autremotcle_%' permet de n'enregistrer dans cette base externe que d'autres produits qui ont comme début de référence "autremotcle_"

           }

#Fin ajout Francky table externe




Voilà ce bout de code me permet de n'enregistrer dans PS 1.2 que les produits dans la BDD externe qui ont été payés (verif CB ou Paypal / chèque validé en Admin)

Donc maintenant, je fonctionne avec sans PB...

Petite info en plus (KDO BONUX) comme j'enregistre dans la BDD le MDP crypté, il faut pouvoir le changer lorsque le client le change dans son compte ou lors de la génération d'un nouveau mot de passe lors d'un oubli...

Il fallait y penser (j'avais oublié) donc si c'est important pour toi, dis le moi !

Link to comment
Share on other sites

  • 1 month later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...