perso.php 23.2 KB
Newer Older
1
<?php
2
namespace Controller;
3
4
5
6

use LQDN\Command\AddressCreateCommand;
use LQDN\Command\AddressDeleteCommand;
use LQDN\Command\AddressUpdateCommand;
Okhin's avatar
Okhin committed
7
8
9
10
11
use LQDN\Command\CounterpartCreateCommand;
use LQDN\Command\CounterpartDeleteCommand;
use LQDN\Command\UserUpdateCumulCommand;
use LQDN\Command\UserUpdateTotalCommand;
use LQDN\Command\UserCreateCommand;
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

class Perso extends Controller
{
    /*
    Page principale de l'administration personnelle
     */
    public function beforeRoute($f3, $args)
    {
        parent::beforeRoute($f3, $args);
        $f3->clear('SESSION.form_visible');
    }

    public function show($f3, $args)
    {
        if (!$f3->exists('SESSION.user')) {
            $f3->reroute('/login');
        }
        $this->get_infos($f3, $args);
        $this->get_contreparties($f3);
        $this->get_dons($f3);
        $this->get_recurrents($f3);
Okhin's avatar
Okhin committed
33
        if ($f3->exists('GET.validate')) {
34
35
36
37
38
            $f3->set('modal_counterparts', '1');
            $f3->clear('GET.validate');
        } else {
            $f3->set('modal_counterparts', '0');
        };
39
40
41
42
43
44
45
        $f3->set('block_content', 'user/perso.html');
    }

    public function get_infos($f3, $args)
    {
        // Chargement des informations de l'utilisateur
        $db = $f3->get('DB');
Okhin's avatar
Okhin committed
46
47
48
        $user = $f3->get('container')['user_finder']->findById($f3->get('SESSION.id'));
        $f3->set('infos', $user);
        $result = $db->query("SELECT id, pdf, decimale FROM dons WHERE user_id='".$user['id']."' and pdf!='' ");
49
        $pdfs = array();
50
        foreach ($result->fetchAll(\PDO::FETCH_ASSOC) as $row) {
51
52
            $pdfs[$row['pdf']] = $row;
        }
Okhin's avatar
Okhin committed
53
        $addresse = $f3->get('container')['address_finder']->findByUserId((int) $user['id']);
Okhin's avatar
Okhin committed
54
        $f3->set('adresse', $addresse);
55
56
57
58
59
60
        $f3->set('pdfs', $pdfs);
    }

    public function get_contreparties($f3)
    {
        // Chargement des contreparties de l'utilisateur
Okhin's avatar
Okhin committed
61
62
        $contreparties = $f3->get('container')['counterpart_finder']->findByUserId((int) $f3->get('SESSION.id'));
        $f3->set('contreparties', $contreparties);
63
64
65
66
67
68
    }

    public function get_dons($f3)
    {
        // Chargement des dons de l'utilisateur
        $db = $f3->get('DB');
Okhin's avatar
Okhin committed
69
70
71
72
73
        $dons = $f3->get('container')['donation_finder']->findByUserId((int) $f3->get('SESSION.id'));
        $dons = array_filter($dons, function ($id) {
            return in_array((int) $id, [1, 4, 102]);
        });
        $f3->set('dons', $dons);
74
75
76
77
78
79
80
81
    }

    public function get_recurrents($f3)
    {
        // Chargement des abonnements de l'utilisateur
        $db = $f3->get('DB');
        $result = $db->query("SELECT datec, somme, status, id, pdf, identifier FROM dons WHERE user_id='".$f3->get('infos.id')."' AND status IN (101) ORDER BY datec ASC");
        $data = array();
82
        foreach ($result->fetchAll(\PDO::FETCH_ASSOC) as $row) {
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
            $data[] = $row;
        }
        $f3->set('dons_recurrents', $data);
    }

