bank.php 10.2 KB
Newer Older
1
<?php
2
namespace Controller;
3

Okhin's avatar
Okhin committed
4
5
use LQDN\Command\UserUpdateCumulCommand;
use LQDN\Command\UserUpdateTotalCommand;
6
use LQDN\Command\DonationIncStatusCommand;
Okhin's avatar
Okhin committed
7

8
9
10
class Bank extends Controller
{
    /* We want to ignore the sanitizing on this page */
11
12
13
14
    public function sanitizeForms($f3)
    {
        return;
    }
15
16
17
18
19
20
21
    /*
    Page de retour de la banque
    */
    public function cb($f3, $args)
    {
        @include_once("config.php");

22
        $cb_log = new \Log('/cb.log');
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
        $error="";
        $result = $f3->get('POST.vads_result');
        $status = $f3->get('POST.vads_trans_status');
        $status_recurrence = $f3->get('POST.vads_recurrence_status');
        $status_identifier = $f3->get('POST.vads_identifier_status');
        $auth_result = $f3->get('POST.vads_auth_result');
        $extra_result = $f3->get('POST.vads_extra_result');
        $transaction_id = $f3->get('POST.vads_trans_id');
        $order_id = $f3->get('POST.vads_order_id');
        $version = $f3->get('POST.vads_version');
        $language = $f3->get('POST.vads_language');
        $currency = $f3->get('POST.vads_currency');
        $amount = $f3->get('POST.vads_amount');
        $sub_amount = $f3->get('POST.vads_sub_amount');
        $identifier = $f3->get('POST.vads_identifier');
        $certificate = $f3->get('POST.vads_payment_certificate');
        $warranty_result = $f3->get('POST.vads_warranty_result');
        $site_id = $f3->get('POST.vads_site_id');
        $contract_used = $f3->get('POST.vads_contract_used');
        $signature = $f3->get('POST.signature');

        $cb_log->write('result: '.$result);
        $cb_log->write('status: '.$status);
        $cb_log->write('status_recurrence: '.$status_recurrence);
        $cb_log->write('status_identifier: '.$status_identifier);
        $cb_log->write('extra_result: '.$extra_result);
        $cb_log->write('auth_result: '.$auth_result);
        $cb_log->write('signature: '.$signature);
        $cb_log->write('transaction_id: '.$transaction_id);
        $cb_log->write('order_id: '.$order_id);
        $cb_log->write('version: '.$version);
        $cb_log->write('language: '.$language);
        $cb_log->write('currency: '.$currency);
        $cb_log->write('amount: '.$amount);
        $cb_log->write('sub_amount: '.$sub_amount);
        $cb_log->write('identifier: '.$identifier);
        $cb_log->write('certificate: '.$certificate);
        $cb_log->write('warranty_result: '.$warranty_result);
        $cb_log->write('site_id: '.$site_id);
        $cb_log->write('contract_used: '.$contract_used);

        // Vérifications bancaires
        if ($site_id!=SITE_ID) {
            $error = "Bad site id: " . $site_id;
        }
        if ($version!="V2") {
            $error = "Bad return version: " . $version;
        }
        if ($status!='' && $contract_used!="5201306") {
            $error = "Bad contract used: " . $contract_used;
        }
        $vads_params = array();
        foreach ($_POST as $key => $value) {
            if (substr($key, 0, 4)=="vads") {
                $vads_params[$key] = $value;
            }
        }
        if (count($vads_params)>0) {
            ksort($vads_params);
        }
        $sig = "";
        foreach ($vads_params as $key => $value) {
            $sig .= $value . "+";
        }
        $sig .= CERTIFICATE;
Guinness's avatar
Guinness committed
88
89
90
        ### Attempt to do it in hmac-sha256
        $sig_hash = base64_encode(hash_hmac('sha256', $sig, CERTIFICATE, true));
        $cb_log->write("sig: " . $signature . " == " . $sig_hash);
91
92
        $cb_log->write("debug level: ". DEBUG);
        if ($sig_hash!=$signature and DEBUG == 0) {
Guinness's avatar
Guinness committed
93
            $error = "Error in signature: " . $signature . " != " . $sig_hash;
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
        }
        // Résultats des vérifications globales
        if ($error!="") {
            $cb_log->write($error);
            echo $error;
            exit(0);
        }

        /*
        Result: obligatoire pour savoir si tout est ok
        Status: optionnel
        Signature: obligatoire pour vérifier qu'il s'agit bien d'un POST de la part de la banque
        Transaction_id: obligatoire, correspond à l'id dans la base de données en interne
        Order_id: idem que Transaction_id sans les '0' devant
        Version: 'V2' obligatoirement
        Language: obligatoire pour faire le bon retour, sinon en EN
        Certificate: Très important en cas de souci, c'est l'identifiant côté banque
         */

        $db = $f3->get('DB');
        $id = intval($order_id);
        $cb_log->write("Id: ".$order_id);
116
        $don = $f3->get('container')['donation_finder']->findById($id);
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

        if (!$don) {
            $cb_log->write("Transaction id not found: ".$order_id);
            exit(0);
        }

        if ($don['status']!='0' && $don['status']!=100) {
            $cb_log->write("Maybe second call, actual status: ".$don['status']);
            exit(0);
        }

        if ($result!="00") {
            $cb_log->write("Payment failed for id: ".$order_id." with result: ".$result);
            $cb_log->write("Extra result: ".$extra_result);
            $cb_log->write("Auth result: ".$auth_result);
            exit(0);
        }

        // Set the lang environnement :
        $cb_log->write("System language : ".$f3->get('lang'));
        $lang = $don["lang"];
        $cb_log->write("User language : ".$lang);

        /* Language ok, set the locale environment */
        putenv("LC_MESSAGES=".$lang);
        putenv("LANG=".$lang);
        putenv("LANGUAGE=".$lang);
        // this locale MUST be selected in "dpkg-reconfigure locales"
        setlocale(LC_ALL, $lang);
        textdomain("messages");

        $charset="UTF-8";
        bind_textdomain_codeset("messages", "$charset");

        // ok, somme OK, status = completed, transaction found.
152
153
154
        $f3->get('container')['command_handler']->handle(new DonationIncStatusCommand($don['id']));
        $don = $f3->get('container')['donation_finder']->findById($don['id']);
        $status = $don['status'];
155

Okhin's avatar
Okhin committed
156
        $user = $f3->get('container')['user_finder']->findById($don['user_id']);
157
158
159
160
        $cb_log->write("Utilisation d'un utilisateur existant");
        // Ajout du nouveau don au cumul actuel
        if ($status!=101) {
            $cb_log->write("Ajout de ".$don['somme']);
161
162
            $f3->get('container')['command_handler']->handle(new UserUpdateTotalCommand($user['id'], (int) $user['total'] + $don['somme']));
            $f3->get('container')['command_handler']->handle(new UserUpdateCumulCommand($user['id'], (int) $user['cumul'] + $don['cumul']));
163
164
        }
        $result = $db->query("SELECT cumul FROM users WHERE id='".$don['user_id']."'");
165
        $cumul = $result->fetch(\PDO::FETCH_ASSOC);
166
167
168
169
170
171
172
173
174
175
        $cumul = $cumul['cumul'];
        $cb_log->write("Nouveau cumul: ".$cumul);
        $user_id = $user['id'];
        // Ajout de son identifier dans la table prévue à cet effet si nécessaire
        if ($identifier!='') {
            $db->query("INSERT INTO identifiers (user_id, identifier) VALUES ('".$user_id."','".$identifier."');");
        }

        // Puis envoi du mail
        if ($user["email"]) {
Guinness's avatar
Guinness committed
176
            $mailer = new \SMTP(SMTP_HOST, SMTP_PORT, SMTP_SECURITY, SMTP_USER, SMTP_PW);
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
            $cb_log->write("Sending email for id: ".$id." at ".$user['email']);
            $mailer->set('From', "contact@laquadrature.net");
            $mailer->set('FromName', "La Quadrature du Net");
            $mailer->set('To', $user["email"]);
            $mailer->set('Subject', _("Merci de soutenir La Quadrature du Net !"));

            $mailer->set('CharSet', "UTF-8");
            // Préparation du texte du mail par morceaux
            $text = _("
Cher·e %%NAME%%,

Toute l'équipe de La Quadrature vous remercie du fond du cœur pour votre soutien à ses actions !

Connectez-vous à votre page d'administration pour choisir vos contreparties, et nous indiquer vos coordonnées :
%%URL_ADMIN%%
Identifiant : votre adresse email

Grâce à vous et aux nombreux bénévoles qui agissent aux côtés de l'association au quotidien, La Quadrature continuera à analyser, prendre position, débattre, alerter, mobiliser, pour qu'Internet reste un espace de liberté et de partage accessible à tous. Quelle que soit sa forme, la participation de tous est indispensable si nous voulons confirmer et multiplier nos victoires citoyennes. Chacun d'entre nous peut agir au quotidien en s'informant et en diffusant les informations auprès de sa famille, de ses collègues de ses amis, sur les réseaux dits « sociaux » … Il n'y a que de cette manière que nous arriverons à agir ensemble et à nous organiser pour protéger nos droits fondamentaux, partager la culture, nous réapproprier nos données…

En vous connectant à votre page d'administration, vous pourrez télécharger les mille décimales de π que nous vous adressons symboliquement pour votre soutien, et sélectionner les autres contreparties que vous souhaitez recevoir (en fonction de vos différents dons cumulés). Si besoin, vous y trouverez également un reçu pour votre don.

Pour rester informé des actions de La Quadrature du Net et des questions des libertés individuelles sur internet, n'hésitez pas à vous abonner à sa newsletter : https://laquadrature.net/cgi-bin/mailman/listinfo/actu

Encore merci pour votre soutien,
Toute l'équipe de La Quadrature du Net
")."\n\n";

204
            // Création de l'url d'administration
Okhin's avatar
Okhin committed
205
            $admin_url = "https://don.laquadrature.net/perso";
206
207
208
209
210
211
            foreach ($f3->get('languages') as $key => $language) {
                if ($lang==$language[1]) {
                    $admin_url = "https://".$language[0].$f3->get('dev').".laquadrature.net/perso";
                }
            }

212
213
214
215
216
217
218
            // Remplacement des variables par leurs valeurs
            $fields = array(
                "NAME"=>$user["pseudo"],
                "SOMME"=>$don['somme'],
                "CUMUL"=>$cumul,
                "URL_ADMIN" => $admin_url
            );
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
            foreach ($fields as $k=>$v) {
                $text = str_replace("%%".$k."%%", $v, $text);
            }

            $sent = $mailer->send($text);
            if ($sent) {
                $cb_log->write("Send Mail OK");
            } else {
                $cb_log->write("Send Mail ERROR:" . $sent->log());
            }
        } else {
            $cb_log->write("Pas d'adresse mail");
        }

        echo "TOUT OK";
    }
};