ecommerce, mais simples do que parece
DESCRIPTION
A criação de uma loja virtual não é uma tarefa realizada apenas por desenvolvedores experientes e com um currículo extenso. Michael, que desenvolve, junto com o UOL, pacotes e soluções para a plataforma de pagamento digital PagSeguro vai mostrar isso ao vivo e a cores. Palestra gratuita: E-commerce: mais fácil do que parece Dia 12 de junho, das 10h às 13h Local: Faculdade ImpactaTRANSCRIPT
mais simples do que parecemais simples do que pareceE-commerceE-commerce
Michael Granados - @dgmikeMichael Granados - @dgmike
Então... você tem uma idéia, mas...
Por onde começar?
Seja rápido
Quanto mais tempo demorar para começar sua startup mais você estará jogando dinheiro fora!
Inicie seu negócio enquanto antes, seu lucro só virá depois que você se lançar definitivamente
Desenvolvimento ágil
Programador preguiçoso?
O seu trabalho é deixar com que as pessoas façam menos esforços
Inspire-se em você mesmo
Uma idéia!
e-commerce
E-commerce pronto?
● Magento● Joomla + VirtueMart● WordPress + WP-shopping-cart● Django + Sathmo● Loja Locaweb● OsCommerce● PretaShop● ...
O ambienteO ambiente
O ambiente
● Sistema de controle de versão - GIT● Linguagem forte e madura – PHP● Banco de dados – MySQL● Servidor – Apache
Controle de versão – existem vários
● Subversion● Bazaar● Git● Mercuial● CVS
Como funciona?
Como funciona?
FTPFTP
Como funciona?
FTPFTPSkywalker
UPLOAD
Como funciona?
FTPFTP
Como funciona?
FTPFTP
Corrige BUG online
Como funciona?
FTPFTP Darth Vader
UPLOAD
Como funciona?
REPOSITÓRIO
Como funciona?
REPOSITÓRIO
Skywalker Darth Vader
1
Como funciona?
REPOSITÓRIO
clone
1
1 1
Como funciona?
REPOSITÓRIO
push
2
2
1
Como funciona?
REPOSITÓRIO
push2
2
1
Como funciona?
REPOSITÓRIO
2
2
1
Como funciona?
REPOSITÓRIO
2
2
2
pull
Como funciona?
REPOSITÓRIO
push2
3
3
Como funciona?
REPOSITÓRIO SERVIDOR
clone/pull
push
Framework – vantagens
● Métodos mágicos que auxiliam no desenvolvimento
● Regras que ajudam a manter a organização dos arquivos – geralmente MVC
● Gama de interfaces para bancos de dados● Helpers que libertam-te de escrever código● Scripts que geram boa parte do código● Gerenciamento de cache – deixando a
aplicação mais rápida
Framework – desvantagens
● Você precisa aprender uma nova lingua● O fato dos scripts gerarem boa parte do código
interfere em sua criação● Regras que nem sempre se aplicam a seu
negócio● Criação de demasiados arquivos que nem
sempre são necessários
Frameworks - exemplos
● Zend Framework● CodeIgniter● CakePHP● Synphony● Spaghetti*● VórticePHP
Proposta, um microframework
● Público: github● Organização: MVC – Model, View, Control● Gerenciamento de URLs
O que o framework terá
● Manipular Banco de Dados● Métodos mágicos definidos por você● Reaproveitamento de código● URLs amigáveis● Segurança● Fácil de entender● Simples de fazer manutenção
M de MVC – Model
Iremos usar PDO (PHP Database Object) como base para o Model
● Suporte para vários bancos de dados● Nativo desde o PHP5.2● Extensível● Orientado a Objetos● Fácil de usar
M de MVC – Model
Vários bancos, apenas um objeto
new PDO(‘mysql:dbname=banco;host=localhost’,
‘usuario’, ‘senha’);
new PDO(‘sqlite:/opt/database/mydb.sq3’);
Helper – pau pra toda obra!
function error() {
die('Internal Server Error.');
}
function url($uri) {
return BASE_URL.$uri;
}
function valor($numero) {
return "R$ ".number_format($numero);
}
Mapeamento de URLs – URLs amigáveis
$urls = array(
# 'Expressão regular' => “Controller”
'^/?$' => 'Inicio',
'^/categoria/(\d+)/?$' => 'Categoria',
'^/produto/(\d+)/?$' => 'Produto',
);
Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';
foreach ($urls as $regexp => $class) {
if (preg_match("@$regexp@", $url, $atributos)) {
if (class_exists($class)) {
array_shift($atributos);
$method = $_POST ? 'post' : 'get';
$class = new $class;
call_user_func_array(array($class, $method), $atributos);
die();
}
}
}
error();
Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';
foreach ($urls as $regexp => $class) {
if (preg_match("@$regexp@", $url, $atributos)) {
if (class_exists($class)) {
array_shift($atributos);
$method = $_POST ? 'post' : 'get';
$class = new $class;
call_user_func_array(array($class, $method), $atributos);
die();
}
}
}
error();
Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';
foreach ($urls as $regexp => $class) {
if (preg_match("@$regexp@", $url, $atributos)) {
if (class_exists($class)) {
array_shift($atributos);
$method = $_POST ? 'post' : 'get';
$class = new $class;
call_user_func_array(array($class, $method), $atributos);
die();
}
}
}
error();
Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';
foreach ($urls as $regexp => $class) {
if (preg_match("@$regexp@", $url, $atributos)) {
if (class_exists($class)) {
array_shift($atributos);
$method = $_POST ? 'post' : 'get';
$class = new $class;
call_user_func_array(array($class, $method), $atributos);
die();
}
}
}
error();
Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';
foreach ($urls as $regexp => $class) {
if (preg_match("@$regexp@", $url, $atributos)) {
if (class_exists($class)) {
array_shift($atributos);
$method = $_POST ? 'post' : 'get';
$class = new $class;
call_user_func_array(array($class, $method), $atributos);
die();
}
}
}
error();
Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';
foreach ($urls as $regexp => $class) {
if (preg_match("@$regexp@", $url, $atributos)) {
if (class_exists($class)) {
array_shift($atributos);
$method = $_POST ? 'post' : 'get';
$class = new $class;
call_user_func_array(array($class, $method), $atributos);
die();
}
}
}
error();
Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';
foreach ($urls as $regexp => $class) {
if (preg_match("@$regexp@", $url, $atributos)) {
if (class_exists($class)) {
array_shift($atributos);
$method = $_POST ? 'post' : 'get';
$class = new $class;
call_user_func_array(array($class, $method), $atributos);
die();
}
}
}
error();
Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';
foreach ($urls as $regexp => $class) {
if (preg_match("@$regexp@", $url, $atributos)) {
if (class_exists($class)) {
array_shift($atributos);
$method = $_POST ? 'post' : 'get';
$class = new $class;
call_user_func_array(array($class, $method), $atributos);
die();
}
}
}
error();
O resultado!
class Inicio {
function get($attr1, $attr2, $attr3) {
// seu controller
}
function post() { // opcional
}
}
O resultado!
class Inicio { # controller
function get($attr1, $attr2, $attr3) {
// seu controller
}
function post() { // opcional
}
}
O resultado!
class Inicio {
function get($attr1, $attr2, $attr3) {
// seu controller
}
function post() { // opcional
}
}
O resultado!
class Inicio {
function get($attr1, $attr2, $attr3) {
// seu controller
}
function post() { // opcional
}
}
Template: aproveitando os métodos mágicos
Adicionando um produto
class Adiciona {
public function get($id, $ajax = false) {
$con =& get_con();
if (!$con->produto($id)) {
error();
}
if (isset($_SESSION['carrinho'][$id])) {
$_SESSION['carrinho'][$id]++;
} else {
$_SESSION['carrinho'][$id] = 1;
}
header('Location: '.url('carrinho'));
}
}
E-commerce pronto?!
Para que o e-commerce esteja pronto de fato, falta apenas um detalhe: o comprador deve comprar
Vamos por a mão na massa!!!
Formas de pagamento
Boleto bancário
Cartão de crédito
Cartões de débito
Transação entre contas...
... ou usar o PagSeguro
PagSeguro: como funciona?
PagSeguro: como funciona?
Pague com o PagSeguro
PagSeguro: como funciona?
Pague com o PagSeguro
POST
PagSeguro: como funciona?
Usuário - POST
E o tal do retorno?
Usuário - POST
Usuário - GET
E o tal do retorno?
Usuário - POST
Usuário - GET
Robô POST
E o tal do retorno?
Usuário - POST
Usuário - GET
Robô POST
Bad GuyPOST?
E o tal do retorno?
Usuário - POST
Usuário - GET
Robô POST
POST – TOKEN
VERIFICADO/FALSO
E o tal do retorno?
Bad GuyPOST?
Na pática, use a biblioteca
A Visie possui uma ótima biblioteca que gera o formulário de forma simples
http://visie.com.br/pagseguro/php.php
http://github.com/pagseguro
#comofas?
require_once('pagseguro/pgs.php');
$cod = uniqid(true);
$pgs = new Pgs(array(
'email_cobranca' => '[email protected]',
'tipo' => 'CP',
'ref_transacao' => $cod,
));
#comofas?
foreach ($_SESSION['carrinho'] as $id => $qtd) {
$produto = $con->produto($id);
$pgs->adicionar(array(
'id' => $produto->id,
'descricao' => $produto->nome,
'valor' => $produto->valor,
'quantidade' => $qtd,
));
}
Melhoria: brincando com JS
$pgs->mostra(array(
'open_form' => false,
'show_submit' => false
));
document.forms[0].submit();
#comofas Retorno automático
Use o cod_referencia
Passo final: Publicando!
Com o controle de versão e um servidor bom, tudo fica mais fácil!
Faça o clone do projeto no servidor
Import do banco de dados
Divulgue!
Links
http://dgmike.com.br/dgeco
http://slideshare.com/dgmike
http://github.com/dgmike/dgeco
Referências
http://php.net/
http://br.php.net/pdo
http://github.com/
http://learn.github.com/
http://visie.com.br/pagseguro
http://www.generatedata.com/
http://tinyurl.com/mkmu58 (W3C: HTML5)
Perguntas?!
http://meadiciona.com/dgmike
http://formspring.me/dgmike
@dgmike