    public function login($f3, $args)
    {
        $f3->set('form_visible', 'login');

        if ($f3->get('action')=='renew_password') {
            // Renouvellement de mot de passe
            $f3->clear('form_visible');
            $this->renew_password($f3);
            $f3->reroute('/');
        } elseif ($f3->get('action')=='create_account') {
            // Création d'un compte utilisateur
            $f3->clear('form_visible');
            $this->create_user($f3);
        } elseif ($f3->get('email')) {
            // Tentative de connexion
            // We should use auth module from Fat Free
            $db = $f3->get('DB');
105
            $mapper = new \DB\SQL\Mapper($f3->get('DB'), 'users');
106
            $auth = new \Auth($mapper, array('id' => 'email', 'pw' => 'hash'));
107
            $email = \Utils::asl($f3->get('email'));
108
109
110
111
112
113
114
            $hash = hash('sha256', $f3->get('password'));
            $login = $auth->login($email, $hash);

            // As we're login with email, not for id, we need to get it
            if ($login) {
                // We want to retrieve the associated user
                $result = $db->query("SELECT id, email FROM users WHERE email='".$email."'");
115
116
                $id = $result->fetch(\PDO::FETCH_ASSOC)['id'];
                $email = $result->fetch(\PDO::FETCH_ASSOC)['email'];
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
                $f3->set('SESSION.id', $id);
                $f3->set('SESSION.email', $email);
                $f3->set('SESSION.user', true);
                $f3->clear('form_visible');
                $f3->set('block_content', 'user/perso.html');
            } else {
                $f3->set('SESSION.error', _("Mauvais identifiant ou mot de passe."));
                Campaign::show($f3, $args);
                return;
            }
        } else {
            $f3->set('SESSION.error', _("Merci de renseigner une adresse mail."));
            Campaign::show($f3, $args);
            return;
        }
        Campaign::show($f3, $args);
    }

    public function logout($f3, $args)
    {
        $f3->clear('SESSION');
        $f3->reroute('/');
    }

