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

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

18
        $cb_log = new \Log('/cb.log');
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
        $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;
        $cb_log->write("sig: " . $signature . " == " . sha1($sig));
        if (sha1($sig)!=$signature) {
            $error = "Error in signature: " . $signature . " != " . sha1($sig);
        }
        // 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);
        $res = $db->query("SELECT * FROM dons WHERE id='".$id."';");
110
        $don = $res->fetch(\PDO::FETCH_ASSOC);
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

        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.
        $db->query("UPDATE dons SET status=status+1 WHERE id='".$id."';");
        $res = $db->query("SELECT status FROM dons WHERE id='".$id."';");
148
        $status = $res->fetch(\PDO::FETCH_ASSOC);
149
150
151
        $status = $status['status'];

        $res = $db->query("SELECT * FROM users WHERE id='".$don['user_id']."';");
152
        $user = $res->fetch(\PDO::FETCH_ASSOC);
153
154
155
156
157
158
159
        $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']);
            $db->query("UPDATE users set cumul = cumul + " . $don['somme'] . ", total = total + " . $don['somme'] . " WHERE id='".$don['user_id']."'");
        }
        $result = $db->query("SELECT cumul FROM users WHERE id='".$don['user_id']."'");
160
        $cumul = $result->fetch(\PDO::FETCH_ASSOC);
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
        $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"]) {
            $mailer = new SMTP(SMTP_HOST, SMTP_PORT, SMTP_SECURITY, SMTP_USER, SMTP_PW);
            $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";

199
200
            // Création de l'url d'administration
            $admin_url = "https://support.laquadrature.net/perso";
201
202
203
204
205
206
            foreach ($f3->get('languages') as $key => $language) {
                if ($lang==$language[1]) {
                    $admin_url = "https://".$language[0].$f3->get('dev').".laquadrature.net/perso";
                }
            }

207
208
209
210
211
212
213
            // Remplacement des variables par leurs valeurs
            $fields = array(
                "NAME"=>$user["pseudo"],
                "SOMME"=>$don['somme'],
                "CUMUL"=>$cumul,
                "URL_ADMIN" => $admin_url
            );
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
            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";
    }
};