THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3
  • manu
  • faï tot petar miladiu

Offline


Salut à tous.

Par défaut, thélia envoie le mail de confirmation de commande une fois que l'on a choisi le mode de paiement.

Beaucoup d'entre vous souhaite modifier ca pour choisir le moment d'envoi de ce mail, donc je vais vous montrer à l'aide de quelques copier/coller comment y arriver tongue

1/ envoi lors du retour de banque :

Si le paiement est fait via une banque (plugin atos, cic, ...) elles retournent toutes le statut de la commande (si c'est payé ou si ca a foiré, etc). Petit écart pour dire que ce retour de banque ne peut pas être considéré comme fiable mais juste là à titre indicatif, toujours vérifier sur l'interface de la banque si le paiement a été fait.

Je vais prendre pour exemple le plugin atos, mais c'est générique à tous les plugins de banque.

Alors en fait l'envoi du mail se fait dans le fichier PluginsPaiement.class.php grâce à la fonction mail().

Donc das le fichier Atos.class.php on va créer une méthode mail() qui sera vide donc plus d'envoi de mail lors de choix du paiment (vive l'héritage big_smile ) :

function mail($commande){
}

on crée une nouvelle méthode que j'appel confirmmail() qui est ni plus ni moins qu'un copié/collé du contenu de la fonction mail (celle qui est dans classes/PluginsPaiements.class.php)

function confirmmail($commande){
//copié le contenu de la fonction mail du fichier classes/PluginsPaiements.class.php)
}

Maintenant attention le plus difficile faire l'envoi du mail, on utilise la méthode confirmation, c'est celle qui est utilisé lors du retour de la banque et ca donne :

function confirmation($commande){
$this->confirmmail($commande);
}

et voila le tour est joué votre mail partira lorsque le client aura payé sa commande smile

2/ changement de statut de la commande manuellement :

Cette méthode est à mettre en place dans UN seul plugin paiement (dans le cas ou plusieurs sont activés)

d'abord créer la fonction mail() vide :

function mail($commande){
}

créer la fonction, que j'appel toujours confirmmail et dont le contenu est la copié/collé de la fonction mail du fichier class/PluginsPaiements.class.php

function confirmmail($commande){
//copié le contenu de la fonction mail du fichier classes/PluginsPaiements.class.php)
}

créer la fonction statut qui est appelé à chaque changement (manuellement) du statut de la commande et vérifier le statut de la commande, ici faut qu'elle soit à payer :

function statut($commande){
			if($commande->statut == 2){
				$this->confirmmail($commande);
			}
		}

EDIT :

Pour que cette méthode marche, vous devez inclure les classes dont vous vous servez dans votre mail dans votre fichier (par ex dans Atos.class.php si vous utilisez atos). Par défaut , vous devez inclure les classes message, messagedes, client, variable et commande.

voila un exemple pour inclure une des classes :

include_once(realpath(dirname(__FILE__)) . "/../../../classes/Message.class.php");

Je vous laisse faire pour les autres tongue


http://doc.thelia.net/
http://thelia.net/modules
http://raynaud.io
PGP public Key : 0xC6E546A6

Offline


Merci manu, ça semble simple et clair smile
Je vais me pencher la dessus sous peu !

Offline


J'allais protester :on ne peut pas utiliser une copie de la méthode mail et la méthode substimail au retour de la banque car les données de session du client ne sont plus utilisables, et je me suis rendu compte que les codes de ces deux méthodes avaient été changé sous thelia 1.3.7 pour éliminer le recours aux données de session et que désormais ces deux méthodes pouvaient être appelées depuis les pluginspaiements... A l'exception de $_SESSION['navig']->lang qui a du être oublié.

Quand vous écrivez que le retour de la banque ne peut pas être considéré comme fiable vous m'inquiétez, car si le commerçant est obligé pour chaque acheteur de consulter sa banque vous vérifier que le paiement a bien été effectué cela vaut-il encore le coup de faire un site de e-commerce?

  • yoan
  • Cofondateur Thelia

Offline


