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

4 5 6
use LQDN\Command\UserUpdateCumulCommand;
use LQDN\Command\UserUpdateTotalCommand;

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

21
        $cb_log = new \Log('/cb.log');
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
        $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;
87 88 89 90 91
        ### Attempt to do it in hmac-sha256
        $sig_hash = base64_encode(hash_hmac('sha256', $sig, CERTIFICATE, true));
        $cb_log->write("sig: " . $signature . " == " . $sig_hash);
        if ($sig_hash!=$signature) {
            $error = "Error in signature: " . $signature . " != " . $sig_hash;
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
        }
        // 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."';");
115
        $don = $res->fetch(\PDO::FETCH_ASSOC);
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

        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."';");
153
        $status = $res->fetch(\PDO::FETCH_ASSOC);
154 155
        $status = $status['status'];

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 UpdateUserTotalCommand($user['id'], (int) $user['total'] + $don['somme']))
            $f3->get('container')['command_handler']->handle(new UpdateUserCumulCommand($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
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";
    }
};