Vous êtes sur la page 1sur 67

Da argila ao forte:

como desenvolver uma loja com PagSeguro

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?

Skywalker

FTP

UPLOAD

Como funciona?

FTP

Como funciona?
Corrige BUG online

FTP

Como funciona?

FTP

Darth Vader

UPLOAD

Como funciona?
REPOSITRIO

Como funciona?
REPOSITRIO
1

Skywalker

Darth Vader

Como funciona?
REPOSITRIO
1

CHECKOUT
1 1

Como funciona?
REPOSITRIO
2

COMMIT
2 1

Como funciona?
REPOSITRIO
2

COMMIT
2 1

Como funciona?
REPOSITRIO
2

Como funciona?
REPOSITRIO
2

UPDATE
2 2

Como funciona?
REPOSITRIO
3

COMMIT
2 3

Como funciona?
REPOSITRIO CHECKOUT / UPDATE COMMITS SERVIDOR

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' '^/?$' '^/produto/(\d+)/?$' ); => Controller => 'Inicio', => 'Produto',

'^/categoria/(\d+)/?$' => 'Categoria',

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 die(); } } } error(); = new $class; call_user_func_array(array($class, $method), $atributos);

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 die(); } } } error(); = new $class; call_user_func_array(array($class, $method), $atributos);

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 die(); } } } error(); = new $class; call_user_func_array(array($class, $method), $atributos);

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 die(); } } } error(); = new $class; call_user_func_array(array($class, $method), $atributos);

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 die(); } } } error(); = new $class; call_user_func_array(array($class, $method), $atributos);

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 die(); } } } error(); = new $class; call_user_func_array(array($class, $method), $atributos);

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 die(); } } } error(); = new $class; call_user_func_array(array($class, $method), $atributos);

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 die(); } } } error(); = new $class; call_user_func_array(array($class, $method), $atributos);

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 bancrio Carto de crdito Cartes de dbito Transao entre contas...

... ou usar o PagSeguro

PagSeguro: como funciona?

PagSeguro: como funciona?

PagSeguro: como funciona?

Pague com o PagSeguro

PagSeguro: como funciona?

Pague com o PagSeguro

POST

E o tal do retorno?

Usurio - POST

E o tal do retorno?

Usurio - POST

Usurio - GET

E o tal do retorno?

Usurio - POST

Usurio - GET

Rob POST

E o tal do retorno?

Usurio - POST

Usurio - GET

Bad Guy POST?

Rob POST

E o tal do retorno?

Usurio - POST

Usurio - GET POST TOKEN Bad Guy POST? Rob POST VERIFICADO/FALSO

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' 'descricao' 'valor' )); } => $produto->id, => $produto->nome, => $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 servidor Import do banco de dados Divulgue!

Links
http://dgmike.com.br/lojasimples http://dgmike.com.br/lojasimples-trac http://slideshare.com/dgmike

Referncias
http://php.net/ http://br.php.net/pdo http://subversion.tigris.org/ http://trac.edgewall.org/ http://visie.com.br/pagseguro http://www.generatedata.com/ http://tinyurl.com/mkmu58 (W3C: HTML5)

Perguntas?!
http://meadiciona.com/dgmike

Vous aimerez peut-être aussi