Come implementare un pagamento online: Creare un bottone dinamicamente (6/6)
In questo ultimo articolo della serie sui pagamenti online, vedremo come sia possibile implementare un bottone di pagamento in modo dinamico. Nell’applicazione che abbiamo sviluppato per questo tutorial abbiamo infatti utilizzato un bottone generato da PayPal; molto comodo, ma nella realtà potrebbe non essere sufficiente.
Prendo spunto da una domanda posta da un utente alla fine del quarto articolo, mi si chiedeva più o meno questo: “I miei utenti sono già registrati. Io vorrei che potessero acquistare un servizio ma come posso far passare un dato che mi associ il pagamento all’utente che lo ha effettuato?” E’ chiaro che per operazioni del genere, dovremo creare il pulsante di pagamento dinamicamente.
Cos’é un pulsante di pagamento creato dinamicamente?
Si tratta di un semplice form nel quale, attraverso dei campi hidden, possiamo far passare i valori che vogliamo comunicare a PayPal tramite delle variabili predefinite. Vedremo tra poco come; ma prima definiamo uno scenario.
Scenario
Abbiamo detto che gli utenti sono già registrati al sito, dunque dovremo passare (assieme ai dati del pagamento) anche l’id dell’utente. Per rendere la cosa ancor più succosa passeremo un altro dato ovvero il livello del servizio. Stabiliamo dunque tre livelli di qualità per il servizio:
- basic 20 euro
- premium 30 euro
- platinum 35 euro
Ora vedremo come creare un plusante di pagamento in modo dinamico per questa situazione. E’ chiaro che non svilupperemo tutta l’applicazione ma solo il pulsante. Dunque do per scontato che l’id dell’utente lo troveremo nella variabile di sessione id_user e che il tipo di abbonamento scelto come pure il prezzo siano già stati inseriti nelle variabili $type e $amount.
Sviluppare il bottone
Come abbiamo detto il bottone di pagamento non é altro che un form nel quale passeremo, attraverso dei campi hidden, i valori della transazione.
Iniziamo con il dichiarare il form, facendolo puntare all’url di sandbox se siamo in simulazione o a quello di PayPal se siamo in produzione.
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
Ora inseriamo un campo che invia la variabile cmd e che serve ad indicare a PayPal se stiamo utilizzando un semplice bottone (_xclick) o un carrello (_cart).
<input type="hidden" name="cmd" value="_xclick">
Con la variabile currency_code passiamo invece il dato relativo alla valuta che intendiamo utilizzare per il pagamento. Troverai i codici valuta supportati da PayPal verso la fine di questo documento.
<input type="hidden" name="currency_code" value="EUR" />
Un altro parametro che possiamo configurare é lc e si riferisce alla lingua che vogliamo utilizzare, nel nostro caso l’italiano.
<input type="hidden" name="lc" value="IT" />
Ora dovremo fornire, tramite il parametro business, l’email primario (di PayPal se siamo in produzione o di sandbox se siamo in simulazione).
<input type="hidden" name="business" value="tuoEmailPrimario@sito.com" />
Possiamo anche fornire l’url al quale inviare la notifica di pagamento, ovvero dove si trova il nostro listener.
<input type="hidden" name="notify_url" value="http://www.tuoSito.com/urlDelListener.php" />
Passiamo ora una descrizione di quanto l’utente sta per acquistare. Come vedi inserisco dinamicamente la variabile $type che contiene il tipo di servizio che é stato scelto.
<input type="hidden" name="item_name" value="Abbonamento <?php echo $type; ?> su TuoSito" />
Questo valore verrà mostrato in alto nella pagina del pagamento su PayPal
Ed infine, grazie al parametro amount, passiamo il valore che l’utente dovrà pagare. Questo valore, come ho già detto, é inserito nella variabile $amount.
<input type="hidden" name="amount" value="<?php echo $amount; ?>" />
A questo punto si pone il problema di come inviare i dati necessari per capire chi ha pagato (id_user) e che tipo di servizio ha acquistato ($type).
I parametri che abbiamo visto fino ad ora sono parametri standard di PayPal e non possiamo inventarne altri arbitrariamente. Questo vuol dire che non possiamo ad esempio inventare il parametro id_user e passarlo come campo hidden nel nostro form in quanto non é riconosciuto da PayPal e dunque la transazione solleverà un errore.
Come passare uno o più parametri personalizzati
PayPal mette a disposizione il parametro custom, nel quale possiamo far passare un dato a nostra discrezione. Dunque se volessimo far passare l’id dell’utente (che abbiamo in sessione) non dovremo fare altro che questo.
<input type="hidden" name="custom" value="<?php echo $_SESSION[‘id_user’]; ?>" />
E nel nostro listener potremo recuperare l’id dell’utente da $_POST[‘custom’].
Ma come abbiamo visto, in questo caso abbiamo necessità di far passare due valori. E come si fa? C’é una sola variabile custom!
Esistono molte soluzioni per far passare diversi dati in un unico parametro. Quella che ritengo più elegante é di esprimere questi dati nella forma di una notazione JSON.
Dunque prepariamo questa notazione:
$data = '{"id": ' . $_SESSION[‘id_user’] . ',"type":"' . $type . '"}';
Ed ora passiamo questo dato nella variabile custom:
<input type="hidden" name="custom" value="<?php echo $data; ?>" />
E per finire mettiamo il pulsante vero e proprio:
<input type="submit" value="PAGA ADESSO" />
Ed ecco il form completo:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Pagamento</title> </head> <?php // // $amount e $type a questo punto sono valorizzati (non ci interessa come) // $_SESSION['id_user'] contiene l'id dell'utente // $data = '{"id": ' . $_SESSION['id_user'] . ',"type":"' . $type . '"}'; ?> <body> <form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post"> <input type="hidden" name="cmd" value="_xclick"> <input type="hidden" name="currency_code" value="EUR" /> <input type="hidden" name="lc" value="IT" /> <input type="hidden" name="item_name" value="Abbonamento <?php echo $type; ?> su TuoSito" /> <input type="hidden" name="amount" value="<?php echo $amount; ?>" /> <input type="hidden" name="business" value="tuoEmailPrimario@sito.com" /> <input type="hidden" name="notify_url" value="http://www.tuoSito.com/urlDelListener.php" /> <input type="hidden" name="custom" value="<?php echo $data; ?>" /> <input type="submit" value="PAGA ADESSO" /> </form> </body> </html>
Ricezione della notifica
E’ ovvio che il nostro listener dovrà essere adattato alle nuove necessità. In particolare:
- In questo caso non si tratta di aggiungere un utente, bensì di abilitarne l’accesso ad un servizio.
- Il metodo isVerifiedAmmount() dovrà distinguere che tipo di servizio é stato acquistato e quindi verificare che il costo di questo servizio sia uguale a quanto pagato dall’utente.
Ma questo non sarà un problema. Nella variabile custom troveremo tutto quello che ci serve; dovremo solo decodificarla in questo modo:
$data = json_decode(stripslashes($_POST[‘custom’])); //A questo punto l’id dell’utente sarà contenuto nell’oggetto $data // e recuperabile in questo modo $data->id; // stesso discorso per il tipo di servizio $data->type;
Conclusione
Siamo giunti alla fine di questa corposa serie di tutorial nel corso dei quali hai imparato ad implementare un bottone di pagamento e a testarne il funzionamento. Come hai potuto vedere, la struttura messa a disposizione da PayPal é molto completa e, tenuto conto che si tratta pur sempre di un pagamento, anche relativamente semplice.
Pensi che utilizzerai le tecniche presentate per i tuoi lavori? Lo hai già fatto?
Articoli di questa guida
- Preparazione
- Chiarirsi le idee
- Le procedure generali
- Le procedure specifiche
- Testare l’applicazione
- Creare dinamicamente i pulsanti di pagamento
70 commenti
Trackback e pingback
-
Come implementare un pagamento online: Le procedure specifiche (4/6) | Your Inspiration Web
[...] Creare dinamicamente i pulsanti di pagamento Scarica la versione PDF Tags: pagamenti, paypal [...] -
Come implementare un pagamento online: Preparazione (1/6) | Your Inspiration Web
[...] Creare dinamicamente i pulsanti di pagamento [...]
@Maurizio io e te andremmo d’accordo sempre quando si parla di php ;)
Complimenti per l’articolo :D
Grazie Rocco
Complimenti sei lezioni da conservare con cura…
E grazie anche a te Mimmo :-)
Veramente un ottimo lavoro…
Grazie…
Grazie a te agwebdesign per l’apprezzamento
Non mi piace intervenire quando non ho niente da dire, come in questo caso, perché non sono un tecnico e, al massimo, posso leggere in silenzio per imparare. E mi si perdoni per la vacuità del commento. Ma lasciami applaudire, Maurizio, il lavoro che stai facendo e il contributo di crescita che offri – come fanno tutti quelli di YIW – a centinaia di persone alle prese con questo tipo di formazione.
Ho avuto modo di interagire un pò con tutti qui, e di dichiarare il mio stato di infatuazione per questa squadra che, misurata sul piano complessivo dell’offerta (tecnico, umano, di responsabilità etc.) non ha eguali nello scenario italiano. Non avevo ancora avuto l’occasione di complimentarmi con te.
Poi, mi sono detto, se per farlo aspetto di avere argomenti validi, allora non succederà mai, posto che Maurizio interviene quasi sempre su tematiche che non mi competono.
Lo faccio adesso. Complimenti sinceri, Maurizio. Davvero.
Grazie Carlo.
E’ sempre un piacere ricevere delle attestazioni di stima che alla fine si traducono nella voglia di fare ancora meglio; di consolidare ed ampliare questo progetto che sta crescendo (più di quello che sia dato vedere).
Un lavoro impegnativo ampiamente ripagato dalle risate che ci facciamo in redazione… un giorno dovremmo fare un “dietro le quinte”…
Grazie ancora Carlo per le tue parole.
Ho scaricato le 6 lezioni, ne ho fatto un unico pdf e l’ho archiviato fra gli strumenti web da tenere a portata di mano. Grazie per la condivisione, ho apprezzato molto.
Grazie a te per l’apprezzamento
Ciao Maurizio, grazie per l’utilissimo tutorial.
Sono riuscito a implementare tutto correttamente, ma ora ho dei problemi con il bottone personalizzato.
Ho come la sensazione che la transazione col bottone dinamico non faccia la chiamata al listener. Per intenderci: se prendo l’url del listener e lo sbatto in un browser mi arrivano per mail delle notifiche di errore (correttamente). Se faccio la transazione non mi aggiorna il dbase (ci devo ancora lavorare) ma sopratutto non mi arriva nessun errore per mail, cosa praticamente impossibile perchè l’ho disseminato di sendreport dappertutto.
Mentre quando era col bottone hostato funzionava tutto alla perfezione (sò che va modificato, ma almeno le notifiche di errore devono arrivarmi giusto?).
E poi, posso settare specificare la pagina del mio sito di fine transazione?
Come non detto, non ho capito bene come ma almeno ora ho la certezza che la chiamata la fà :)
Rimane la seconda domanda…
E’ questa la seconda domanda?
Si è quella ;) più in generale se ci sono altri settaggi possibili, tipo quelli che ci sono nei bottoni hostati…
dunque puoi usare la variabile return, con la quale passi l’url al quale l’utente viene reindirizzato al termine del pagamento
Grazie Maurizio! Era proprio quello che cercavo.
Ciao Maurizio,
ho implementato tutto il tutorial con successo, ma mi succede una cosa davvero peculiare:
mi sono arrivate 3 mail di avvenuta transazione (!), inviate dal listener, senza che nessuna transazione sia stata fatta e che nessuna riga sia stata scritta nel dbase.
– non ho fatto modifiche al tuo codice, se non di testo, quindi: la mail dovrebbe partire davvero SOLO SE tutti i requisiti vengono soddisfatti.
– se chiami il listener dal browser senza passare dal sito mi arriva si una mail ma di notifica di errore, com’è giusto che sia.
– passando dal sito non è possibile non lasciare traccia sul dbase, invece non trovo nuove righe anche dopo la ricezione di questa mail
– il sito non è ancora stato divulgato e quindi lo conosciamo in pochissimi
Ti viene in mente qualcosa?
Grazie!
Daniele
Identico problema a Daniele, mi arrivano notifiche di pagamenti, senza che nessuno effettui una traslazione, ne sono sicuro perchè al momento ne sono solo io a conoscenza, come può essere? da dove parte questa richiesta?
Ma ragazzi, intendete l’email di attivazione dell’account?
Non é possibile. Quella mail viene inviata dal metodo insertNewUser solo se isReadyTransaction.
Quindi per poter essere inviata deve obbligatoriamente arrivare una notifica autentica e confermata.
Ci deve per forza essere un errore.
Guardato il log?
Inserito qualche testimone qua e la nel codice?
>Ma ragazzi, intendete l’email di attivazione dell’account?
Si
>Non é possibile.
:D ben per quello te l’ho segnalato, anche per me sembra impossibile. Anche perchè ho messo dei send report in tutti gli if, e se chiami il listener dal browser, mi arrivano i report corretti e NON mi arriva la mail di attivazione.
MA ogni tanto mi arriva un’attivazione dal nulla a caso!
>Guardato il log?
Come posso farmelo dare da aruba?
Ma allora c’é qualcuno che ha scoperto la pagina e si diverte a fare dei pagamenti; mettilo in modalità produzione e vedrai che non arriva più nulla :-)
Beh però non rimangono transazioni in sandbox… ok proverò a metterlo in produzione, poi ti dico, grazie mille
A me da questo errore:
mod_fcgid: stderr: PHP Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /var/www/vhosts/*******.it/httpdocs/test/ipn/lettoreipn.php on line 24
ovvero sarebbe:
if(mysql_num_rows($res))
del funzione isNotProcessed()
poi per il resto non da nessun errore, ma il bello che la pagina è stata chiamata da sola, nel senso a me è arrivata l’e-mail che il pagamento è stato effettuato,ed erano le 4 di notte, nel log l’errore riportato sopra era alle 4 di notte, quindi io sono sicuro che non ero davanti al pc. Come può essere?
Come può essere non lo so, bisognerebbe vedere tutto il codice. Se é esattamente quello che ho postato io non é possibile!
Comunque abbiamo un errore vistoso nella query. Quindi come prima cosa va risolto quel bug
Ma dov’è l’errore, la query è quella scritta da te!!
Ciao Maurizio,
Mi funziona tutto bene fino a quando non modifico el INSERT per un UPDATE, pasando nel form la variabile custom che nel email di conferma mi arriva bene. Pero di modificare la linea nel db, dove ho creado il campo id, niente.
$sql = “INSERT INTO utenti
(nome,cognome,email,username,password,idTransazione)
VALUES (‘$_POST[first_name]’,’$_POST[last_name]’,’$_POST[payer_email]’,’$_POST[payer_email]’,’$md5password’,’$_POST[txn_id]’)”;
mysql_query($sql,$this->conn);
$this->sendLoginData($password);
Cambio:
$custom = $_POST[‘custom’];
$sql=”UPDATE utenti SET id=3 WHERE id_utente=’$custom'”;
mysql_query($sql,$this->conn);
$this->sendLoginData($password);
Mi sembra cosi semplice… pero non mi funziona.
Saluti
Ho scoperto che no funziona perche ho tolto:
protected function isNotProcessed()
{
$this->dbConnect();
$sql = “SELECT * FROM utenti WHERE idTransazione=’$_POST[txn_id]’”;
$res = mysql_query($sql, $this->conn);
if(mysql_num_rows($res))
}
return FALSE;
}
return TRUE;
}
abstract protected function isNotProcessed();
$this->isNotProcessed() AND
Cosi, mi arriva la email di conferma pero non attualiza il db.
Chiaro che se tolgo: $this->dbConnect();
Come posso pensare che funzioni??
É un monologo e mi sto dando del pirla da solo, un giorno per risolverlo…
Grazie comunque.
Marco
Ma guarda un po’. uno é assente per un giorno e poi si ritrova Marco che oltre a pensare ad alta voce scrive quello che pensa :-)
hehehehehehe.
Che ci vogliamo fare.
É stata una bella scoperta questa WEB, molte cose interessanti. Sicuro che faró altri esperimenti, con problemi nuovi…
Grazie ancora.
Marco
salve, ho provato ad utilizzare questa guida e devo dire che è veramente ben fatta, comunque mi funziona tutto ok tranne una cosa… l’amount, passo tutti i miei valori al paypal e mi vengono restituiti come voglio io ma amount rimane sempre a 0, posto il codice dei parametri hidden:
praticamente ho visto che se si vuole piu oggetti bisogna aggiungere item_number e specificare su amount con amount_n l’importo per quale oggetto, ho provato anche a togliere item number e a mettere amount normale ma non succede niente, anzi mi da che amount non è correttamente formattato, perchè?
Non vedo il tuo codice, comunque il formato corretto é, ad esempio per 100 euro
100.00
Con due decimali ed il punto
Ciao Giordano,
Ho il tuo stesso problema, funziona tutto bene se imposto il valore del bottone pero se voglio passargli io amount rimane a 0.
Se lo hai risolto mi dai una mano?
Grazie.
Ciao maurizio, ho quasi tutto chiario del tuo bellissimo articolo, l’unico dubbio è sulle variabili $amount e $type, avendo un form con label type radio dove value ho ad es. “servizio:costo”. Quando clicco sul submit paga come faccio a scindere le due variabili e unirle alle altre (tipo: id utente) nella variabile custom?
Infine come va modificata la riga: define(“AMMOUNT”, 50); del file pp_config.php? avendo + opzioni?
Spero di essere stato chiaro e ti ringrazio se mi vorrai rispondere.
Tutto tace…
Aggiungo qualche elemento in più.
Sto provando ad usare un crea pulsanti con menu a tendina per scegliere “tipo servizio” “prezzo”, e sembra procedere bene. l’unica cosa che facendo qualche verifica sembra che paypal non mi invii nessun dato.
Ho aggiunto nel campo url IPN il mio percorso ma a quanto pare non mi arriva nulla. Domanda? ma il nome del file dove deve rivere i dati deve chiamarsi per forza IPNListener.php oppure può essere usato qualsiasi nome? del tipo /prova.php?
Può essere usato qualsiasi nome, l’importante é che sia chiaro a paypal.
Per il resto, non so esattamente quale sia la situazione. Quello che vi ho mostrato é un esempio dove vi é un solo prodotto ed un solo prezzo. Per questo motivo ho semplificato valorizzando una costante. Ma per ogni caso diverso vi sono soluzioni diverse
Ciao, ottima guida, vorrei capire una cosa, come mai utilizzi Json invece magari di un semplice explode di php.
Ciao Federico.
Utilizzo JSON in quanto é un formato standard e di facile manipolazione.
E’ vero, si potrebbe utilizzare un separatore e la funzione explode ma… é una questione di eleganza :-)
Ciao Maurizio, ti rompo un po, ma si impara dai più bravi.
Io ho un problema: dovrei gestire due forme di pagamento, 1) che chiamo “Ricarica” e 2) che chiamo “Paga”. i due form differenti puntano tutti e due sullo stesso file IPN (paypal te ne fa gestire solo 1 ). Avevo pensato di far gestire le 2 cose sullo stesso file struffando la variabile $_POST[‘item_name’]
Ovvero quando chiamo la funzione procedi() scrivo:
public function procedi()
{
if($_POST[‘item_name’] == “Paga”){
$this->procediPaga();}
else{
$this->procediRicarica();}
}
poi avro:
public function procediPaga()
{ if($this->isReadyTransaction())
{
//codice…}
}
public function procediPaga()
{ ……
stesso lavoro faccio con la funzione isVerifiedAmmount().
Il problema è che se faccio processare i 2 codici Ricarica e Paga singolarmente vanno, se li metto insieme come mostrato prima no,
sai dirmi come mai? Dove sbaglio!! :-(
aaah! Il problema che non riesco a vedere neanche il file di log.
Ciao e grazie per l’aiuto che dai alla comunità.
correggo:
poi avro:
public function procediPaga()
{ if($this->isReadyTransaction())
{
//codice…}
}
public function procediRicarica()
{ ……
Ciao Giovanni. Non capisco perché ti complichi la vita. Perché fare una procedura per ogni prodotto? Se avessi 1000 prodotti faresti 1000 procedure?
Riorganizza il tuo codice. Fai in modo di passare con custom i dati che ti servono per poi, in fase di ricezione, fare le dovute verifiche utilizzando un unica procedura generale.
Un hosting di qualità anche solo decente ti permette l’accesso ai log.
Non puoi fare un lavoro delicato come questo su un server di quarta categoria :-)
Questi articoli sono la migliore risorsa in lingua italiana su quest’argomento e sono stati utilissimi per un primo approccio ai pagamenti tramite paypal.
Complimenti e grazie mille!
Grazie mille a te Livio
Ciao Maurizio dove trovo tutto questo su paypal?
Cosi me lo studio approfonditamente?
Interessante il modo di trattare più dati tramite jason $data = ‘{“id”: ‘ . $_SESSION[‘id_user’] . ‘,”type”:”‘ . $type . ‘”}’;
però so per esperienza che la variabile custom ha una lunghezza massima di 255 caratteri, ed essendo alla fine il contenuto di $data una stringa se si superasse tale soglia arriverebbe all’ipn troncata.
sai dirmi se esiste un modo per risolvere o aggirare il problema? io di mio faccio un presalvataggio in database, passandomi solo un id, e poi valorizzo un campo per vedere se il pagamento ce stato oppure no, ma ho sempre cercato di capire se esistesse un modo per passare tutti i dati extra paypal(indirizzi vari, dati di fatturazione, codice fiscale, partita iva etc…) senza salvarli preventivamente in Database evitando così la presenza di record inutili al suo interno.
ciao, ho seguito tutto il tuo tutorial e funziona tutto alla perfezione in modalità simulation..ma quando lo metto in production mettendo “define(“PRODUCTION”, 1);” (correggimi se sbaglio) fa i pagamenti cioè mi scala i soldi, ma non mi funziona la query che inserisce il pagamento nel db, funzione che funzionava in simulation..
che potrei sbagliare?
Ciao Maurizio, ottimo articolo
sarebbe carino un tutorial su come effettuare e gestire il pagamento sempre tramite paypal ma con carta di credito, magari come completamento di questo, che ne pensi ?
ciao e complimenti ancora
Ciao,
ho letto con interesse i tuoi articoli su come implementare il sistema di pagamento.
Ho la seguente domanda da farti:
Vorrei che durante la fase di pagamento non avvenisse tutta la transizione del pagamento, ma che restasse in una sorta di attesa. Ossia sto implementando questo sistema su un B&B e non vorrei far pagare il costo del soggiorno prima dell’arrivo, ma, come ovvio che sia, solo alla data di partenza e senza che sia, necessariamente, PayPal a gestire la richiesta. Quindi in ultima analisi, PayPal dovrebbe servirmi solo come garanzia relativa alla prenotazione così come fa http://www.booking.com.
Grazie anticipatamente
Pasquale
grazie per la guida è stata utilissima.
L’unico problema che ho è nella verifica dell’importo pagato quando parli di prezzi dinamici.
nel file pp_config
define(“AMMOUNT”, 50);
come rendo dinamica questa variabile?
grazie
Ciao, Maurizio, ti chiedo un aiuto per una modifica al tuo esempio.
Nella form giustamente dobbiamo indicare vari elementi hidden (come il link di notifica) che diciamo possono essere sensibili e che per sicurezza sarebbe meglio non fare vedere al pubblico (clic destro vedi codice html).
A ciò avevo pensato di fare passare solo alcuni dati ad una pagina transitoria tramite il form ed in questa pagina raccogliere i dati dal form, aggiungere quelli sensibili e inviare il tutto a paypal o sandbox.
Ho provato cosi:
//paginatransitoria.php
foreach ($_POST as $key => $value)
{
$req = ‘notify_url=’.$mio_link&cmd=_s-xclick&on0=Testo&business=’.$mia_email’&hosted_button_id=’.$_numero;
foreach ($_POST as $key => $value)
{
$value = urlencode(stripslashes($value));
$req .= “&$key=$value”;
}
}
$url=”https://www.sandbox.paypal.com/cgi-bin/webscr”;
//uso curl
$ch = curl_init(); // Starts the curl handler
curl_setopt($ch, CURLOPT_URL,$url); // Sets the paypal address for curl
curl_setopt($ch, CURLOPT_PORT , 443);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // Returns result to a variable instead of echoing
curl_setopt($ch, CURLOPT_TIMEOUT, 3); // Sets a time limit for curl in seconds (do not set too low)
curl_setopt($ch, CURLOPT_POST, 1); // Set curl to send data using post
curl_setopt($ch, CURLOPT_POSTFIELDS, $req); // Add the request parameters to the post
$result = curl_exec($ch); // run the curl process (and return the result to $result
curl_close($ch);
echo $result;
Cosi facendo il forma mi va in paginatransitoria.php e mi fa vedere sandbox come se mi dovessi loggare anche se sono loggato. Ho provato anche con paypal ma mi escono tre ??? (punti interrogativi), in altri termini non va!
Chiedo da ignorante, così passo solo i dati ma non accedo a paypal (sandobox) come farebbe il form, oppure cè qualcosa altro che sbaglio?
Grazie e complimenti per l’articolo.
Complimenti per la serie di articoli molto interessante!!
io stò sviluppando un ecommerce e ho qualche problema con la personalizzazione del tasto “Paga Adesso”, sono riuscito a passargli tutti i parametri giusti ( prezzo, lingua… ), l’unica cosa è che la pagina di paypal che mi mostra prevede che il cliente si debba registrare obbligatoriamente a PayPal per completare l’acquisto, invece io vorrei che dia la possibilità di pagare semplicemente con carta di credito ai non utenti PayPal.
Spero di essere stato chiaro e se qualcuno può aiutarmi ve ne sarei molto grato.
Grazie
ciao maurizio,
Mi piace molto il tuo articolo,è piu chiaro e semplice da capire in confronto ad altri che ho visto sul net.
Come posso rendere dinamico tramite php una funzione che dice ogni quarto prodotto costa di spedizione 7,59€,ogni ottavo prodotto 9,50 ma ogni prodotto ha costo spese di spedizione 6,59…
Ho provato a fare qualche modifica ma il prezzo rimane sempre 6,59 indipendentemente dalla quantita di prodotti selezionati.
Grazie per l’aiuto….:)
ciao maurizio,
Mi piace molto il tuo articolo,è piu chiaro e semplice da capire in confronto ad altri che ho visto sul net.
Come posso rendere dinamico tramite php una funzione che dice ogni quarto prodotto costa di spedizione 7,59€,ogni ottavo prodotto 9,50 ma ogni prodotto ha costo spese di spedizione 6,59…
Ho provato a fare qualche modifica ma il prezzo rimane sempre 6,59 indipendentemente dalla quantita di prodotti selezionati.
Grazie per l’aiuto….:)
Ciao Maurizio, grazie per l’articolo che, seppur vecchiotto, rimane uno dei più chiari che ho trovato sul web tra quelli che spiegano l’implementazione di Paypal.
Ho un dubbio relativo al metodo isReadyTransaction(): se ritorna FALSE è possibile in qualche modo annullare la transazione e il pagamento, evitando che Paypal accrediti comunque i soldi sul conto del venditore?
Tutorial davvero ben fatto complimenti!
Sto usando il bottone dinamico.
Vorrei sapere una cosa. Per passare dalla modalità di prova a quella reale occorre modificare:
– url di indirizzamento del form bottone dinamico
– definire define(“PRODUCTION”, 1) nello script di configurazione
e poi? altre operazioni?
Grazie.
Ciao Maurizio,
intanto grazie per questa ottima guida, che sto utilizzando per l’implementazione dei pagamenti automatici nel mio sito.
Ho un paio di problemi che sinceramente mi stanno facendo impazzire.
Il primo riguarda l’aggiornamento del codice relativo al listener. Ho creato un piccolo listener per testare il processo e vedere che il record con la transazione arrivasse sul database. Tutto ok. Quando sono andato ad ampliare e ad attivare tutte le parti del codice e ho aggiornato il listener, stranamente i record mi vengonoaggiornati sempre allo stesso modo, come se il sistema vedesse il vecchio listener. Ho disattivato IPN, ho cambiato, cancellato il listener. Niente. Sembra come se quel codice rimanesse “in memoria”, come si diceva una volta e non c’è modo di modificarlo. Che ne pensi?
L’altra cosa riguarda il form. Ho utilizzato il tuo form per l’invio dei pagamenti e funziona perfettamente. L’ho inserito in una pagina dinamica PHP, dove il codice del form viene creato con “echo” e non mi funziona. Niente. Il server PayPal neanche risponde. Bah..
Grazie a chi vorrà darmi qualche idea. Il vostro aiuto è come sempre prezioso.
Ciao
Piero
Ok, ho risolto tutto. Lo script IPN che aggiornavo non era quello giusto e ho scoperto che inviare un POST da php non è la stessa cosa che inviarlo da HTML. Sto imparando. Ora funziona tutto.
Grazie per la grande guida!
Ciao Piero
Un mio professore diceva: si capisce che hai capito una cosa pienamente, quando sei in grado di insegnarla ad un altra persona.
A distanza di qualche anno questo tutorial è incredibilmente utile. Grazie e Complimenti davvero. Quando creo i miei progetti, scopiazzo qua e là da internet i pezzi di codice o certe soluzioni per poi “farle mie”, difficilmente mi soffermo a ringraziare, ma questa volta ho proprio sentito l’esigenza di farlo.
Hai una bella testa, complimenti ancora!
Grazie, Maurizio!
Questo tutorial mi è stato veramente utile, i pdf me li conservo con cura.
Grazie infinite!
Inutile dire che non mi funziona,
Ho risolto il problema dei nomi maiuscoli dei file, ho risolto il problema che dalla prima lezione avevo pedissequamente seguito le istruzioni e in una lezione successiva avevi cambiato il nome del file da impostare in paypal come listener…
Ma non funziona nulla.
Vorrei chiederti qualcosa, ma purtroppo il tuo sito è fermo e anche le risposte su questo sito sono ferme ad un paio di anni fa…
peccato :(
Ciao,
ottima guida!
Un’unica domanda…se c’è un errore nel pagamento su paypal…dove viene reindirizzato l’utente?
Salve Maurizio o chi può darmi questa dritta seguente.
Prima però voglio ringraziare Maurizio per l’ottima guida.
La dritta che mi occorre è questa (premesso che sono agli inizi)
– vorrei adottare la soluzione che crea dinamicamente il pulsante di pagamento ma mi è sorto un atroce dubbio: visto che è un html in chiaro, se uno smanettone mi fa “Ispeziona elemento” in Google Chrome e mi legge la email principale e l’URL del listener potrei incorrere in problemi di sicurezza?
Ciao, volevo sapere chi può creare un pulsante paypal?
Un privato può creare questo pulsante? (Compra subito)
Maurizio prima di tutto..un ottimo lavoro. Conoscevo già come implementare un Paypal listener IPN ma questi articoli sono letteralmente perfetti.
Ti volevo sottoporre questo scenario, immagina un acquisto di musica ad esempio, l’utente è in una pagina in cui ha visto quanto gli costa il brano a questo punto deve 1) pagare con la piattaforma Paypal e 2) proseguire il suo percorso per scaricarlo.
Correggimi se sbaglio, il listener IPN è codice PHP che gira in modo asincrono sul server, cioè potrebbe scrivere nel database (esagero) anche qualche min dopo il pagamento dell’acquirente, mentre dal lato client l’acquirente è sulla pagina del nostro sito dove ha scelto di pagare e li è fermo in attesa di poter proseguire. Ora come sblocchi un bottone per permetterli di andare avanti (per il download in questo caso) solo quando il listener ha verificato ed ha autorizzato l’accesso al servizio? Una chiamata ajax ricorsiva al db dove è scritta l’informazione che il pagamento è ok ? Può essere questa una soluzione? è la migliore? O ce ne sono altre? Grazie.
Grazie Maurizio sei stato impeccabile!! Con semplicità e precisione hai argomentato tutto quanto necessario.
La mia domanda però è la seguente: e sei io volessi scrivere IPNListener completamente in java? Qualcuno l’ha fatto? E’ possibile farlo?
Ho iniziato la conversione di alcuni metodi, ma giunto alla parte relativa all’apertura della Socket mi sono arenato :-(
Ci sta qualcuno che è sposato con la triade “JAVA – MySql – Apache” che può supportare in modo da scrivere il listener anche in java e poi ovviamente condividerlo? Magari serve anche ad altri :-)
Buona serata a tutti! ;-) ;-)
Sto gironzolando da ore in rete per una guida del genere, e finalmente trovo questo sito.
Me ne sono già innamorato, ho letto tutta la guida e domani mi metto a lavoro sperando finalmente di riuscire a controllare i pagamenti. Grazie di tutto!
Salve non riesco il valore della variabile amount (prezzo) come mai?