Bonjour,
je me permets de poster mon problème ici car je ne sais plus quoi faire.
Je précise d'emblée que je ne suis pas développeur, je suis étudiant en système et réseau, et n'ai donc que des connaissances basiques en ce qui concerne la programmation. J'ai néanmoins déjà développé en php donc je comprendrai vos explications (enfin en théorie).
Depuis 3semaines je dois déboguer un site d'assistance informatique. Ce site permet à un client de mon entreprise d'acheter des tickets lui octroyant une assistance de la part de l'un de nos techniciens.
Juste après la validation du paiement s'affiche une page indiquant que l'utilisateur va être redirigé vers une page résumant son achat, avec la possibilité de forcer cette redirection en cliquant sur un lien.
Après la redirection, que l'on clique sur le lien ou que l'on attende la redirection automatique, les numéros des tickets voulus par l'utilisateur lui sont envoyés par courriel.
Le problème est que, lorsque l'on achète en utilisant google chrome, si on clique sur le lien pour forcer la redirection, les tickets sont générés en double, et deux courriels sont envoyés à l'utilisateur ...
Le module de paiement du crédit agricole est utilisé par le site.
Il est installé sur un serveur WAMP.
Voici les deux fichiers en rapport avec le paiement :
paiement.php :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307 <?php // LANCEMENT DU SYSTEME DE SESSION session_start(); //Envoi du mail contenant les informations tapées avant le paiement $destinataire = 'contact@monentreprise.fr'; $headers2 = 'MIME-Version: 1.0' . "\r\n"; $headers2 .= 'From:monentreprise <no-reply@monentreprise.fr>' . "\r\n" . 'Reply-To:no-reply@monentreprise.fr' . "\r\n" . 'Content-type: text/html; charset= utf8\n'. 'X-Mailer:PHP/'.phpversion(); $sujet = 'Contact monentreprise'; $noinfo='non renseigné'; $memail = $_POST["email"]; $mtitre = $_POST["titre"]; $mprenom = $_POST["prenom"]; $mnom = $_POST["nom"]; $mtelephone = $_POST["telephone"]; if (isset($_POST['societe'])) { $msociete = $_POST['societe'];} else { $msociete = $noinfo; } if (isset($_POST['rue-1'])) { $mrue1 = $_POST['rue-1'];} else { $mrue1 = $noinfo; } if (isset($_POST['rue-2'])) { $mrue2 = $_POST['rue-2'];} else { $mrue2 = $noinfo; } if (isset($_POST['rue-3'])) { $mrue3 = $_POST['rue-3'];} else { $mrue3 = $noinfo; } if (isset($_POST['code-postal'])) { $mcodepostal = $_POST['code-postal'];} else { $mcodepostal = $noinfo; } if (isset($_POST['ville'])) { $mville = $_POST['ville'];} else { $mville = $noinfo; } if (isset($_POST['pays'])) { $mpays = $_POST['pays'];} else { $mpays = $noinfo; } if (isset($_POST['siret'])) { $msiret = $_POST['siret'];} else { $msiret = $noinfo; } if (isset($_POST['tva'])) { $mtva = $_POST['tva'];} else { $mtva = $noinfo; } $madresse=$mrue1." ".$mrue2." ".$mrue3; $msg ="Voici les informations que le client a saisies dans le formulaire de commande de tickets, indépendamment de la finalisation du paiement :<br/><br/>- Champs obligatoires - <br/>Titre : ".$mtitre."<br/>Prénom : ".$mprenom."<br/>Nom : ".$mnom."<br/>Adresse mail : ".$memail."<br/>Numéro de téléphone : ".$mtelephone."<br/>"; if (!empty($msociete)) { $msg .="<br/>- Concernant la facture - <br/>Société : ".$msociete."<br/>Adresse : ".$madresse."<br/>Code postal : ".$mcodepostal."<br/>Ville : ".$mville."<br/>Pays : ".$mpays."<br/>SIRET : ".$msiret."<br/>Numéro de TVA intracommunautaire : ".$mtva."<br/>"; } else{} //a quoi sert ce if ? Il est execute tout le temps pour rien apparemment ... if(mail($destinataire,$sujet,$msg,$headers2)){}else{} // Vérifie si un une varaible existe dans _POST et si elle n'est pas vide function checkPostIndex( $index_name ) { $state = false; if( is_string($index_name) ) { if( isset($_POST[$index_name]) ) { $state = !empty($_POST[$index_name]); } } else if ( is_array($index_name)) { $loop_state = true; foreach ($index_name as $value) { if( !checkPostIndex($value) ) { $loop_state = false; } } $state = $loop_state; } return $state; } /** * Fonction permettant de tester les paramètres requis envoyés pas la page d'achat */ function checkPaymentParameters() { $nombre_tickets = intval($_POST["nombre-tickets"]); $email = $_POST["email"]; $email_confirmation = $_POST["email-confirmation"]; $state = true; if( $nombre_tickets < 0 ) { $state = false; $error = 1; } else if ( !filter_var($email ,FILTER_VALIDATE_EMAIL) ) { $state = false; $error = 2; } else if ( strtolower(trim($email)) != strtolower(trim($email_confirmation)) ) { $state = false; $error = 3; } if( $state == false ) { header("location: /index.php?erreur=".$error ); exit(0); } return $state; } /** * Fonction permettant de tester les paramètres optionnels envoyés pas la page d'achat */ function checkOptionalParameters() { $parameters = array ( getPost("societe"), getPost("rue-1"), getPost("code-postal"), getPost("ville"), getPost("pays") ); /** * Paramètres pas forcément requis pour le moment : * getPost("rue-2"), * getPost("rue-3"), * getPost("siret"), * getPost("tva"), */ foreach ($parameters as $key => $value) { if( empty($value) ) return false; } return true; } function getPost($index, $default_value = false) { if( isset($_POST[$index]) ) { if( !empty( $_POST[$index] ) ) { return $_POST[$index]; } } return $default_value; } // parametres que la page PHP doit récupérer obligatoirement poru fonctionenr correctement $parametres_post = array( "titre", "prenom", "nom", "telephone", "email", "email-confirmation", "nombre-tickets" ); // Vérification des paramètres if ( checkPostIndex( $parametres_post ) ) { // Vérification supplémentaires : $xml=simplexml_load_file("configuration.xml"); $prix_ticket = (string)$xml->ticket->prix; // on utilise pas la variable accessible depuis $_POST (elle pourra être utilisée, mais par défaut il est préférable de récupérer cette info depuis le serveur web) $nombre_tickets = (string)$xml->ticket->quantite; $tva = (int)$xml->ticket->tva; // récupération des paramètres envoyés par la page d'achat $email = $_POST["email"]; $email_confirmation = $_POST["email-confirmation"]; $titre = $_POST["titre"]; $prenom = $_POST["prenom"]; $nom = $_POST["nom"]; $telephone = $_POST["telephone"]; // Vérifications supplémentaires (champs mail valide? nombre de ticket valide? ) if( checkPaymentParameters() ) { $recevoirFacture = getPost("recevoir-facture"); if( $recevoirFacture != null ) { if( !checkOptionalParameters() ) { header("location: /index.php?erreur=0"); die(0); } // Informations à enregistrer en session si tout est valide : $_SESSION["societe"] = getPost("societe"); $_SESSION["rue-1"] = getPost("rue-1"); $_SESSION["rue-2"] = getPost("rue-2"); $_SESSION["rue-3"] = getPost("rue-3"); $_SESSION["code-postal"] = getPost("code-postal"); $_SESSION["ville"] = getPost("ville"); $_SESSION["pays"] = getPost("pays"); $_SESSION["siret"] = getPost("siret"); $_SESSION["num-tva"] = getPost("tva"); } // Indique si la case à cocher pour obtenir une facture par courrier est cochée $_SESSION["recevoir-facture"] = ( getPost("recevoir-facture") != null ); // Les paramètres sont correctes, enregistrement de tout en session pour réutilisation et lancement du module e-transaction // Client : $_SESSION["titre"] = $titre; $_SESSION["prenom"] = $prenom; $_SESSION["nom"] = $nom; $_SESSION["telephone"] = $telephone; $_SESSION['email'] = $email; // Prix et quantité $_SESSION['prix-ticket'] = $prix_ticket; $_SESSION['nombre-tickets'] = $nombre_tickets; $_SESSION['tva'] = $tva; // Les variables pour le paiement sont correctes : // Mode d'appel $PBX_MODE = '4'; //pour lancement paiement par exécution //$PBX_MODE = '1'; //pour lancement paiement par URL //identification $PBX_SITE = '1177593'; $PBX_RANG = '01'; $PBX_IDENTIFIANT= '229341201'; //gestion de la page de connection : paramétrage "invisible" $PBX_WAIT = '0'; $PBX_TXT = "" ; //"<div style=\"margin: auto; height: 300px;border: 1px solid #646464; border-radius: 5px;\"><center><p><b>Redirection vers la page de paiement sécurisé en cours,<b><p><p>Veuillez patienter quelques instants ...</p></center></div>"; $PBX_BOUTPI = "nul"; $PBX_BKGD = "#f5f5f5"; // PARTIE DYNAMIQUE //informations paiement (appel) // ATTENTION : PAIEMENT EN CENTIMES !!! // On garde seulement deux chiffres après la virgule dans le montant (les autres sont coupés) -> TVA prise en compte! $PBX_TOTAL = (( $prix_ticket * $tva / 100 ) + $prix_ticket ) * $nombre_tickets * 100; // 978 => devise en UROS $PBX_DEVISE = '978'; // Référence de commande // Référence type : NUMSQL du client + '-' + id unique $PBX_CMD = "OA-".uniqid(); // Email du porteur $PBX_PORTEUR = $email; // RAPPEL DES LIENS VERS LES DIFFERENTES REPONSES POSSIBLES D'E-TRANSACTION //informations nécessaires aux traitements (réponse) /** * ///////////////////////////////////////////////////////////////////////////////////////////////// * // INFORMATION CONCERNANT PBX_RETOUR (ce que le programme e-transaction renvoie) // * ///////////////////////////////////////////////////////////////////////////////////////////////// * * - "M" => le Montant de la transaction (précisé dans PBX_TOTAL). * - "R" => votre Référence commande (précisée dans PBX_CMD) : espace URL encodé, * - "T" => un identifiant de Transaction (numéro dappel séquentiel e-transactions), * - "A" => le numéro dAutorisation (numéro remis par le centre dautorisation) : URL encodé, * - "B" => le numéro daBonnement (numéro remis par e-transactions), * - "P" => le type de Paiement retenu (CARTE, ), * - "C" => le type de Carte retenu (CB, VISA, EUROCARD_MASTERCARD, AMEX, ), * - "S" => le numéro de la tranSaction (identifiant unique de la transaction), * - "Y" => le code paYs de la banque émettrice de la carte : norme ISO 3166 (code alphabétique), * - "E" => le code Erreur de la transaction ([voir page 22]), * - "D" => Date de fin de validité de la carte du porteur (Format AAMM), * - "" => Gestion des abonnements avec le traitement Gestion Automatisée des encaissements ([voir page 24) : URL encodé, * - "I" => Le code pays de ladresse IP de linternaute : norme ISO 3166 (code alphabétique) : URL encodé * - "" => Signature sur les variables de lURL ([voir page Erreur ! Signet non défini.]) : URL encodé, * - "N" => 6 premiers chiffres (« bin6 ») du numéro de carte de lacheteur : URL encodé, * - "H" => Empreinte de la carte, * - "G" => Garanti du paiement (O ou N). Programme 3-D Secure, * - "O" => EnrOlement du porteur/acheteur au programme 3-D Secure. Y:Porteur enrôlé, N:Porteur non enrôlé, U:Information non connue, * - "F" => Etat de lauthentiFication du porteur vis-à-vis du programme 3-D Secure. Y:Porteur authentifié, A:Authenatification du porteur forcée par la banque de lacheteur, U:Lauthentification du porteur na pas pu seffectuer, N:Porteur non authentifié, * - "J" => : 2 derniers chiffres du numéro de carte du porteur, * - "W" => Date de traitement de la transaction sur la plateforme e-transactions (Format JJMMAAAA), * - "Z" => Index lors de lutilisation des paiements mixtes (cartes cadeaux associées à un complément par carte CB/Visa/MasterCard/Amex), * - "Q" => Heure de traitement de la transaction (Format 24h / HH:MM:SS) * * Exemple d'utilisation : $PBX_RETOUR = "montant:M;maref:R;auto:A;trans:T;abonnement:B ;paiement:P;carte:C;idtrans:S;pays:Y;erreur:E;validite:D;PPPS:U;IP:I;BIN6:N;digest:H;sign:K" * Les adresses de redirections recevront avec cet exemple les variables suivants dans $_GET[] : montant, maref, auto, ... */ // ATTENTION !!! NE PAS DEPASSER 250 caractères !!! $PBX_RETOUR = "montant:M;maref:R;auto:A;trans:T;paiement:P;carte:C;idtrans:S;erreur:E;validite:D;BIN6:N;digest:H;date:W;heure:Q;sign:K"; // ADRESSES DE REDIRECTIONS // AFIN DE 'SECURISER' LA VERIFICATION DU PAIEMENT EN PHP, le staut correspond à une chaine de caractères aléatoires, // LES DIFFERENTS status possible seront stockés en session // Explication : E-TRANSACTION renvoie en GET toutes les donénes conernant le paiement, il est donc possible qu'un pirate copie l'url, // et la modifie pour par exemple acheter gratuitement en modifiant un paiement refusé en accepté /** * Détail de la solution de sécurité : * - 4 chaines de caractères aléatoires sont générées et associées à un status (valide, refuse, annule, erreur) * - Les valeurs des status sont stockées en session pour qu'on puisse identifier les status depuis la page de verification de paiement * - les urls de redirection après paiement sont générées avec le status correspondant * * Quand la page de vérification reçoit une réponse d'E-Transaction, elle vérifie si les status sont présents en session * (sinon, aucun paiement n'est à l'origine de cette url, c'est soit un rechargement de page, soit une attaque d'un pirate!) * * Afin d'améliorer encore la sécurité, les données sont supprimmées de la session une fois récupérées * (pour éviter qu'un pirate puisse analyser l'URL correctement, et qu'il ne trouve pas la chaine de caractères correspondant au status valide par exemple) */ // SUCCES $PBX_EFFECTUE = "http://www.monsite.fr/paiement_fini.php?status=succes"; // REFUS $PBX_REFUSE = "http://www.monsite.fr/paiement_fini.php?status=refus"; // ANNULATION $PBX_ANNULE = "http://www.monsite.fr/paiement_fini.php?status=annule"; // ERREUR DE PARAMETRAGE $PBX_ERREUR = "http://www.monsite.fr/paiement_fini.php?status=erreur"; //construction de la chaîne de paramètres à envoyer lors de l'exécution du module de paiement $PBX = 'PBX_MODE="'.$PBX_MODE.'" '; $PBX .= 'PBX_SITE="'.$PBX_SITE.'" '; $PBX .= 'PBX_RANG="'.$PBX_RANG.'" '; $PBX .= 'PBX_IDENTIFIANT="'.$PBX_IDENTIFIANT.'" '; $PBX .= 'PBX_WAIT="'.$PBX_WAIT.'" '; $PBX .= 'PBX_TXT="'.$PBX_TXT.'" '; $PBX .= 'PBX_BOUTPI="'.$PBX_BOUTPI.'" '; $PBX .= 'PBX_BKGD="'.$PBX_BKGD.'" '; $PBX .= 'PBX_TOTAL="'.$PBX_TOTAL.'" '; $PBX .= 'PBX_DEVISE="'.$PBX_DEVISE.'" '; $PBX .= 'PBX_CMD="'.$PBX_CMD.'" '; $PBX .= 'PBX_PORTEUR="'.$PBX_PORTEUR.'" '; $PBX .= 'PBX_EFFECTUE="'.$PBX_EFFECTUE.'" '; $PBX .= 'PBX_REFUSE="'.$PBX_REFUSE.'" '; $PBX .= 'PBX_ANNULE="'.$PBX_ANNULE.'" '; $PBX .= 'PBX_ERREUR="'.$PBX_ERREUR.'" '; $PBX .= 'PBX_RETOUR="'.$PBX_RETOUR.'" '; $return = null; // echo shell_exec("\"modulev2.exe\" ".$PBX); echo shell_exec("\"./bin/modulev2.exe\" ".$PBX); die(1); } else { // Rediriger vers la page de paiement, avec les erreurs asociées header("location: /index.php?erreur=".$erreur_number.";"); exit(); } } else { header("location: /index.php?erreur=0"); exit(0); }
Le contenu de paiement_fini.php :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343 <?php // Lancement du système de session session_start(); /** * FONCTIONS UTTILES AUX TRAITEMENTS */ function checkPostIndex( $index_name ) { $state = false; if( is_string($index_name) ) { if( isset($_POST[$index_name]) ) { $state = !empty($_POST[$index_name]); } } else if ( is_array($index_name)) { $loop_state = true; foreach ($index_name as $value) { if( !checkPostIndex($value) ) { $loop_state = false; } } $state = $loop_state; } return $state; } function getSession($index, $default_value = null) { if( isset($_SESSION[$index]) ) { if( !empty($_SESSION[$index]) ) { return $_SESSION[$index]; } } return $default_value; } /** * * Traitement * */ $data = $_GET; // Récupération des donénes en session // Civilité : $titre = getSession("titre", ""); $prenom = getSession("prenom", ""); $nom = getSession("nom", ""); $telephone = getSession("telephone", ""); // Récupération de l'email $adresseMail = getSession("email"); $prixTicket = getSession("prix-ticket"); $nombreTickets = getSession("nombre-tickets"); $tva = getSession("tva"); // Valeur par défaut si cette variable n'existe pas en session => false $recevoirFacture = getSession("recevoir-facture", false); // Test à supprimer ! //$recevoirFacture = true; // Variables utiles pour le template $etat_mail = false; $etat = 'erreur'; $tickets = array(); // Vérification des données d'E-Transaction $PBX_RETOUR = "montant=M&maref=R&auto=A&trans=T&paiement=P&carte=C&idtrans=S&erreur=E&validite=D&BIN6=N&digest=H&date=W&heure=Q&sign=K"; // 15 éléments en tout $array_to_find = array('=M', '=R', '=A', '=T', '=P', '=C', '=S', '=E', '=D', '=N', '=H', '=W', '=Q', '=K'); $array_to_replace = array( '='.(isset($data['montant'])? $data['montant']:''), '='.(isset($data['maref'])? $data['maref']:''), '='.(isset($data['auto'])? $data['auto']:''), '='.(isset($data['trans'])? $data['trans']:''), '='.(isset($data['paiement'])? $data['paiement']:''), '='.(isset($data['carte'])? $data['carte']:''), '='.(isset($data['idtrans'])? $data['idtrans']:''), '='.(isset($data['erreur'])? $data['erreur']:''), '='.(isset($data['validite'])? $data['validite']:''), '='.(isset($data['BIN6'])? $data['BIN6']:''), '='.(isset($data['digest'])? $data['digest']:''), '='.(isset($data['date'])? $data['date']:''), '='.(isset($data['heure'])? $data['heure']:''), '='.(isset($_GET['sign'])? $_GET['sign']:'') ); $PBX_RETOUR = explode('&sign=', str_replace($array_to_find, $array_to_replace, $PBX_RETOUR) ); // 1. Récupérer le contenu de la donnée du type K (ici, c'est 'sign') // 2. URL décodée cette signature, // 3. Décodée en base 64 le résultat de létape précédente, $sealed = base64_decode( str_replace(" ", "+", urldecode( // Valeur de 'sign' $PBX_RETOUR[1] )) ); // 4. Décrypter avec la clé publique d'e-transactions le résultat de létape précédente, $newsource = ""; $fp = fopen ("./bin/pubkey.pem","r"); $pub_key = fread($fp,8192); fclose($fp); openssl_get_publickey($pub_key); openssl_public_decrypt($sealed, $newsource, $pub_key); // 5. Calculer une empreinte SHA-1 avec les autres données de la variable "PBX_RETOUR", $empreinte = sha1($PBX_RETOUR[0],true); // 6. Lempreinte calculée dans létape précédente doit être égale au résultat de létape 4 // A cause d'un bug, je vérifie seulement que la valeur de l'empreinte se trouve bien dans la la valeur de la newsource (qui contient queleques caractères en plus) // Si >= 0, ALORS LES CLEFS CORRESPONDENT -> c'est bon ! if( strpos($newsource, $empreinte) >= 0 && $adresseMail != null && $prixTicket != null && $nombreTickets != null ) { if( in_array( $data['status'], array('erreur', 'succes', 'annule', 'refus') ) ) { $etat = $data['status']; // Si le paiement est effectué avec succès, faire appel au webservice adéquat. if( $etat == 'succes' ) { // CHARGEMENT DES CONFIGURATIONS $xml=simplexml_load_file("configuration.xml"); // URL DU WEBSERVICE $webservice_url = (string)$xml->webservice->url; // Email recevant les erreurs apparues lors de la procédure de paiement $erreurMail = (string)$xml->mail->erreur; // Email recevant en copie les récapitulatifs d'achat $copieMail = (string)$xml->mail->copie; // Email expédiant les messages $expediteurMail = (string)$xml->mail->expediteur; // Email recevant la demande de facture par courrier $factureMail = (string)$xml->mail->facture; // $replyMail = (string)$xml->mail->repondre; // Fermeture du fichier xml $xml = null; // Cette variable permet de savoir si le webservice n'est pas accessible ou si le nombre de tickets $erreur_interne = false; $detail_erreur = ""; $client = null; try { // génération des tickets, $client = new SoapClient($webservice_url); } catch (Exception $e) { // oups! le webservice est indisponible à l'adresse spécifiée $erreur_interne = true; } // Si le webservice est bien disponible : if( $erreur_interne == false ) { // Variables par défaut $etat_achat = false; $tickets = array(); for ($i=0; $i < $nombreTickets; $i++) { $reponse = $client->GenererTicket(array("nombre_tickets" => 1)); foreach ( $reponse->GenererTicketResult->ArrayOfString as $key => $ticket) { /** * Pour récupérer les valeurs d'un ticket : $ticket[ chiffre ] * 0 => ID du ticket * 1 => Num ticket * 2 => Date génération du ticket * 3 => Date péremption du ticket * 4 => Utilisé ? * 5 => Date utilisation * 6 => notes * 7 => int_appel * 8 => int_client */ $tickets[$i] = $ticket; // Formatage de la date $date_peremption = DateTime::createFromFormat('d/m/Y H:i:s', $tickets[$i][3]); $tickets[$i][3] = $date_peremption->format('d/m/Y'); } } // Vérification, y-a-t-il le bon compte de tickets ? if( count($tickets) > 0 ) { if( count($tickets) != $nombreTickets ) { $erreur_interne = true; $detail_erreur = "<p>Nombre de tickets générés invalide( ".$nombreTickets." achetés, ".count($tickets)." générés). Voici la liste de tickets générés :</p>"; $detail_erreur .= "<ul>"; foreach ($tickets as $key => $t) { $contenu_mail .= "<li> Ticket n°".$t[1]." (id du ticket: ".$t[0].", généré le ".$t[2]." )</li>"; } $detail_erreur .= "</ul>"; } // SI OUI : // Envoi d'un mail récapitulant les tickets achetés $contenu_mail = "<ul style=\"list-style-type: none;\">"; foreach ($tickets as $key => $t) { $contenu_mail .= "<li> Ticket n°".$t[1]."</li>"; } $contenu_mail .= "</ul><p>Limite de validité : Vos tickets sont à utiliser impérativement avant le ".$tickets[0][3]."</p>"; // Info : // L'adresse mail est récupérée au début de ce fichier .php $headers = 'MIME-Version: 1.0' . "\n"; // Version MIME $headers .= 'Content-type: text/html; charset="UTF-8"'."\n"; // l'en-tete Content-type pour le format HTML $headers .= 'From: "monentreprise"<'.$expediteurMail.'>'."\n"; // Expediteur $headers .= 'Reply-To: '.$replyMail."\n"; // reply to $headers .= 'To: '.$adresseMail."\n"; // Destinataire $headers .= 'Bcc: '.$copieMail."\n"; // Destinataire en copie // Contenu du message $message ="<body style='font-size:10.0pt;font-family:\"Arial\",\"sans-serif\"'> <p>Bonjour,</p> <p>Merci davoir choisi monentreprise pour la résolution de vos problèmes informatiques !</p> <p> Nous vous confirmons votre achat de tickets d'assistance sur notre site <a href=\"http://www.monsite.fr\">www.monsite.fr</a>. Vous trouverez ci-dessous le récapitulatif de votre achat pour un montant de ".($data['montant'] / 100)." TTC : </p>".$contenu_mail." <p> Pour utiliser ces tickets, il vous suffit de nous contacter au 01.01.01.01.01 ou par mail : <a href=\"mailto: support@monentreprise.fr\">support@monentreprise.fr</a>. </p> <p> Horaires douverture de votre hotline dédiée :<br /> Du Lundi au Vendredi, de 8h00 à 12h30 et de 14h00 à 18h00 (17h00 le Vendredi). </p> <p>Si vous avez demandé une facture, celle-ci sera envoyée sous 72h par email.</p> <p>monentreprise<br /> test<br /> <a href='http://www.monsite.fr/' alt='site monentreprise'>www.monsite.fr</a></p> <img src='http://www.monsite.fr/images/logo-monentreprise.png' alt='logo'/> </body>"; $etat_mail = mail($adresseMail, "monentreprise - confirmation d'achat", $message, $headers); } } else { $detail_erreur = "<p>WebService indisponible. veuillez vérifier que l'url ".$webservice_url." est bien disponible.<br/>"; $detail_erreur .= "Attention! Les tickets du client n'ont pas été générés (".$nombreTickets." achetés)</p>"; } // Si une erreur est survenue lors de la génération des tickets, envoi d'un mail à l'adresse grandchef@monentreprise.fr if( $erreur_interne == true ) { $etat = 'erreur_interne'; // L'adresse mail est récupérée au début de ce fichier .php $headers = 'MIME-Version: 1.0' . "\n"; // Version MIME $headers .= 'Content-type: text/html; charset="UTF-8"'."\n"; // l'en-tete Content-type pour le format HTML $headers .= 'From: "monentreprise"<'.$expediteurMail.'>'."\n"; // Expediteur $headers .= 'Reply-To: '.$replyMail."\n"; // reply to $headers .= 'To: '.$erreurMail."\n"; // Destinataire //Reply-To: // Contenu du message $message ="<body style='font-size:10.0pt;font-family:\"Arial\",\"sans-serif\"'> <p>Bonjour,</p> <p> Une erreur est survenue lors de la génération des tickets d'assitances d'un client (adresse mail: ".$adresseMail."). Détail de l'erreur : </p> ".$detail_erreur." <br /> <p> Le site </p> </body>"; $etat_mail = mail($erreur_mail, "Confirmation d'inscription", $message, $headers); } if( $recevoirFacture === true ) { // Récupération des informations sur le client depuis la session : $societe = getSession("societe"); $rue1 = getSession("rue-1"); $rue2 = getSession("rue-2"); $rue3 = getSession("rue-3"); $codePostal = getSession("code-postal"); $ville = getSession("ville"); $pays = getSession("pays"); $siret = getSession("siret", "non renseigné"); $numTva = getSession("num-tva", "non renseigné"); // Info : // L'adresse mail est récupérée au début de ce fichier .php $headers = 'MIME-Version: 1.0' . "\n"; // Version MIME $headers .= 'Content-type: text/html; charset="UTF-8"'."\n"; // l'en-tete Content-type pour le format HTML $headers .= 'From: "monentreprise"<'.$expediteurMail.'>'."\n"; // Expediteur $headers .= 'Reply-To: '.$replyMail."\n"; // reply to $headers .= 'To: '.$factureMail."\n"; // Destinataire // Contenu du message $message ="<body style='font-size:10.0pt;font-family:\"Arial\",\"sans-serif\"'> <p>Bonjour, </p> ". "<p> ".$titre." ".ucfirst($prenom)." ".ucfirst($nom)." souhaite recevoir une facture concernant son achat de tickets d'assistance. </p> <p> <b><u>Information sur le client :</u></b> </p> <dl> <dt>Téléphone</dt> <dd>".$telephone."</dd> <dt>Société</dt> <dd>".$societe."</dd> <dd>Num. SIRET : ".$siret."<br />Num. TVA : ".$numTva."</dd> <dt>Adresse</dt> <dd>".$rue1."<br/>".$rue2."<br/>".$rue3."</dd> <dd>".$codePostal." ".ucfirst($ville).", ".ucfirst($pays)."</dd> <dt> Adresse mail </dt> <dd>".$adresseMail."</dd> </dl> <br /> <p> <b><u>Informations sur la commande :</u></b> </p> <dl> <dt>Montant</dt> <dd> ".($data['montant'] / 100)." TTC</dd> <dt>Numéro de transaction Crédit Agricole: </dt> <dd>".$data['idtrans']."</dd> <dt>Identifiant de la commande </dt> <dd>".$data['maref']."</dd> </dl> <p>monentreprise<br /> adresse<br /> <a href='http://www.monsite.fr/' alt='site monentreprise'>www.monsite.fr</a></p> <img src='http://www.monsite.fr/images/logo-monentreprise.png' alt='logo'/> </body>"; $etat_mail = mail($factureMail, "monentreprise - Demande de facture", $message, $headers); } // NETTOYAGE DE LA SESSION session_unset(); session_destroy(); } } else { $etat = 'erreur'; } } else { header("location: /index.php?erreur=4"); exit(); } // Titre à envoyer dans le template $titre = "Confirmation de paiement"; // Chargement du haut de page require("./template/header.php"); // appel du template require("./template/page_paiement_fini.php"); // Chargement du haut de page require("./template/footer.php"); ?>
Voici également le contenu du fichier page_paiement_fini.php :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 <div class="intromentions"> <?php /** * Variables utilisables : * - $tickets : un talbeau de tickets * chaque ticket contient : * 0 => ID du ticket * 1 => Num ticket * 2 => Date génération du ticket * 3 => Date péremption du ticket * 4 => Utilisé ? * 5 => Date utilisation * 6 => notes * 7 => int_appel * 8 => int_client * - $etat : peut contenir : 'erreur', 'succes', 'annule', 'refus' * Si $etat == 'succes', alors la variable $etat_mail peut contenir : true, false ( Mail envoyé, ou non envoyé) * * Plus de détail sur la syntaxe PHP : http://www.php.net/manual/fr/language.basic-syntax.phpmode.php * */ ?> <?php if($etat == 'erreur'): ?> <h1>Oups!</h1> <p> Une erreur est survenue lors du paiement. Veuillez recommencer le paiement une nouvelle fois. </p> <center><a href="../index.php">retour à la page d'achat</a><center> <?php elseif($etat == 'erreur_interne'): ?> <h1>Oups!</h1> <p> Votre paiement a bien été pris en compte, mais une erreur est survenue lors de la création de votre commande. Nos collaborateurs ont été prévenus, et travaille le plus vite possible sur la résolution de votre problème. Nous vous contacterons par mail dans les plus brefs délais afin de vous tenir informé sur la résolution de cet incident. <br /> Veuillez nous excuser pour ce désagrément. </p> <center><a href="../index.php">retour à la page d'achat</a><center> <?php elseif($etat == 'annule'): ?> <h1>Achat annulé</h1> <p> Vous avez annulé le paiement. </p> <center><a href="../index.php">retour à la page d'achat</a><center> <?php elseif($etat == 'refus'): ?> <h1>Paiement refusé</h1> <p> Votre achat a été refusé par le service de paiement. Si c'est une erreur, veuillez recommencer le paiement une nouvelle fois. </p> <center><a href="../index.php">retour à la page d'achat</a><center> <?php elseif($etat == 'succes'): ?> <h1>Paiement effectué !</h1> <p> Nous confirmons votre achat de <?php echo(count($tickets)); ?> tickets. <br /> Voici les numéros de tickets qui sont mis à votre disposition : <?php if( $etat_mail == false ): ?>(Une erreur est survenue lors de l'envoie des tickets par mail, veuillez bien prendre note des informations ci-dessous !)<?php endif; ?> </p> <div class="ticketsleft"> <ul> <?php foreach($tickets as $t): ?> <?php /** * Pour récupérer les valeurs d'un ticket : $t[ chiffre ] * 0 => ID du ticket * 1 => Num ticket * 2 => Date génération du ticket * 3 => Date péremption du ticket * 4 => Utilisé ? * 5 => Date utilisation * 6 => notes * 7 => int_appel * 8 => int_client */ ?> <li> Ticket n°<?php echo($t[1]); ?></li> <?php endforeach; ?> <?php // Si dessous , on utilise [0][3] car tous les tickets ont la même date de péremption, donc afficher celle du premier ticket est valable ?> </ul> <br /> </div> <div class="information" style="font-weight:bold;">Attention ! Vos tickets sont à utiliser impérativement avant le : <?php echo( $tickets[0][3]); ?> </div> <p>Pour utiliser ces tickets, il vous suffit de nous contacter au 01 01 01 01 01 ou par mail : <a href="mailto:support@monentreprise.fr">support@monentreprise.fr</a>. <br /> Nous vous rappelons nos horaires d'ouverture : <br /> Du Lundi au Vendredi, de 8h00 à 12h30 et de 14h à 18h (17h le Vendredi). <br /> Si vous avez demandé une facture, celle-ci sera envoyée sous 72h par email.</p> <br/> <?php endif; ?>
Voici également le contenu du fichier header.php :
Code html : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 <!DOCTYPE html> <!--[if lte IE 9]><html class="ie ie9" lang="fr"><![endif]--> <html lang="fr"> <head> <title>monentreprise - <?php echo $titre; ?></title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="description" content="Vous avez besoin d\'une assistance informatique pour un problème ou une panne informatique ? Accès internet, virus, installation de logiciel ou encore souci d\'imprimante, nos techniciens vous dépannent à distance, par téléphone ou télémaintenance." /> <link rel="icon" href="images/favicon_monentreprise.ico" type="image/x-icon"> <link rel="stylesheet" type="text/css" href="CSS/style.css" media="screen"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" type="text/css" media="all" href="css/bootstrap-glyphicons.css"> <link rel="stylesheet" type="text/css" href="CSS/mobile.css" media="screen and (max-width: 320px)"> <link rel="stylesheet" type="text/css" href="CSS/mobile.css" media="screen and (max-width: 480px)"> <link rel="stylesheet" type="text/css" href="CSS/mobile.css" media="screen and (max-width: 600px) and (orientation: landscape)"> <link rel="stylesheet" type="text/css" href="CSS/mobile.css" media="screen and (max-width: 800px)"> <script> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-53033808-1', 'auto'); ga('send', 'pageview'); </script> <script type="text/javascript" src="js/modernizr-1.5.min.js"></script> <script language="javascript" type="text/javascript" src="js/jquery.js"></script> <script type="text/javascript" src="js/jquery.easing-sooper.js"></script> <script type="text/javascript" src="js/jquery.sooperfish.js"></script> <script type="text/javascript"> $(document).ready(function() { $('ul.sf-menu').sooperfish(); document.getElementById("container").style.height = document.getElementById("foot").offsetTop+120+"px"; }); function disablelink() { if (window.matchMedia("(min-width: 800px)").matches) { document.location.href="quelques-exemples.php" /* La largeur minimum de l'affichage est 600 px inclus */ } else { return false; } } </script> </head> <body> <div id="container"> <a id="hautpage"></a> <div id="head"> <a href="index.php"> <img class="logo" src="images/logo-monentreprise.png" alt="Dépannage informatique"/> </a> </div> <nav> <ul class="sf-menu" id="nav"> <li><a style="line-height:10pt;margin-top:8px;" href="depannage-informatique.php">Comment ça marche ?</a> </li> <li><a style="line-height:10pt;" href="pourquoi-nous-choisir.php">Pourquoi <br /> monentreprise ?</a> </li> <li style="cursor:pointer;" ><a style="line-height:10pt; margin-top:8px;" onclick="disablelink()" >Quelques Exemples</a> <ul> <li><a href="quelques-exemples.php?categorie=internet" >Internet</a></li> <li><a href="quelques-exemples.php?categorie=logiciels">Logiciels</a></li> <li><a href="quelques-exemples.php?categorie=protection">Protection</a></li> <li><a href="quelques-exemples.php?categorie=peripheriques">Périphériques</a></li> <li><a href="quelques-exemples.php?categorie=outils">Outils Système</a></li> <li><a href="quelques-exemples.php?categorie=office">Microsoft Office</a></li> </ul> </li> <li><a style="line-height:10pt; margin-top:8px;" href="avis-clients.php">Témoignages clients</a></li> <li ><a style="line-height:10pt; margin-top:8px;" href="contact.php">Nous contacter</a> </li> </ul> </nav>
Je suis désolé d'avoir mis le contenu des fichiers "en vrac", mais n'étant pas un expert de PHP je préfère tout montrer plutôt que de cacher la partie qui pourrait contenir l'erreur.
J'espère que vous pourrez m'aider, merci d'avance pour le temps que vous me consacrerez !
P.S :
- je n'ai pas écrit le code, je ne fais qu'essayer de le déboguer. (pardonnez donc à mon prédécesseur ses fautes d'orthographe, je les corrigerai dès que j'aurai réglé le problème de tickets ^^)
- les adresses électroniques et du site ne sont pas celles d'origine, mais elles sont bonnes, donc le problème ne peut venir de là (du moins pas de l'orthographe de celles-ci).
Partager