    public function renew_password($f3)
    {
        if ($f3->get('email')!='') {
            // On vérifie que l'adresse mail existe
            $db = $f3->get('DB');
146
147
            $result = $db->query("SELECT email FROM users WHERE email='".\Utils::asl($f3->get('email'))."';");
            $row = $result->fetch(\PDO::FETCH_ASSOC);
148
149
            if ($row['email']!='') {
                // On régénère un mot de passe
150
                $pass = \Utils::generate_password();
151
152
153
                // On ne conserve que le mot de passe haché
                $hash = hash('sha256', $pass);
                // On le sauve en base de données
154
                $query = "UPDATE users SET hash='".$hash."' WHERE email='".\Utils::asl($f3->get('email'))."';";
155
156
157
158
                $db->query($query);

                // On le renvoie par email
                // On utilise le système SMTP de fat free
Guinness's avatar
Guinness committed
159
                $mailer = new \SMTP(SMTP_HOST, SMTP_PORT, SMTP_SECURITY, SMTP_USER, SMTP_PW);
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
                $mailer->set('From', $f3->get('mail.from'));
                $mailer->set('To', $f3->get('email'));
                $mailer->set('Subject', _("Renouvellement de mot de passe"));

                $mailer->set('FromName', $f3->get('mail.fromName'));
                $mailer->set('CharSet', "UTF-8");

                // Préparation du texte du mail par morceaux
                $text = _("Bonjour,

                    Un nouveau mot de passe vient de vous être attribuer pour pouvoir vous connecter à votre page d'administration pour choisir vos contreparties, et nous indiquer vos coordonnées :
                    %%URL_ADMIN%%
                    Identifiant : votre adresse email
                    Mot de passe : %%PASSWORD%%

                    Encore merci pour votre soutien,
                    Toute l'équipe de La Quadrature du Net
                    ")."\n\n";
                // Création de l'url d'administration
                $admin_url = "https://support.laquadrature.net/perso";
                foreach ($f3->get('languages') as $key => $language) {
                    if ($f3->get('lang')==$language[1]) {
                        $admin_url = "https://".$language[0].$f3->get('dev').".laquadrature.net/perso";
                    }
                }
                // Remplacement des variables par leurs valeurs
                $fields = array(
                    "PASSWORD" => $pass,
                    "URL_ADMIN" => $admin_url
                );
                foreach ($fields as $k=>$v) {
                    $text = str_replace("%%".$k."%%", $v, $text);
                }
                if ($mailer->send($text)) {
                    $f3->set('SESSION.message', _("Nouveau mot de passe envoyé par mail."));
                } else {
196
                    $logger = new \Log('mail.log');
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
                    $f3->set('SESSION.error', _('Oops'));
                    $logger->write($mailer->log());
                }
            } else {
                $f3->set('SESSION.error', _("Vous n'avez pas encore de compte, merci de faire un don pour cela."));
            }
        } else {
            $f3->set('SESSION.error', _("Merci de renseigner une adresse mail."));
        }
    }

    public function create_user($f3)
    {
        if ($f3->get('email')!='') {
            // On vérifie que l'adresse mail n'existe pas
            $db = $f3->get('DB');
Okhin's avatar
Okhin committed
213
            $user = $f3->get('container')['user_finder']->findByEmail($f3->get('email'));
214
            $total = 0;
215
            $cumul = 0;
216
217

            if ($user['email']!=$f3->get('email')) {
218
219
220
221
                $hash = hash('sha256', $f3->get('password'));
                // On recherche le montant cumulé jusqu'à présent. On fait la somme depuis le
                // premier janvier 2013 en se basant sur l'adresse mail
                $res = $db->query("SELECT sum(dons.somme) as somme FROM dons INNER JOIN users WHERE dons.user_id = users.id AND users.email='".$f3->get('email')."' and dons.status in (1, 4, 102) and dons.datec>'2013-01-01';");
222
                $total = $res->fetch(\PDO::FETCH_ASSOC);
223
                $total = (int) $total['somme'];
224
                // Création de l'utilisateur
225
226
227
228
                $f3->clear('SESSION.error');
                $f3->set('SESSION.msg', _("Votre compte a bien été créé, merci."));
                $f3->get('container')['command_handler']->handle(new UserCreateCommand($f3->get('email'), $hash, '', $total, $total));
                $f3->reroute('/perso');
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
            } else {
                $f3->set('SESSION.error', _("Vous avez déjà un compte associé à cette adresse mail, merci de demander un nouveau mot de passe."));
            }
        } else {
            $f3->set('SESSION.error', _("Merci de renseigner une adresse mail."));
        }
    }

    public function infos($f3, $args)
    {
        $db = $f3->get('DB');

        if ($f3->exists('SESSION.id')) {
            // Let's firts check that both the password match
            if ($f3->get('password') != $f3->get('password_confirmation')) {
244
                $f3->set('SESSION.error', _("Les mots de passe ne correspondent pas"));
245
            } else {
246
247
                $sql = "UPDATE users SET email='".\Utils::asl($f3->get('email'))."',
                    pseudo='".\Utils::asl($f3->get('pseudo'))."'";
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
                if ($f3->get('password') != '') {
                    $hash = hash('sha256', $f3->get('password'));
                    $sql .= ", hash='".$hash."'";
                }
                $sql .= " WHERE id='".$f3->get('SESSION.id')."'";
                $db->query($sql);
            }
        } else {
            $f3->error(401);
        }
        $f3->set('SESSION.msg', _('Informations personnelles modifiées.'));
        $this->show($f3, $args);
    }

    public function adresses($f3, $args)
    {
        if (!$f3->exists('SESSION.id')) {
            $f3->error('401');
        }

        switch ($f3->get('action')) {
        case 'ADD':
            try {
                $f3->get('container')['command_handler']->handle(
                    new AddressCreateCommand(
273
274
275
276
277
278
279
                        \Utils::asl($f3->get('SESSION.id')),
                        \Utils::asl($f3->get('nom')),
                        \Utils::asl($f3->get('adresse')),
                        \Utils::asl($f3->get('adresse2')),
                        \Utils::asl($f3->get('codepostal')),
                        \Utils::asl($f3->get('ville')),
                        \Utils::asl($f3->get('pays')),
Okhin's avatar
Okhin committed
280
                        \Utils::asl($f3->get('state'))
281
282
283
284
285
286
                    )
                );
            } catch (AddressAlreadyExistsException $e) {
                $f3->set("error", _("Cette adresse existe déjà."));
                $f3->error('403');
            }
287
            $f3->set('SESSION.message', _("Adresse ajoutée à votre profil"));
288
289
290
291
292
            break;
        case 'DELETE':
            try {
                $f3->get('container')['command_handler']->handle(
                    new AddressDeleteCommand(
293
294
                        \Utils::asl($f3->get('id')),
                        \Utils::asl($f3->get('SESSION.id'))
295
296
297
                    )
                );
            } catch (AddressUsedException $e) {
Okhin's avatar
Okhin committed
298
                $f3->set("error", _("Cette adresse est utilisée pour une de vos contreparties"));
299
300
                $f3->error('403');
            };
301
            $f3->set('SESSION.message', _("Adresse supprimée de votre profil"));
302
303
304
305
306
307
308
309
310
311
            break;
        }
        $f3->reroute('/perso');
    }

    public function add_contrepartie($f3, $args)
    {
        if (!$f3->exists('SESSION.user')) {
            $f3->error('401');
        }
Okhin's avatar
Okhin committed
312
313

        $user = $f3->get('container')['user_finder']->findById($f3->get('SESSION.id'));
314
315
316
317

        // Récupération des valeurs du formulaire
        $adresse_id = $f3->get('adresse_id');
        $quoi = $f3->get('quoi');
318
        $commentaire = $f3->get('commentaire');
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
        $valeur = 0;
        $piplome_id = intval(substr($f3->get('piplome_id'), 0, strpos($f3->get('piplome_id'), '_')));
        $taille = intval($f3->get('taille'));
        $taille_h = intval($f3->get('taille_h'));
        switch ($quoi) {
        case 'piplome':
            $valeur = 30;
            break;
        case 'pibag':
            $valeur = 50;
            break;
        case 'pishirt':
            $valeur = 100;
            break;
        case 'hoopie':
            $valeur = 250;
            break;
        }

        // Ajout d'une demande de contrepartie pour chaque contrepartie
Okhin's avatar
Okhin committed
339
        if ((int) $user['cumul'] >= $valeur) {
340
341
            switch ($quoi) {
            case 'piplome':
Okhin's avatar
Okhin committed
342
                $f3->get('container')['command_handler']->handle(new CounterpartCreateCommand(\Utils::asl($adresse_id), $f3->get('SESSION.id'), 'piplome', \Utils::asl($piplome_id), 1, date("Y-m-d H:i:s"), \Utils::asl($commentaire)));
343
344
                break;
            case 'pibag':
Okhin's avatar
Okhin committed
345
                $f3->get('container')['command_handler']->handle(new CounterpartCreateCommand(\Utils::asl($adresse_id), $f3->get('SESSION.id'), 'pibag', '', 1, date("Y-m-d H:i:s"), \Utils::asl($commentaire)));
346
347
                break;
            case 'pishirt':
Okhin's avatar
Okhin committed
348
                $f3->get('container')['command_handler']->handle(new CounterpartCreateCommand(\Utils::asl($adresse_id), $f3->get('SESSION.id'), 'pishirt', \Utils::asl($taille), 1, date("Y-m-d H:i:s"), \Utils::asl($commentaire)));
349
350
                break;
            case 'hoopie':
Okhin's avatar
Okhin committed
351
352
                $f3->get('container')['command_handler']->handle(new CounterpartCreateCommand(\Utils::asl($adresse_id), $f3->get('SESSION.id'), 'hoopie', \Utils::asl($taille_h), 1, date("Y-m-d H:i:s"), \Utils::asl($commentaire)));
                break;
353
            }
Okhin's avatar
Okhin committed
354
355
356
357
358
359
            // Puis diminution du cumul de la valeur des contreparties
            $f3->get('container')['command_handler']->handle(new UserUpdateCumulCommand($user['id'], $user['cumul'] - $valeur));
            $f3->set('SESSION.message', _("Merci, vos contreparties seront envoyées dès que possible !".$valeur));
        } else {
            $f3->set('SESSION.error', _("Désolé, mais vous n'avez pas cumulé suffisament de dons pour avoir un ").$quoi);
            $f3->clear('SESSION.message');
360
        }
361
        $f3->reroute('/perso');
362
363
364
365
366
367
368
369
    }

    public function receipt($f3, $params)
    {
        if (!$f3->exists('SESSION.user')) {
            $f3->reroute('/login');
        }
        // Variables utiles
370
        $logger = new \Log('receipt.log');
371
372
373
        $db = $f3->get('DB');
        $id = $params['id'];
        $command = "pdftk ";
374
        $args = " ../www/receipt.pdf fill_form ../tmp/".$id.".xfdf output ../tmp/".$id.".pdf flatten dont_ask";
375
376
377
        $logger->write($command . " " .$args);

        // Vérification que le don appartient bien à l'utilisateur connecté
Okhin's avatar
Okhin committed
378
379
380
381
382
383
384
385
386
387
388
        $query="SELECT dons.datec,
            dons.somme,
            adresses.nom as pseudo,
            adresses.adresse,
            adresses.adresse2,
            adresses.codepostal,
            adresses.ville,
            adresses.pays
            FROM dons
            INNER JOIN users ON users.id = dons.user_id
            LEFT OUTER JOIN adresses ON adresses.user_id = users.id
Okhin's avatar
Okhin committed
389
            WHERE users.id=".$f3->get('SESSION.id')." AND dons.id=".\Utils::asl($id).";";
390
391
        $result = $db->query($query);
        $logger->write($query);
392
        $don = $result->fetch(\PDO::FETCH_ASSOC);
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
        if (!$don) {
            $f3->reroute("/perso");
        }

        // Création du fichier datas
        $name = $don['pseudo'];
        $address = $name;
        if ($don['adresse']!='') {
            $address .= "\n" . $don['adresse'];
            $address .= "\n" . $don['adresse2'];
            $address .= "\n" . $don['codepostal'] . " " . $don['ville'];
        }
        $amount = $don['somme'];
        $monthes = array(
            '01'=>_('Janvier'),
            '02'=>_('Février'),
            '03'=>_('Mars'),
            '04'=>_('Avril'),
            '05'=>_('Mai'),
            '06'=>_('Juin'),
            '07'=>_('Juillet'),
            '08'=>_('Août'),
            '09'=>_('Septembre'),
            '10'=>_('Octobre'),
            '11'=>_('Novembre'),
            '12'=>_('Décembre')
        );
        $date = substr($don['datec'], 8, 2)." ".$monthes[substr($don['datec'], 5, 2)]." ".substr($don['datec'], 0, 4);
        $content = '<?xml version="1.0" encoding="UTF-8"?>
Okhin's avatar
Okhin committed
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
            <xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
            <fields>
            <field name="address">
            <value>'.$address.'</value>
            </field>
            <field name="donor">
            <value>'.$name.'</value>
            </field>
            <field name="content">
            <value>Reçu le '.$date.' un don de '.$amount.' euros de la part de '.$name.'.</value>
            </field>
            <field name="date">
            <value>Fait à Paris le '.$date.'</value>
            </field>
            </fields>
            </xfdf>';
438
        $fp = fopen("../tmp/".$id.".xfdf", "w");
439
440
441
442
443
444
445
446
447
448
        if ($fp) {
            fputs($fp, $content);
            fclose($fp);
        }

        // Création du reçu
        $output = array();
        exec($command.$args, $output);

        // Suppression du fichier datas
449
        unlink("../tmp/".$id.".xfdf");
450
451

        // Renvoi du fichier pdf au client
452
        $fp = fopen("../tmp/".$id.".pdf", "rb");
453
        if ($fp) {
454
            $fsize = filesize("../tmp/".$id.".pdf");
455
456
457
458
459
460
461
462
463
464
465
466
467
            header("Content-Type: application/pdf");
            header("Content-Disposition: attachment; filename=\"".$id.".pdf\"");
            header("Content-Length: $fsize");
            while (!feof($fp)) {
                $buffer = fread($fp, 2048);
                echo $buffer;
            }
            fclose($fp);
        } else {
            $f3->reroute('/perso');
        }

        // Suppression du fichier reçu
468
        unlink("../tmp/".$id.".pdf");
469
470
471
472
473
474
475
        die();
    }

    public function cancel($f3, $params)
    {
        $db = $f3->get('DB');
        $result = $db->query("SELECT identifier, user_id from identifiers where identifier like '".$params['id']."'");
476
        $result = $result->fetch(\PDO::FETCH_ASSOC);
477
478
479
480
481
482
483
        if ($result) {
            $identifier = $result['identifier'];
            $user_id = $result['user_id'];
        } else {
            $f3->reroute('/perso');
        }
        // Commande customerCancel
484
        $date = new \DateTime('now', new \DateTimeZone("UTC"));
485
486
487
488
489
490
491
492
493
494
495
496
        $parameters = array(
            "shopId"    => SITE_ID,
            "cardIdent" => $identifier,
            "date"      => $date->format("Ymd"),
            "ctxMode"   => CTX_MODE,
        );
        // Calcul de la signature
        $signature = "";
        foreach ($params as $key=>$value) {
            $signature .= $value."+";
        }
        $signature .= CERTIFICATE;
Guinness's avatar
Guinness committed
497
498
        $signature = base64_encode(hash_hmac('sha256', $signature, CERTIFICATE, true));
        #$signature = sha1($signature);
499
        $parameters["wsSignature"] = $signature;
500
        $client = new \SoapClient("https://paiement.systempay.fr/vads-ws/ident-v2.1?wsdl");
501
502
503
        $result = $client->customerCancel($parameters);
        // Let's add a 103 don at 0€ to keep track of them
        $f3->query("INSERT INTO dons SET
Okhin's avatar
Okhin committed
504
505
506
507
508
509
            status = '103',
            datec = NOW(),
            somme = 0,
            user_id = '".$user_id."',
            identifier = '".$identifier."',
            cumul = 0;");
510
        $f3->set('SESSION.message', _("Don récurrent supprimé."));
511
512
513
514
515
516
517
518
519
520
521
522
        $f3->reroute('/perso');
    }

    public function renew($f3, $params)
    {
        // TODO: à écrire, finaliser, tester, mettre en prod :o)
/*
    // Variables utiles
    $id = $params['id'];

    // Cas S2 de mise à jour des infos de la CB
    $target = "https://paiement.systempay.fr/vads-payment/";
523
    $transaction_date = new \DateTime('now', new \DateTimeZone("UTC"));
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
    $params = array(
        // Champs obligatoires
        "vads_trans_date" => $transaction_date->format("YmdHis"),
        "vads_site_id" => SITE_ID,
        "vads_action_mode" => "INTERACTIVE",
        "vads_ctx_mode" => CTX_MODE,
        // Autres codes possibles (page 16)
        "vads_trans_id" => str_repeat("0",6-strlen($id)).$id,
        "vads_version" => "V2",
        // Champs facultatifs
        "vads_language" => $f3->get('lang'),
        "vads_order_id" => $id,
        "vads_url_cancel" => ROOTURL,
        "vads_url_check" => "",
        "vads_url_error" => ROOTURL,
        "vads_url_referral" => ROOTURL,
        "vads_url_refused" => ROOTURL,
        "vads_url_return" => ROOTURL,
        "vads_url_success" => ROOTURL,
        "vads_validation_mode" => "0",
        "vads_shop_name" => "La Quadrature du Net",
        "vads_shop_url" => ROOTURL
    );
    if ($f3->get('monthly')) {
        // En cas de paiement récurrent, on doit créer un compte carte si ce n'est pas déjà fait
        $result = mysql_fetch_array(mysql_query("SELECT identifier from users where email='".$email."'"));
        $identifier = "";
        if ($result) {
        $identifier = $result['identifier'];
        }
        if ($identifier=="") {
        // Si l'utilisateur n'existe pas déjà, on lui crée un identifiant
        $identifier = $id . "_" . substr($email,0,strpos($email,'@'));
        $params["vads_identifier"] = substr($identifier, 0, 50); // Pas plus de 50 caractères
        $params["vads_page_action"] = "REGISTER_SUBSCRIBE";
        $params["vads_cust_email"] = $email; // Email du porteur
        } else {
        // Sinon, on instaure juste une récurrence en utilisant l'identifiant déjà connu
        $params["vads_page_action"] = "SUBSCRIBE";
        $params["vads_identifier"] = $identifier;
        }
        $params["vads_sub_effect_date"] = date("Ymd"); // Date d'effet à ce jour
        $params["vads_sub_amount"] = $f3->get('sum')*100;
        $params["vads_sub_currency"] = "978";
        $params["vads_sub_desc"] = "RRULE:FREQ=MONTHLY;BYMONTHDAY=7"; // Tous les 7 du mois
    } else {
        // En cas de paiement ponctuel, le montant est donné différemment
        $params["vads_page_action"] = "PAYMENT";
        $params["vads_amount"] = $f3->get('sum')*100;
        $params["vads_currency"] = "978";
        $params["vads_payment_config"] = "SINGLE";
    }
    // Calcul de la signature
    ksort($params);
    $signature = "";
    foreach ($params as $key=>$value) {
        $signature .= $value."+";
    }
    $signature .= CERTIFICATE;
    $signature = sha1($signature);

    $f3->set('target', $target);
    $f3->set('params', $params);
    $f3->set('signature', $signature);
 */
    }
};