ba le commerçant doit bosser un peu.
Il suffit d'avoir son interface bancaire dans un 2eme onglet, la plupart de nos clients vérifient et n'ont pas de soucis avec ça.

De ttes façons il faut pointer comptablement les infos.


http://yoandemacedo.com

Cofondateur de la solution Thelia 1.x

  • manu
  • faï tot petar miladiu

Offline


ben certains de nos clients demandent même de ne pas avoir ce retour banque et ils vérifient systématiquement dans l'interface de la banque si le paiement est passée.

Il n'est pas fiable pour plusieurs raisons :
- pas de connexion sécurisé lors du retour (pas de ssl).
- on ne connait pas l'adresse IP des serveurs des banques (et même si on les connaissait ce ne serait pas une donnée fiable).


http://doc.thelia.net/
http://thelia.net/modules
http://raynaud.io
PGP public Key : 0xC6E546A6

  • manu
  • faï tot petar miladiu

Offline


de plus depuis la 1.3.7 les sessions sont vidés une fois que le client arrive sur merci.php ou regret.php donc on peut encore utiliser les sessions dans le plugin.

Pour ceux avant la 1.3.7, trouver la ligne qui vide la sessions dans le plugin, l'effacer et mettre $reset=1 dans merci.php et regret.php


http://doc.thelia.net/
http://thelia.net/modules
http://raynaud.io
PGP public Key : 0xC6E546A6

Offline


