1. Introdução
Construindo um modulo para carrinho abandonado no Magento me deparei com a seguinte situação:
- O usuário recebe no email uma cópia do carrinho que ele abandonou
- Ele se interessa novamente pelos produtos, clica no email
- É então direcionado para a página de login do Magento
- Digita usuário e senha, e é direcionado para a home, ou para a minha conta (varia de acordo com as configurações do admin)
- Depois o usuário tem que se dar ao trabalho de ir para o página do carrinho (checkout/cart)
- E dai então continuar com o processo
- O usuário recebe no email uma cópia do carrinho que ele abandonou
- Ele se interessa novamente pelo produtos, clica no email
- É então direcionado para uma página onde seu usuário é autenticado, e então automaticamente redirecionado para para a página do carrinho já logado.
- Se necessário modificar o carrinho e continuar com o processo
$crypt = Mage::getModel('core/encryption');
echo $crypt->encrypt("thiagão_boladão");
[retornos]
Magento 1: tDxa5XdEj6easqHi2pglwF/eQYKimNNJ
Magento 2: 5skpZoWseMKdMgd/aOMLrXSVhLebaMUa
Em duas instalações diferentes do Magento, obtive duas saídas diferentes. Isso torna a criptografia mais segura, mas não a prova de quebras. Foco no login automático!
3. Decriptografia
Da mesma forma que criptografamos a informação é possível também descriptografar obtendo a mesma sentença inicial da forma que se segue.
$crypt = Mage::getModel('core/encryption');
echo $crypt->decrypt("5skpZoWseMKdMgd/aOMLrXSVhLebaMUa");
[retornos]
Magento 1: i������o�Ǻ��f2g�
Magento 2: thiagão_boladão
4. Cryptografando e montando a URL
O meu objetivo é criar um link que é enviado para o usuário contendo id do usuário como parametro, fácil de identificar quando tivermos o retorno, seu email ( para checarmos a autenticidade do link) e uma data de expiração tudo criptografado em um link. oO
Ao invés de o link ser ao do tipo:
http://meumagento.com.br/meucontroller/loga/?id=1&email=5&expira=2121214578 seria algo do tipo:
http://meumagento.com.br/meucontroller/loga/?c=5skpZoWseMKdMgd/aOVhLebaUa .
Pensei em concaternar os dados ao invés de cada dado ser um parâmetro diferente. Por tanto vou usar os dados concatenados separados por ponto e virgula (;). Assim no primeiro parametro fica o id, no segundo fica o email do usuário e no terceiro a data de validade do link:
ID do usuário; email do usuário; data de expiração do link
Passando isso pra código seria algo assim:
$crypt = Mage::getModel('core/encryption');
$customer = Mage::getModel('customer/customer')->load(3);
//validade do link é de 48 horas
$timeout = time()+(60*60)*48;
$_crypted = $crypt->encrypt(
$customer->getId().";".
$customer->getEmail().";".
$timeout
);
//link
echo Mage::getUrl('meucontroller/loga', array('c' => $_crypted));
[deve ficar algo assim]
http://meumagento.com.br/meumodulo/meucontroller/loga/index/c/XvCfxYRNKYI9OsYPil1FgsDoi7x52+RaUdj4QoLHAaw=/
Bem legal né?
Só que se avaliarmos o nosso parametro c, vamos ver que há um “=” e um “+” na string, então pra não corremos o risco de uma deformação na nossa string antes de montar a url, vou colocar o url_encode. Ficando assim:
$crypt = Mage::getModel('core/encryption');
$customer = Mage::getModel('customer/customer')->load(3);
//validade do link é de 48 horas
$timeout = time()+(60*60)*48;
$_crypted = $crypt->encrypt(
$customer->getId().";".
$customer->getEmail().";".
$timeout
);
//link
echo Mage::getUrl('meucontroller/loga',
array('c' => url_encode($_crypted))
);
[deve ficar algo assim]
http://meumagento.com.br/meumodulo/meucontroller/loga/index/c/XvCfxYRNKYI9OsYPil1FgsDoi7x52%2BRavxAgdhTuSOI%3D/
Só não podemos deixar de decodificar depois … :)
Basicamente é isso fechamos essa etapa, temos ao final uma url com 3 parâmetros codificados e criptografados que será enviado pro usuário.
5. Controller e a volta
A volta é bem simples, com os conceitos de criptografar e decriptografar descritos a cima fica facil daqui em diante. O cliente acabou de clicar sobre o link que foi enviado e em seguida ele é direcionado para o seu controller “MeuController” no metodo “logaAction”. Esse post já está enorme, então vou me limitar ao metodo.
public function logaAction(){
$parametro = $this->getRequest()->getParam('c');
$session = Mage::getSingleton('customer/session');
if (!isset($parametro )) {
$session->addError('URL inválida ou usuário inexistente.');
$this->_redirect('/');
}
//0 - id //1 - email //2 - data de expiracao
$csv = Mage::helper('carrinhoabandonado')->decrypt($parametro );
$_customerinfo = explode(';', $csv);
//ID do usuário
$customerid = $_customerinfo[0];
//email do usuário
$customermemail = $_customerinfo[1];
//Data de expiração do link
$exp = $_customerinfo[2];
//primeira coisa a ser feita aqui é validar a data do link
if(time()>$exp){
$session->addError('URL inválida ou usuário inexistente.');
$this->_redirect('/');
}
//Usuário existe?
$customer = Mage::getModel('customer/customer')->load($customerid);
if(!$customer->getId()){
$session->addError('URL inválida ou usuário inexistente.');
$this->_redirect('/');
}
//Data ok, usuário existe, validar o email do banco com o do parametro
if($customer->getEmail() != $customeremail){
$session->addError('URL inválida ou usuário inexistente.');
$this->_redirect('/');
}
//Tudo OK!
$session->logout();
//Logando o usuário
$session->setCustomer($customer);
$this -> _redirect('/');
}
Auto explicativo?
Comentem e vamos fazer desde um post mais completo!
Quem quiser dar uma olhada no meu modulo de carrinho abandonado, e quiser fazer alguns relatórios :). Ele ta lá no GitHub (https://github.com/thiagosantos/Carrinho-Abandonado—Magento). Para esse post usei parte de código do Carrinho Abandonado, mas a versão do post está bem explicado.
atualizado:
[29/03/2012 09:43]
Deixe um comentário