Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Finalizzazione dell'ordine

PHP e e-commerce. Implementiamo il codice per finalizzare gli ordini della nostra applicazione, compreso l'invio di conferma via email al cliente.
PHP e e-commerce. Implementiamo il codice per finalizzare gli ordini della nostra applicazione, compreso l'invio di conferma via email al cliente.
Link copiato negli appunti

Una volta che il visitatore ha effettuato il pagamento, l'ordine va registrato e viene inviata un'e-mail di conferma all'indirizzo specificato. Queste procedure avvengono nella route che gestisce la pagina di conferma dell'avvenuto acquisto.

Registrazione dell'ordine

Prima di tutto dobbiamo registrare l'ordine e salvare il suo ID nella sessione.

protected function processCheckout($data) {
        $customer = new Customer(uniqid(), $data['billing']['firstname'], $data['billing']['lastname'], $data['billing']['email']);
        if($customer->save()) {
            $sess_cart = Session::getItem('cart', true);
            $cart = new Cart();
            $cart->setItems($sess_cart['items']);
            $cart->setTotal($sess_cart['total']);
            $order = new Order(uniqid(),$cart, $customer);
            $order->setBilling($data['billing']['address']);
            $shipping = (isset($data['shipping'])) ? $data['shipping']['address'] : $data['billing']['address'];
            $order->setShipping($shipping);
            if($order->save()) {
                Session::setItem('order_id', $order->getId());
            }
        }
}

Questo metodo salva i dati dell'utente e dell'ordine nel database. Quindi l'ID dell'ordine viene salvato temporaneamente nella sessione.

Conferma dell'ordine

A questo punto l'utente passa alla pagina di conferma dell'ordine dove viene inviata l'e-mail:

public function thankYou() {
    if(Session::hasItem('order_id')) {
        $order_id = Session::getItem('order_id');
                $db = new Database();
                $query_order = "SELECT * FROM orders WHERE id = '$order_id'";
                $order_res = $db->select($query_order);
                $order_data = $order_res[0];
                $query_customer = "SELECT * FROM customers WHERE id = '" . $order_data['customer'] . "'";
                $customer_res = $db->select($query_customer);
                $customer = ['fullname' => $customer_res[0]['firstname'] . ' ' . $customer_res[0]['lastname'], 'email' => $customer_res[0]['email']];
                if (Validator::isPayPalRequest()) {
                    if (Mail::sendConfirmation($order_data, $customer)) {
                        if ($db->query("UPDATE orders SET status = 1 WHERE id = '$order_id'")) {
                            Session::end();
                        }
                    }
                    Render::view('thank-you', [
                    ]);
                } else {
                    Router::redirect(SITE_URL . 'payment/');
                }
    } else {
       Router::redirect(SITE_URL);
    }
}

Invio dell'email

Reperiamo i dati dell'ordine e del cliente ed inviamo l'e-mail utilizzando la classe helper Mail. Se l'invio ha successo, aggiorniamo lo status dell'ordine contrassegnandolo come pagato.

Il metodo statico Mail::sendConfirmation() viene definito nel modo seguente:

public static function sendConfirmation($order_data, $customer_data) {
        $cart_items = unserialize($order_data['cart']);
        $file = (HTML_EMAIL) ? 'order-confirm.html' : 'order-confirmr.txt';
        $template = file_get_contents(ABSPATH . 'core/src/templates/email/' . $file);
        $cart = '';
        $total = money_format('%.2n', floatval($order_data['total']));
        $total_taxes = money_format('%.2n', floatval($order_data['total_taxes']));
        foreach($cart_items as $item) {
            if(!HTML_EMAIL) {
                $cart .= ucwords($item['name']) . "\n";
                $cart .= str_repeat('=', strlen($item['name'])) . "\n";
                $cart .= money_format('%.2n', floatval($item['price'])) . ' / ' . $item['quantity'] . "\n";
                $cart .= str_repeat('=', strlen($item['name'])) . "\n";
            } else {
                $cart .= sprintf('<tr><td>%s</td><td>%s</td><td>%s</td></tr>', ucwords($item['name']),
                    money_format('%.2n', floatval($item['price'])), $item['quantity']);
            }
        }
        $body = str_replace([
            '{fullname}',
            '{order_id}',
            '{cart}',
            '{total}',
            '{total_taxes}',
            '{billing}',
            '{shipping}'
        ], [
            $customer_data['fullname'],
            $order_data['id'],
            $cart,
            $total,
            $total_taxes,
            $order_data['billing'],
            $order_data['shipping']
        ], $template);
        $headers = '';
        if(HTML_EMAIL) {
            $headers .= 'MIME-Version: 1.0' . "\r\n";
            $headers .= 'Content-type:text/html;charset=UTF-8' . "\r\n";
        }
        $headers .= "From: " . EMAIL_FROM . "\r\n";
        $to = $customer_data['email'];
        $subject = 'PHPEcommerce: Ordine n. ' . $order_data['id'];
        return mail($to, $subject, $body, $headers);
}

Questo metodo può inviare e-mail sia in formato HTML che in testo semplice. Utilizza un template diverso a seconda del formato in cui le variabili da inserire sono marcate come {variabile} e vengono rimpiazzate dinamicamente dalla funzione str_replace() che, ricordiamolo, accetta anche array come argomenti per le sostituzioni multiple.

La funzione mail() è stata usata solo a titolo di esempio. In realtà il valore booleano restituito da questa funzione indica soltanto che PHP è riuscito ad inoltrare correttamente il messaggio all'MTA del server ma non da alcuna garanzia sul fatto che l'MTA abbia effettivamente inviato il messaggio.

Per questo motivo si consiglia l'utilizzo della libreria PHPMailer che offre un controllo completo sul protocollo SMTP e sugli errori che possono verificarsi durante l'invio delle e-mail.

Conclusione

In questo capitolo abbiamo visto come avviene la finalizzazione dell'ordine. Nei capitoli conclusivi che seguiranno vedremo come migliorare il nostro e-commerce con una serie di funzionalità aggiuntive.

Ti consigliamo anche