bank.php 10.1 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
            $f3->get('container')['command_handler']->handle(new UserUpdateTotalCommand($user['id'], (int) $user['total'] + $don['somme']));
162
            $f3->get('container')['command_handler']->handle(new UserUpdateCumulCommand($user['id'], (int) $user['cumul'] + $don['somme']));
163
        }
164
        $result = $db->query("SELECT cumul FROM users WHERE id='".$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
            $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%%,

188
Toute l'équipe de La Quadrature vous remercie du fond du cœur pour votre soutien !
189

190
Connectez-vous à votre page de donateur pour télécharger les mille décimales de π que nous vous adressons symboliquement pour votre soutien, et sélectionner les contreparties que vous souhaitez recevoir (en fonction de vos dons cumulés) : https://don.laquadrature.net/perso/ (identifiant = l'adresse mail utilisée pour faire votre don.)
191

192 193 194
Grâce à vous et aux bénévoles qui agissent au quotidien, La Quadrature pourra continuer à analyser les lois, prendre position, débattre, alerter, et mobiliser, afin qu'Internet reste un espace de liberté et de partage accessible à toutes et à tous.
Quelle que soit sa forme, la participation de chacun·e est indispensable pour les victoires citoyennes : n'hésitez pas à diffuser nos articles et nos actions auprès de votre famille, de vos collègues, de vos amis, et sur vos réseaux sociaux.
Agissons pour protéger nos droits fondamentaux, partager la culture, et nous réapproprier nos données !
195

196 197 198 199 200 201 202
Pour rester au courant de l'actualité sur ces questions, vous pouvez :
* nous suivre sur Twitter : https://twitter.com/laquadrature
* nous suivre sur Facebook : https://www.facebook.com/LaQuadrature
* nous suivre sur Mastodon : https://mamot.fr/@LaQuadrature
* nous suivre sur Diaspora* : https://framasphere.org/u/la_quadrature_du_net
* vous abonner à notre lettre d'actualité hebdomadaire : https://lists.laquadrature.net/cgi-bin/mailman/listinfo/discussion
* vous abonner à notre newsletter mensuelle : https://lists.laquadrature.net/cgi-bin/mailman/listinfo/actu
203

204
Merci encore pour votre soutien !
205

206 207 208
Datalove <3

La Quadrature du Net
209 210
")."\n\n";

211
            // Création de l'url d'administration
212 213 214 215
            $admin_url = "https://don.laquadrature.net/perso";
            if ($f3->get('dev')) {
                $admin_url = "https://don.dev.laquadrature.net/perso";
            }
216

217 218 219 220 221 222 223
            // Remplacement des variables par leurs valeurs
            $fields = array(
                "NAME"=>$user["pseudo"],
                "SOMME"=>$don['somme'],
                "CUMUL"=>$cumul,
                "URL_ADMIN" => $admin_url
            );
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
            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";
    }
};