1. Google e i pagamenti
elettronici
Firenze GTUG, 15.04.2011
Luca Masini
2. Agenda
Introduzione a Google Checkout
Intro alle API ed esempi di utilizzo
Carrello personalizzato
In-App billing
Android Payment Extensions
3. Il mercato dei merchant server
Indice di
gradimento dei
venditori
I voti sono da 1 a 10
Checkout ottiene un voto
> 7 in 5 indicatori su 6
L'unico che ottiene un
voto > 7 nell'indice di
gradimento dei
compratori e' PayPal
4. Google Checkout: cosa ha di nuovo ??
Merchant server: 1° in Italia CRF (1998)
Pagamenti senza fornire tutte le volte
i propri dati sensibili (conto corrente o carta di
credito): PayPal
Bottone x pagamento immediato e
carrello di prodotti eterogenei: molti altri prima di
lui
5. Ma allora perché Google Checkout ??
Integrazione con OAuth --> sensazione di
sicurezza dell'ecosistema Google.
Facile da implementare, grazie alle API ed ai
Gadget.
É il sistema di pagamento dell'Android Market
6. Prima di cominciare: Sandbox
Grande disponibilitá di strumenti per sviluppatori
Sandbox - due componenti:
Un gestore di account utenti
Merchant non dispositivi
Componenti che danno la possibilitá di testare
Checkout senza alcun vincolo sulle transazioni
effettuate
NOTE: purtroppo per usarlo dobbiamo invocare
URL diverse dalla produzione !!!
7. Prima di cominciare: Sandbox
merchant key (mkey) - merchant id
--> Hello World di Checkout:
curl -k -u {mid}:{mkey} -d "<hello xmlns='http://checkout.google.
com/schema/2'/>" "https://sandbox.google.com/checkout/api/
checkout/v2/request/Merchant/{mid}"
se l'account e' attivo deve rispondere un "bye"
<?xml version="1.0" encoding="UTF-8"?>
<bye xmlns="http://checkout.google.com/schema/2" serial-number="
a587860e-265b-4cbd-9a34-5fd1cac8aa11" />
8. Esempio API: Checkout con carrello
Implementazione di un carrello
in pochi minuti
Dobbiamo aggiungere il JavaScript del carrello
<script id="googlecart-script" type="text/javascript"
src="http://checkout.google.com/seller/gsc/v2/cart.js?mid=
{mid}" currency="USD"
post-cart-to-sandbox="true">
</script>
Lo aggiungiamo alla pagina:
<div id="googlecart-widget" class="align-cart"></div>
9. Esempio API: Checkout con carrello
Qui descriviamo il prodotto aggiungendo al nostro
custom HTML delle classi CSS che verranno usate
come selettori dal cart per definirne le proprietá:
<table>
<tr class="product">
<td><img class="product-image"
src="customLogo.gif"/>
</td>
<td class="data-cell">
<div class="product-title">GTUG Firenze Logo</div>
<div class="product-price">Price: $0.99</div>
<div class="product-shipping">Shipping: $0.00</div><br/>
<div role="button" alt="Add to cart" tabindex="0" class="googlecart-add-button">
</div>
</td>
</tr>
</table>
10. Esempio API: Checkout con carrello
Demo su Eclipse:
Risultato su GAE: http://4.lu28882.appspot.com/
11. Carrello personalizzato
Se dobbiamo integrarci in un sito di e-commerce giá
esistente (e non tra quelli giá supportati) o se per qualche
motivo non vogliamo/possiamo usare il carrello di
Checkout, allora dobbiamo far uso delle API per creare gli
ordini da mandare a Checkout
Ora scriveremo una Servlet che simula un sistema di e-
commerce che all'ultimo step chiama Checkout con il
carrello giá riempito
Ovviamente per questo esempio abbiamo bisogno delle
Checkout Java API reperibili a questo indirizzo:
http://code.google.com/p/google-checkout-java-sdk
12. Carrello personalizzato
public class CreateCartServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public static ApiContext API_CONTEXT = new ApiContext(
Environment.SANDBOX, "{mid}", "{mkey}", "USD");
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
CheckoutRedirect checkoutRedirect = API_CONTEXT.cartPoster().makeCart()
.addItem("GTUG Firenze Logo", "Il nostro bellissimo logo", 0.99, 2)
.addItem("GWT Intro Logo", "Primo evento su GWT", 0.50, 1)
.buildAndPost();
resp.sendRedirect(checkoutRedirect.getRedirectUrl());
}
}
AppEngine: http://4.lu28882.appspot.com/createcart
14. Carrello personalizzato: gestione ordini
Abbiamo creato un ordine su Checkout
Ora dobbiamo gestirlo !!!!
Per questo dobbiamo:
configurare sul merchant la nostra callback URL,
chiamata ad ogni evento (https://sandbox.google.
com/checkout/sell/)
implementare sul nostro server la FSM che gestisce gli
eventi lato negozio
Se usiamo le API di Google l'implementazione della FSM é
semplificato da una helper-class che si occupa di fare il
parsing della URL e di chiamare i callback methods
appropriati
17. Carrello personalizzato:
implementazione della FSM
Tutti i particolari della FSM sono a carico delle API di
Google Checkout, unica cosa a carico dello sviluppatore é
mantenere traccia del numero di serie delle chiamate,
implementando i metodi rememberSerialNumber e
hasAlreadyHandled (chiamate duplicate).
Il metodo onAllNotifications é chiamato invece ad ogni
invocazione della URL di callback e ci permette di effettuare
azioni trasversali ad ogni stato, banalmente logging.
Infine il metodo piú importante é
onAuthorizationAmountNotification che ci avverte che
l'autorizzazione al pagamento é stata ottenuta e quindi
possiamo "spedire" la nostra merce.
18. Carrello personalizzato: ricevimento callback
Qui riceviamo l'evento new-order-notification e visto che il
nostro codice non specifica una callback il logger visualizza
solo la registrazione del serialNumber e la chiamata
all'onAllNotifications
2011-04-03 02:48:01.773 /createcart 200 6523ms 240cpu_ms 0kb Google Checkout Notification Agent 1.0,gzip(gfe)
74.125.126.82 - - [03/Apr/2011:02:48:01 -0700] "POST /createcart HTTP/1.1" 200 171 - "Google Checkout Notification
Agent 1.0,gzip(gfe)" "4.lu28882.appspot.com" ms=6524 cpu_ms=7770 api_cpu_ms=0 cpm_usd=0.216077
loading_request=1
E2011-04-03 02:48:01.726net.lucamasini.checkout.servlet.CreateCartServlet$1 isPersistent: isPersistent:
443704066646623-00001-7
E2011-04-03 02:48:01.728net.lucamasini.checkout.servlet.CreateCartServlet$2 onAllNotifications: onAllNotifications:
Order 443704066646623 authorized and ready to ship to:Luca Masini
E2011-04-03 02:48:01.728net.lucamasini.checkout.servlet.CreateCartServlet$1 persist: persist:443704066646623-00001-
7
19. Carrello personalizzato: ricevimento callback
Ecco il secondo ed ultimo evento authorization-amount-
notification nel quale ci segnala che il sistema ha
autorizzato il pagamento, qui l'evento é correttamente
intercettato dalla callback
onAuthorizationAmountNotification
2011-04-03 02:49:04.357 /createcart 200 347ms 280cpu_ms 0kb Google Checkout Notification Agent 1.0,gzip(gfe)
72.14.212.82 - - [03/Apr/2011:02:49:04 -0700] "POST /createcart HTTP/1.1" 200 171 - "Google Checkout Notification
Agent 1.0,gzip(gfe)" "4.lu28882.appspot.com" ms=348 cpu_ms=280 api_cpu_ms=0 cpm_usd=0.008029
E2011-04-03 02:49:04.334net.lucamasini.checkout.servlet.CreateCartServlet$1 isPersistent: isPersistent:
443704066646623-00005-6
E2011-04-03 02:49:04.334net.lucamasini.checkout.servlet.CreateCartServlet$2 onAllNotifications: onAllNotifications:
Order 443704066646623 authorized and ready to ship to:Luca Masini
E2011-04-03 02:49:04.334net.lucamasini.checkout.servlet.CreateCartServlet$2 onAuthorizationAmountNotification:
onAuthorizationAmountNotification: Order 443704066646623 authorized and ready to ship to:Luca Masini
E2011-04-03 02:49:04.335net.lucamasini.checkout.servlet.CreateCartServlet$1 persist: persist:443704066646623-00005-
6
20. In-App Billing
... an Android Market service that provides checkout
processing for in-app purchase.
ovvero
si possono accettare pagamenti direttamente all'interno delle
appicazioni.
The standard 30% transaction fee applies to in-app
transactions on Android Market.
"Today, we're pleased to announce the launch of Android Market In-app
Billing to developers and users. As an Android developer, you will now be
able to publish apps that use In-app Billing and your users can make
purchases from within your apps." --- 29 March 2011
21. In-App Billing: a patto che
Only in applications that you publish through Android Market.
You must have a Google Checkout Merchant account.
You cannot implement in-app billing on a device that never
connects to the network
You can use in-app billing to sell only digital content. You cannot
use in-app billing to sell physical goods, personal services, or
anything that requires physical delivery.
Android Market does not provide any form of content delivery. You
are responsible for delivering the digital content that you sell in your
applications.
+ qualche complicazione circa le versioni di android/Market
app ecc...
22. In-App Billing: schema
Your application sends and
receives billing messages
through the
Android Market application
(via a single IPC method
sendBillingRequest), which
handles all communication
with the Android Market
server.
23. In-App Billing: schema
1. Applications initiate in-
app billing requests
through their own UI.
2. Android Market
responds to the
request by providing
the checkout user
interface.
3. When checkout is
complete, the
application resumes.
24. In-App Billing:
BILLING_REQUEST ="REQUEST_PURCHASE"
http://developer.android.com/guide/market/billing/index.html
http://www.anddev.org/advanced-tutorials-f21/simple-inapp-payment-t52060.html
You cannot use the Android emulator to test in-app billing.
25. Google Checkout
Android Payment Extension
Estensione di Chome che permette di completare un acquisto
tramite SmartPhone:
Usando Chrome da un PC per visualizzare il carrello, viene
messo a disposizione un bottone verde col simbolo di
Android che permette di fare l'ordine su un PC o laptop
(magari ad una fiera) e di completarlo sul proprio cellulare
cosi' da non dover immettere le proprie credenziali Google su
un computer "pubblico".
26. Google Checkout
Android Payment Extension
Creazione di uno store usando il Google Gadget Wizard:
https://storegadgetwizard.appspot.com/storegadgetwizard/