Voila une discussion très interessante pour moi et, si vous voulez bien, je continue.
Le commerçant pour qui je monte une site de e-commerce à une petite boutique (par son chiffre d'affaire, mais un gros catalogue) et ne pas avoir de retour fiable de la banque lui imposerait de suivre les paiements et de faire lui même la mise à jour des stocks de la base de donnée (je ne tiens pas du tout à le faire à sa place !).

La banque du commerçant est le crédit mutuel et je vais donc utiliser le plugin CIC.
Dans ce plugin le retour de la banque se fait par appel du script aRenommerResultat.php=confirmation.php qui ne fait absolument pas appel aux données de session, ni n'efface aucune donnée de session.
Je ne comprends d'ailleurs pas à quelle session il ferait appel étant donné que la banque revient directement sur le serveur du commerçant et qu'à ce moment les seules données fiables identifiant le paiement me paraissent  être la référence de la transaction et son montant.
J'avoue que la gestion des sessions et la manière dont les identifiants de session accompagnent les requêtes me dépassent un peu.
En tout cas, lorsque je vais rencontrer le correspondant e-paiement de la banque du commerçant je vais avoir quelques questions de plus à poser!

Offline


P.S. c'est justement parce que le script confirmation.php du plugin CIC ne fait pas appel aux données de session et que c'est dans ce script qu'il y a lieu d'appeler la méthode mail du plugin que j'ai signalé plus haut l'oubli du remplacement de l'appel à $_SESSION['navig']->lang.

Last edited by jhr (01-10-2008 18:30:09)

  • yoan
  • Cofondateur Thelia

Offline


Ce n'est pas vraiment ce que je veux dire.
Quand on parle de fiabilité, c'est simplement lorsqu'une commande passe en "payée" dans l'admin, de vérifier qu'elle est bien enregistrée à la banque via l'interface fournie par celle-ci.

Rien de plus.


http://yoandemacedo.com

Cofondateur de la solution Thelia 1.x

  • manu
  • faï tot petar miladiu

Offline


En tout cas, lorsque je vais rencontrer le correspondant e-paiement de la banque du commerçant je vais avoir quelques questions de plus à poser!

La il y a de grandes chances pour que tu en saches plus que lui et qu'il ne sache pas trop quoi répondre ^^


http://doc.thelia.net/
http://thelia.net/modules
http://raynaud.io
PGP public Key : 0xC6E546A6

Offline


Il semble que le plugin suivant ferait une bonne base pour envoyer des emails pour le changement manuel de statut, plutot que d'affecter un plugin de paiement....

http://contrib.thelia.fr/spip.php?article39

Pour l'instant il n'envoie qu'un email pour un statut de commande =4 (envoyé) mais peut être modifier pour se comporter de manière similaire pour les autres statuts....

Offline


Je suis entrain de plancher là dessus en environnement de test avec le plugin cic.
J'ai juste un petit problème, ça je l'ajoute où ?

function confirmation($commande){
$this->confirmmail($commande);
}

Car j'ai beau essayé là où ça me semble logique, je n'arrive pas déclencher l'envoi de mail après validation du paiement par le plugin. sad

  • manu
  • faï tot petar miladiu

Offline


il faut le faire dans cic.class.php, il ne faut pas oublier de faire la fonction mail qui est vide.

donc tu as dans le même fichier (Cic.class.php la fonction mail => vide, confirmail=> copie du contenu de la fonction mail et confirmation tel que tu l'as copié)


http://doc.thelia.net/
http://thelia.net/modules
http://raynaud.io
PGP public Key : 0xC6E546A6

Offline


Dans la mesure où la fonction mail ne ferait plus appel aux données de session (voir plus haut) pourquoi ne pas surcharger la méthode confirmation dans Cic.class suivant :

function confirmation($commande){
$this->mail($commande);
}

Il est d'ailleurs possible d'insérer simplement, là où la validité du paiement a été correctement vérifié :

modules_fonction("mail", $commande,"cic");
  • manu
  • faï tot petar miladiu

Offline


Avec ma méthode on surcharge déjà la fonction confirmation.

Et non il n'est pas possible de faire ce que tu fais, à moins de modifier le moteur car ce que tu proposes :

modules_fonction("mail", $commande,"cic");

est fait dans le fichier action, fonction paiement ligne 328 (thelia 1.3.7).

Donc ca enverra le mail lors du départ sur le banque ET lors du retour de la banque (si paiement réussi).

donc le mieux est de surcharger une première fois la fonction mail en lui mettant un contenu vide et de surcharger la fonction confirmation en appelant une méthode qui est la copie de la fonction mail.

PS : alors le banquier il t'a dit quoi?


http://doc.thelia.net/
http://thelia.net/modules
http://raynaud.io
PGP public Key : 0xC6E546A6

Offline


@manu: bon c'est bien ce qui m'embete, car c'est comme ca que je procédais, exactement comme tu viens de le décrire.
Concretement la banque me fourni bien un retour valide, le statut est bien passé à "payé", mais aucun mail n'est envoyé.
T'as une idée ?
Merci wink

Last edited by psai (09-10-2008 13:47:53)

Offline


jhr wrote:

[...] et ne pas avoir de retour fiable de la banque lui imposerait de suivre les paiements[...]

jhr, il me semble (mais c'est à confirmer que les retours de banque type euro information (cic, cybermut) peuvent contenir beaucoup plus d'infos que ce n'est le cas par défaut, cependant ces banques exigent de négocier avec un certificat SSL pour le retour (ce qui est compréhensible).
Vu le prix d'un certificat SSL aujourd'hui (environ 15$ pour les premiers prix), et vu ton niveau, c'est peut-être une solution à envisager pour ton client.

Offline


Distrait, je suis
Effectivement j'ai supprimé module_fonction("mail", etc..) du moteur.
Et donc j'ai enfin compris la finesse de de la proposition de manu.

En ce qui concerne SSL, il faut que j'étudie la chose; je n'ai pas relevé dans la documentation fournie par euro information qu'un certificat SSL était indispensable.

Offline


jhr wrote:

[...] je n'ai pas relevé dans la documentation fournie par euro information qu'un certificat SSL était indispensable.

Indispensable non, mais de mémoire, il y a moyen de disposer de plus d'informations dans le retour de la banque (date de validité carte, etc ...). Cependant, pour ces informations supplémentaires, la banque exige de négocier en https, donc un certificat. Mais si tu n'a pas besoin de ces informations là, tu négocies en http en clair, et tu auras les infos de retour standar.
Je pensais que si tu as besoin de plus de fiabilité concernant le retour de la banque, c'est peut-être une solution à envisager.

Du coup tu es arrivé à envoyer le mail lors d'un retour valide de la banque ?
Car de mon coté, avec le plugin CIC, ce n'est toujours pas le cas, j'arrive à envoyer un mail de test avec les infos en dur (tel que sujet, destinataire, etc ...), mais pas en récupérant les infos du client.
Je continue à plancher dessus.

  • manu
  • faï tot petar miladiu

Offline


J'ai apporté une modification au mini tuto que j'ai fait.

En effet j'avais omis une chose assez importante (honte à moi), c'est l'inclusion des classes dont on se sert smile

C'est psai qui m'a mis sur la piste car je m'étonnais qu'il n'arrive pas à mettre en place la solution.

Tous à vos mails.


http://doc.thelia.net/
http://thelia.net/modules
http://raynaud.io
PGP public Key : 0xC6E546A6

Offline


Oh bah psai il a juste dit "hey ça marche pas!" et manu a fait tout le boulot smile
Alors pour manu hip hip hip ... ! big_smile

Offline


Merci beaucoup pour ce travail et toutes les réponses rapides!!

ça marche très bien pour paypal !! smile

Offline


bjm, te serait-il possible de poster la modif ?
J'ai des soucis avec la sandbox de paypal pour mes tests et si tu as qqch de fonctionnel ça serait un énorme gain de temps.
Par avance, merci smile

Offline


Pardon de mon retard!!!!

Voici le contenu de ma page : Paypal.class.php

<?php

	include_once(realpath(dirname(__FILE__)) . "/../../../classes/PluginsPaiements.class.php");
	include_once(realpath(dirname(__FILE__)) . "/../../../classes/Message.class.php");
	include_once(realpath(dirname(__FILE__)) . "/../../../classes/Messagedesc.class.php");
	include_once(realpath(dirname(__FILE__)) . "/../../../classes/Client.class.php");
	include_once(realpath(dirname(__FILE__)) . "/../../../classes/Commande.class.php");
	include_once(realpath(dirname(__FILE__)) . "/../../../classes/Variable.class.php");
	
	class Paypal extends PluginsPaiements{

		function init(){
			$this->ajout_desc("Paypal", "Paypal", "", 1);
	
		}

		function Paypal(){
			$this->PluginsPaiements("paypal");
		}
		
		function mail($commande){
		}
		function confirmmail($commande){
//copié le contenu de la fonction mail du fichier classes/PluginsPaiements.class.php)
			$sujet=""; 
			$corps="";

			/* Message client */
			$msg = new Message();
			$msg->charger("sujetcommande");
			$msgdesc = new Messagedesc();
			$msgdesc->charger($msg->id);
			$sujet = $msgdesc->description . " " . $commande->ref;
			$msg->charger("corpscommande1");
			$msgdesc = new Messagedesc();                
			$msgdesc->charger($msg->id);
			$corps = $msgdesc->description;
			$corps = $this->substitmail($corps, $commande);

			/* Message admin */
        	$msg->charger("corpscommande2");
        	$msgdesc = new Messagedesc();
        	$msgdesc->charger($msg->id);
			$corps2 = $msgdesc->description;
		
			$emailcontact = new Variable();
			$emailcontact->charger("emailcontact");	
			$corps2 = $this->substitmail($corps2, $commande);

			//$client = new Client();
			//$client->charger_id($commande->client);
			
			//mail($client->email , "$sujet", "$corps", "From: $emailcontact->valeur");
				mail($_SESSION['navig']->client->email , "$sujet", "$corps", "From: $emailcontact->valeur");
			mail($emailcontact->valeur , "$sujet", "$corps2", "From: $emailcontact->valeur");	
			
		}
		
		function confirmation($commande){
		$this->confirmmail($commande);
		}
		function statut($commande){
            if($commande->statut == 2){
                $this->confirmmail($commande);
            }
        }
		
	
		function paiement($commande){

			header("Location: " . "client/plugins/paypal/paiement.php");			
		}
	
	}

?>

En espérant que ma réponse n'arrive pas trop tard.

Offline


Merci de ta réponse, je teste ca dans la semaine smile
Pas de soucis pour le retard j'étais bien occupé également !