Paypal + symfony payments made simple Massimiliano Arione September, 27th 2011
About me <ul><ul><li>2001: PHP developer </li></ul></ul><ul><ul><li>2006: GrUSP member </li></ul></ul><ul><ul><li>2009: me...
the flow my server Paypal server
the REAL flow my server Paypal server
plugins <ul><ul><li>sfPaymentPlugin </li></ul></ul><ul><ul><li>sfPaymentPayPalPlugin </li></ul></ul><ul><ul><li>sfWebBrows...
configuration # apps/frontend/config/app.yml all :    sf_payment_paypal_plugin :      business :      pay@garak.it      te...
Model // lib/model/Purchase.class.php public function getTransaction() {   $ gateway  = new sfPaymentPayPal();   $gateway-...
Controller // apps/frontend/modules/my_module/actions/actions.class.php public function executeBuy() {   $purchase = new P...
View // apps/frontend/modules/my_module/templates/buySuccess.php      <form method=&quot;post&quot; action=&quot;<?php ech...
IPN controller // apps/frontend/modules/paypal/actions/actions.class.php public function executeIpn(sfWebRequest $request)...
Thanks! Massimiliano Arione @ garakkio blog.garak.it
Upcoming SlideShare
Loading in...5
×

Paypal + symfony

3,158
-1

Published on

Paypal + symfony integration. it'

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,158
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
25
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide
  • questo è il tipico flusso di un pagamento con Paypal, almeno dal punto di vista dell&apos;utente
  • dal nostro punto di vista, quello dello sviluppatore, c&apos;è un fattore in più: abbiamo bisogno di fare una &amp;quot;conversazione&amp;quot; server2server con Paypal per utilizzare l&apos;IPN (Instant Payment Notification), che ci consente di sapere se l&apos;utente ha pagato, senza aspettare che torni sul nostro sito (dove potrebbe anche non tornare, dopo il pagamento)
  • questi sono i 3 plugin che abbiamo bisogno di installare
  • questa è la semplice configurazione che dobbiamo inserire in app.yml I valori vanno ovviamente adattati col proprio account di Paypal (sia quello vero che quello di sandbox). Le 3 rotte vanno definite, ovviamente con nomi a piacere.
  • Sarebbe bene definire un modello in cui memorizzare anche nel nostro server le transazioni di Paypal, magari con un riferimento all&apos;ID della transazione di Paypal stesso. In questo esempio ho chiamato il modello &amp;quot;Purchase&amp;quot;. Questo metodo serve per ottenere un oggetto sfPaymentTransaction
  • Nel controllore istanzio Purchase e ottengo l&apos;oggetto per la transazione
  • La vista è molto semplice, l&apos;unica personalizzazione possibile è l&apos;etichetta del pulsante
  • Questo è il cuore del funzioonamento: l&apos;azione a cui corrisponde la rotta @paypal_ipn vista prima. Qui gestiamo l&apos;interazione col server di Paypal e memorizziamo il risultato nel nostro modello Purchase.
  • È tutto qui! Visto come è facile? :-)
  • Paypal + symfony

    1. 1. Paypal + symfony payments made simple Massimiliano Arione September, 27th 2011
    2. 2. About me <ul><ul><li>2001: PHP developer </li></ul></ul><ul><ul><li>2006: GrUSP member </li></ul></ul><ul><ul><li>2009: member of GrUSP steering committee </li></ul></ul><ul><ul><li>2010: PUG Rome president :-) </li></ul></ul>
    3. 3. the flow my server Paypal server
    4. 4. the REAL flow my server Paypal server
    5. 5. plugins <ul><ul><li>sfPaymentPlugin </li></ul></ul><ul><ul><li>sfPaymentPayPalPlugin </li></ul></ul><ul><ul><li>sfWebBrowserPlugin </li></ul></ul>
    6. 6. configuration # apps/frontend/config/app.yml all :   sf_payment_paypal_plugin :     business :      pay@garak.it     test :       business :    pippo_12636_biz@gmail.com     return :        @paypal_paid     cancel_return : @paypal_cancelled     notify :        @paypal_ipn
    7. 7. Model // lib/model/Purchase.class.php public function getTransaction() {   $ gateway = new sfPaymentPayPal();   $gateway->fields['no_shipping'] = 1;   $gateway->fields['item_number'] = $this->getId();   $ transaction = new sfPaymentTransaction($ gateway );   if (sfConfig::get('sf_environment') != 'prod')   {     $ transaction ->enableTestMode();   }   $ transaction ->setAmount($this->getPrice());   $ transaction ->setCurrency('EUR');   $ transaction ->setProductName($this->getName());     return $ transaction ; }
    8. 8. Controller // apps/frontend/modules/my_module/actions/actions.class.php public function executeBuy() {   $purchase = new Purchase;   $this-> transaction = $purchase->getTransaction(); }
    9. 9. View // apps/frontend/modules/my_module/templates/buySuccess.php     <form method=&quot;post&quot; action=&quot;<?php echo $ transaction ->getGateway()->gatewayUrl ?>&quot;>   <input type=&quot;submit&quot; value=&quot;pay&quot; />   <?php foreach ($ transaction ->getGateway()->fields as $fname => $fvalue): ?>   <input type=&quot;hidden&quot; name=&quot;<?php echo $fname ?>&quot; value=&quot;<?php echo $fvalue ?>&quot; />   <?php endforeach ?> </form>
    10. 10. IPN controller // apps/frontend/modules/paypal/actions/actions.class.php public function executeIpn(sfWebRequest $request) {   $gateway = new sfPaymentPayPal();   $ transaction = new sfPaymentTransaction($gateway);   if (sfConfig::get('sf_environment') != 'prod') $ transaction ->enableTestMode();   if ($ transaction ->validateIpn($request->getPostParameters()))   {     $purchase = PurchaseTable::getInstance()->find($request->getParameter('item_number'));     $this->forward404Unless($purchase, 'purchase not found');     if (!$purchase->isComplete())     {       if ($ transaction ->isCompleted()) $purchase->setComplete($request->getParameter('txn_id'));       else $purchase->setIncomplete();     }   }   else   {     $purchase->setInvalid();   }   return sfView::NONE; }
    11. 11. Thanks! Massimiliano Arione @ garakkio blog.garak.it
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×