Post on 16-Apr-2017
como desenvolver uma loja com PagSeguro
Da argila ao forte:
Michael Granados - @dgmike
Ento... voc tem uma idia, mas...
Por onde comear?
Seja rpido
Quanto mais tempo demorar para comear sua startup mais voc estar jogando dinheiro fora!
Inicie seu negcio enquanto antes, seu lucro s vir depois que voc se lanar definitivamente
Desenvolvimento gil
Programador preguioso?
O seu trabalho deixar com que as pessoas faam menos esforos
Inspire-se em voc mesmo
Uma idia!
e-commerce
E-commerce pronto?
Magento
Joomla + VirtueMart
WordPress + WP-shopping-cart
Django + Sathmo
Loja Locaweb
OsCommerce
PretaShop
...
O ambiente
O ambiente
Sistema de controle de verso - Subversion
Linguagem forte e madura PHP
Banco de dados MySQL
Servidor Apache
Controle de verso existem vrios
Subversion
Bazaar
Git
Mercuial
CVS
Como funciona?
Como funciona?
FTP
Como funciona?
FTP
Skywalker
UPLOAD
Como funciona?
FTP
Como funciona?
FTP
Corrige BUG online
Como funciona?
FTP
Darth Vader
UPLOAD
Como funciona?
REPOSITRIO
Como funciona?
REPOSITRIO
Skywalker
Darth Vader
1
Como funciona?
REPOSITRIO
CHECKOUT
1
1
1
Como funciona?
REPOSITRIO
COMMIT
2
2
1
Como funciona?
REPOSITRIO
COMMIT
2
2
1
Como funciona?
REPOSITRIO
2
2
1
Como funciona?
REPOSITRIO
2
2
2
UPDATE
Como funciona?
REPOSITRIO
COMMIT
2
3
3
Como funciona?
REPOSITRIO
SERVIDOR
CHECKOUT /UPDATE
COMMITS
Framework vantagens
Mtodos mgicos que auxiliam no desenvolvimento
Regras que ajudam a manter a organizao dos arquivos geralmente MVC
Gama de interfaces para bancos de dados
Helpers que libertam-te de escrever cdigo
Scripts que geram boa parte do cdigo
Gerenciamento de cache deixando a aplicao mais rpida
Framework desvantagens
Voc precisa aprender uma nova lingua
O fato dos scripts gerarem boa parte do cdigo interfere em sua criao
Regras que nem sempre se aplicam a seu negcio
Criao de demasiados arquivos que nem sempre so necessrios
Frameworks - exemplos
Zend Framework
CodeIgniter
CakePHP
Synphony
Spaghetti*
Proposta, um microframework
Um nome: Ice-Baby
Organizao: MVC Model, View, Control
Gerenciamento de URLs
M de MVC Model
Iremos usar PDO (PHP Database Object) como base para o Model
Suporte para vrios bancos de dados
Nativo desde o PHP5.2
Extensvel
Orientado a Objetos
Fcil de usar
Foco! O que o framework ter
Manipular Banco de Dados
Mtodos mgicos definidos por voc
Reaproveitamento de cdigo
URLs amigveis
Segurana
Fcil de entender
Simples de fazer manuteno
M de MVC Model
Vrios 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 amigveis
$urls = array( # 'Expresso regular' => Controller '^/?$' => 'Inicio', '^/categoria/(\d+)/?$' => 'Categoria', '^/produto/(\d+)/?$' => 'Produto',);
Abracadabra: a mgica!
$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 mgica!
$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 mgica!
$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 mgica!
$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 mgica!
$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 mgica!
$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 mgica!
$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 mgica!
$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 mtodos mgicos
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 mo na massa!!!
Formas de pagamento
Boleto bancrioCarto de crditoCartes de dbitoTransao entre contas...
... ou usar o PagSeguro
PagSeguro: como funciona?
PagSeguro: como funciona?
Pague com o PagSeguroPagSeguro: como funciona?
Pague com o PagSeguro
POSTPagSeguro: como funciona?
Usurio - POST
E o tal do retorno?
Usurio - POST
Usurio - GET
E o tal do retorno?
Usurio - POST
Usurio - GETRob POST
E o tal do retorno?
Usurio - POST
Usurio - GETRob POST
Bad GuyPOST?
E o tal do retorno?
Usurio - POST
Usurio - GETRob POST
POST TOKENVERIFICADO/FALSO
E o tal do retorno?
Bad GuyPOST?
Na ptica, use a biblioteca
A Visie possui uma tima biblioteca que gera o formulrio de forma simples
http://visie.com.br/pagseguro/php.php
#comofas?
require_once('pagseguro/pgs.php');$cod = uniqid(true);$pgs = new Pgs(array( 'email_cobranca' => 'mike@visie.com.br', '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 automtico
Use o cod_referencia
Passo final: Publicando!
Com o controle de verso e um servidor bom, tudo fica mais fcil!Faa o checkout do projeto no servidorImport do banco de dadosDivulgue!
Links
http://dgmike.com.br/lojasimpleshttp://dgmike.com.br/lojasimples-trachttp://slideshare.com/dgmike
Referncias
http://php.net/http://br.php.net/pdohttp://subversion.tigris.org/http://trac.edgewall.org/http://visie.com.br/pagsegurohttp://www.generatedata.com/http://tinyurl.com/mkmu58 (W3C: HTML5)
Perguntas?!
http://meadiciona.com/dgmike