View Full Version : [HTML] Realizzare comunicazione tra un sito e una banca per pagamento online
Piano piano il progetto d'esame che sto facendo inizia a funzionare :D:D
Se qualcuno ricorda avevo chiesto un suggerimento un po di giorni fa su come gestire, per quanto riguarda la parte grafica, la prenotazione dei posti.
La versione finale è così fatta:
- lettura da database mysql di una tabella con i posti e rilevazione se posti sono classificati come occupati, liberi o selezionati (ovvero occupati ma dall'utente loggato in quel momento)
- funzioni js che al click sui posti modificano un array dove l'elemento i-esimo identifica il posto i-esimo (il posto 0 è undefined)
-funzione js che alla pressione del pulsante "prenota" passa dati (per ora ho fatto solo con js, ma volevo farlo con ajax) ad una pagina php che controlla se i posti scelti sono davvero ancora disponibili e nel caso li segna come occupati.
Ovviamente devo fare il controllo perchè a causa del multiaccesso potrebbe essere che qualcuno più veloce di me abbia scelto gli stessi posti e in tal caso devo avvisare l'utente.
Il sito è praticamente completo (ho realizzato login, registrazione modifica dati, ecc...), ora devo fare la parte che si occupa di portare a termine la transazione di pagamento online. In pratica il mio sito nella pagina di riepilogo dei posti prenotati ha un pulsante "completa pagamento" che mi reindirizza sul sito della banca (ovviamente finto).
Qui devo inserire le credenziali utente e carta, controllare se esiste l'utente e se ha ancora soldi nella carta, e se il pagamento va a buon fine rimandare una risposta al mio sito.
A lezione non ci hanno minimamente spiegato come funziona tale concetto di transazione, ovvero realizzare la parte di controllo login, credito residuo ecc... ok, la so fare tranquillamente, ma non riesco assolutamente a capire (proprio a livello concettuale anche) come gestire la comunicazione fra i 2 siti con scambi di dati vari ed eventuale rollback.
Tale connessione deve essere sicura da quello che ho letto nelle specifiche e deve prevedere che se qualcosa va male (credito insufficiente, salta corrente/connessione,...) tutta la procedura venga annullata.
Inoltre se dopo aver prenotato l'utente non paga entro tot minuti, devo resettare la prenotazione, ovvero i posti devono toranre liberi (quest'ultima cosa la trovo un po stupida ma vabbè non ho scritto io le specifiche :D)
Qualcuno potrebbe gentilmente spiegarmi un po, anche con guide varie, come funziona e come realizzare la parte che ho descritto sopra? Perchè partendo da zero sto incontrando difficoltà non indifferenti :( :mc: :mc:
clockover
22-05-2010, 23:51
Secondo me potresti usare JSP! Cono non molto codice java dovresti riuscire a fare tutto quello che ti serve! Puoi usare JSP?
ti posto le specifiche, però non mi pare ci sia JSP..
5. Acquisto di un posto
Per acquistare davvero il posto (i posti) prenotato(i) si deve
passare al sistema che gestisce la moneta digitale. Il sito di
TrovaUnPosto deve presentare all'utente un riassunto dei posti
prenotati e il costo totale, cui si possono aggiungere eventuali
oneri da pagare al gestore delle prenotazioni. Deve anche essere
presente un link Procedi all'acquisto che apre una nuova pagina
per invocare un sevizio della banca on-line, su connessione
sicura. In questa pagina verrà chiesto all'utente di digitare il
codice della carta, la data di scadenza, il codice di controllo,
per verificare le sue credenziali. Questi dati verranno usati dal
servizio della banca on-line per l'autorizzazione all'acquisto e sono
codificati in XML e passati mediante una chiamata. Solo dopo aver
verificato le credenziali dell'utente e la sua disponibilità sul conto
verrà dato l'OK/KO per l'acquisto.
Se l'acquisto va a buon fine, si dovrà presentare un messaggio
con tutte le informazioni pronte per essere stampate. Potete anche
inviare un messaggio di posta elettronica tenendo presente che sul
server di TSW potrebbe volerci un po' di tempo per l'invio della
posta (almeno così succedeva in passato). I posti dovranno essere
allocati definitivamente all'utente e risultare non più
disponibili per interrogazioni successive da parte di altri utenti. Il
saldo dell'utente deve essere aggiornato.
•
Se l'acquisto non va a buon fine, si dovrà presentare un
messaggio che specifica che non c'è abbastanza denaro sul conto
dell'utente per portare a termine l'operazione. I posti prenotati
ma non acquistati dovranno rientrare nel pool dei posti liberi.
Transazioni
Nell'ipotesi di accessi concorrenti si dovrà evitare di assegnare lo stesso
posto a utenti diversi. Bisogna inoltre garantire che i posti vengano tolti
dal pool una volta portata a termine l'operazione. Trovate delle
informazioni sulle transazioni con PEAR::MDB2 all'URL
http://pear.php.net/manual/en/package.database.mdb2.introtransaction.
php. All'URL
http://www.devarticles.com/c/a/MySQL/Using-Transactionswith-
MySQL-4.0-and-PHP/ trovate una discussione sulla gestione
delle transazioni con MySQL 4.0 (sul server c'è MySQL 5.0 e spero che le
istruzioni valgano comunque).
Questo comportamento richiede di mantenere "occupate" per lungo
tempo entrambe le basi di dati (blocco sincrono). Un altro approccio
prevede la prenotazione dei/i posto/i in via provvisoria. Dopodiché si
richiede il pagamento. Se il pagamento va a buon fine, si rende
permanente la prenotazione. Ovviamente occorre aggiungere un
controllo temporaneo che, dopo n minuti o ore, vada a rimuovere le
prenotazioni temporanee che non sono state concluse con successo
(perché l'utente non ha ottenuto l'autorizzazione dalla banca on-line
oppure perché ha prenotato ma poi non ha continuato nella fase di
acquisto). Questa soluzione asincrona, non richiede blocchi delle
attività delle basi di dati, ma c'è un maggior costo di gestione e si
tengono occupati dei posti fintanto che una procedura attiva non toglie la
prenotazione.
Sicurezza
Il processo deve garantire un giusto grado di sicurezza per impedire
che l'utente possa falsificare il risultato dell'interrogazione alla banca e
far credere a TrovaUnPosto di aver effettivamente pagato. Ci sono varie
possibilità per risolvere questo problema. TrovaUnPosto, lato server, può
interrogare su un back-channel il servizio della banca e in questo caso
la transazione della banca è interna a quella di TrovaUnPosto.
Alternativamente, la banca può fornire un "artefatto" firmato e cifrato
che il browser passa a TrovaUnPosto, che eventualmente può validarlo
sempre via back-channel.
In un'architettura che prevede un back-channel
Il browser contatta il sito A (es. server di autenticazione o di ecommerce)
e ottiene un token di qualche genere (tipicamente una
stringa cifrata).
• Il browser viene rediretto verso il sito B (es. servizio autenticato o
sito della carta di credito) e passa al sito B, via JavaScript o
normale form, il token ottenuto.
• Il server di B contatta, via SOAP o altro protocollo (questo è il
back-channel) il sito A per chiedere la validazione del token
passato dall'utente ed eventualmente ottenere informazioni
aggiuntive non presenti nel token (es. massimale della carta
di credito). Quest'ultima operazione in qualche caso viene
chiamata "artifact resolution".
-funzione js che alla pressione del pulsante "prenota" passa dati (per ora ho fatto solo con js, ma volevo farlo con ajax)Ehu? In che senso? AJAX mica è un linguaggio. Vuoi dire che non passa alcun dato al server?
Qualcuno potrebbe gentilmente spiegarmi un po, anche con guide varie, come funziona e come realizzare la parte che ho descritto sopra? Perchè partendo da zero sto incontrando difficoltà non indifferenti :( :mc: :mc:Mah, guarda, sei un programmatore ed il tuo pane quotidiano è affrontare di questi problemi. Vale la regola KISS ed è sempre utile il metodo "divide et impera": spezza il problema in piccoli sotto-problemi (e questo ce l'hai già), sviluppali singolarmente e poi fai interagire le soluzioni.
pabloski
23-05-2010, 14:14
-funzione js che alla pressione del pulsante "prenota" passa dati (per ora ho fatto solo con js, ma volevo farlo con ajax) ad una pagina php che controlla se i posti scelti sono davvero ancora disponibili e nel caso li segna come occupati.
modifica dinamicamente il contenuto della lista senza ricaricare la pagina? in pratica per comunicare con lo script php usi XMLHttpRequest?
in questo caso stai usando proprio AJAX
modifica dinamicamente il contenuto della lista senza ricaricare la pagina? in pratica per comunicare con lo script php usi XMLHttpRequest?
in questo caso stai usando proprio AJAX
No...per ora sto passando tramite campo hidden di un form ma non mi piace assolutamente, per quello che dicevo ajax, solo che me lo sto studiano perchè come dicevo nel primo post per questo progetto non ci hanno spiegato granchè...
E' vero che come dice MaxArt dovrei riuscire a fare da zero, però dato che il corso si chiama giusto tecnologie software per il web e che si pigliano i soldi delle tasse uni, almeno che ci spieghino le basi :D :D
pabloski
23-05-2010, 14:55
No...per ora sto passando tramite campo hidden di un form ma non mi piace assolutamente, per quello che dicevo ajax, solo che me lo sto studiano perchè come dicevo nel primo post per questo progetto non ci hanno spiegato granchè...
E' vero che come dice MaxArt dovrei riuscire a fare da zero, però dato che il corso si chiama giusto tecnologie software per il web e che si pigliano i soldi delle tasse uni, almeno che ci spieghino le basi :D :D
per quanto riguarda AJAX è molto semplice....guarda questo codice
function do_login() {
uid = document.getElementById('login_username').value;
upwd = document.getElementById('login_pwd').value;
if ((uid=='') || (upwd=='')) return;
if (window.XMLHttpRequest) { req = new XMLHttpRequest(); }
else if (window.ActiveXObject) {
try {
req = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
req = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
req.onreadystatechange = function() { getdata(req); }
req.open('GET', domain_name + 'login.php?UserID=' + uid + '&UserPWD=' + upwd, true);
req.send(null);
}
function getdata(req){
if (req.readyState == 4 && (req.status==200 || window.location.href.indexOf("http")==-1)) {
if (req.responseText=='login_successful') {
document.getElementById('logmaster').innerHTML = 'Sei Loggato.';
get_refreshed_menu_bar();
} else {
if (req.responseText=='cookies_not_available') {alert('Il tuo browser non ha i cookie attivati, è necessario attivarli per poter usare questo sito.');}
if (req.responseText=='database_query_failed') {alert('Errore interno del sito, ti preghiamo di riprovare.');}
if (req.responseText=='database_selection_failure') {alert('Errore interno del sito, ti preghiamo di riprovare.');}
if (req.responseText=='database_connection_failure') {alert('Errore interno del sito, ti preghiamo di riprovare.');}
if (req.responseText=='login_failed') {alert('Login non riuscito. Assicurati di aver inserito Nome utente e Password esatti.');}
}
}
}
!k-0t1c!
23-05-2010, 17:33
Per fare qualcosa in AJAX la strada più facile è usare l'ormai ubiquitaria jQuery.
Con jQuery hai dei comodissimi wrapper di XMLHttpRequest e tutto quel che devi fare è specificare l'indirizzo, i parametri e una funzione di callback ;)
Provando ad usare ajax con questo codice
var myReq;
var stringa;
function AJAXReq(method,url,bool){
if(window.XMLHttpRequest){
myReq = new XMLHttpRequest();
} else
if(window.ActiveXObject){
myReq = new ActiveXObject("Microsoft.XMLHTTP");
if(!myReq){
myReq = new ActiveXObject("Msxml2.XMLHTTP");
}
}
if(myReq){
execfunc(method,url,bool);
}else{
alert("Impossibilitati ad usare AJAX");
}
}
function PreparaDati(){
stringa = "";
var frm = document.forms[0];
var numeroElementi = frm.elements.length;
for(var i = 0; i < numeroElementi; i++){
if(i < numeroElementi-1){
stringa += frm.elements[i].name+"="+encodeURIComponent(frm.elements[i].value)+"&";
}else{
stringa += frm.elements[i].name+"="+encodeURIComponent(frm.elements[i].value);
}
}
}
function execfunc(method,url,bool){
myReq.open(method,url,bool);
//alert(myReq);
/* Spiegare setRequestHeader */
myReq.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
myReq.send(stringa);
myReq.onreadystatechange = handleResponse;
*************************************************
}
function handleResponse(){
alert("handleResponse");
if(myReq.readyState == 4){
if(myReq.status == 200){
alert(myReq.responseText);
}else{
alert("Niente da fare, AJAX non funziona :(");
}
}
}
function InviaDati(str){
stringa=str;
//alert(str);
//PreparaDati();
AJAXReq("POST","commons/getform.php",true);
}
ottengo che la funzione handleResponse() non viene mai chiamata...Come mai?? :mbe: :confused:
Arriva fino a dove ho messo gli asterischi, dopodichè basta...
EDIT:
che pirla :D mancavano le parentesi sulla chiamatata di funzione :D:D
Ora volevo sapere una cosa: la pagina php che passo, non ho modo di mostrarla giusto?
Cioè mi spiego meglio: se io mando i dati con una post con ajax, la pagina php può elaborare tali dati e creare una nuova pagina html?
Oppure qualsiasi "echo" che faccio viene ritornata a ajax?
pabloski
30-05-2010, 12:04
Ovviamente il risultato viene inviato all'oggetto Request ed è compito del chiamante usare quei dati.
Quello che vuoi fare tu lo si fa normalmente senza ajax. Lo scopo di ajax è proprio quello di non prendere pedissequamente l'output di uno script e mandarlo al browser al posto del contenuto corrente.
Ora volevo sapere una cosa: la pagina php che passo, non ho modo di mostrarla giusto?
Cioè mi spiego meglio: se io mando i dati con una post con ajax, la pagina php può elaborare tali dati e creare una nuova pagina html?
Oppure qualsiasi "echo" che faccio viene ritornata a ajax?A dire il vero il PHP è nato proprio per creare delle pagina HTML da visualizzare. Lo puoi usare anche per AJAX, ma in quel caso non mandare indietro una pagina, quanto invece una quantità ristretta di dati in modo da rendere più leggera la comunicazione.
Puoi mandare indietro un XML (scopo per cui è nato l'AJAX) o una stringa JSON (che ora va molto di moda), o qualcosa tipo query string, o dei dati codificati come ti pare.
Se proprio vuoi visualizzare la pagina, in handleResponse ci metti una cosa tipo
document.write(myReq.responseText)
Ma francamente mi pare una scemenza :D
si direi di si...
ma allora per passare i dati alla pagina php senza tappulli del tipo form nascoste, come faccio?
Stavo pensando che dato che i posti li visualizzo dentro un div content, potrei usare gli elementi del dom tipo replace child, append child, ecc per modificare la pagina (tipo inner html ma più pulito forse) solo che non ho capito esattamente come creare i vari pezzi...mi pare un po laborioso forse...
si direi di si...
ma allora per passare i dati alla pagina php senza tappulli del tipo form nascoste, come faccio?Non fai... Vai di form nascoste! :D
E' una pratica comune, non preoccuparti :) Mettici un campo di input di tipo hidden, e nell'attributo value ci riversi tutti i dati che vuoi mandare.
L'alternativa - ma funziona solo come metodo GET - è di usare un'istruzione del tipo
location.href = "pagina.php?dati=...";
dove, dopo il '?', ci metti i dati che vuoi passare nella classica forma delle query string (ricordati di usare la funzione escape() per evitare problemi coi caratteri speciali).
A questo punto i dati verranno passati all'ambiente PHP, che deciderà il da farsi. TIENI PRESENTE, comunque, che col metodo GET i dati che passi sono VISIBILI nella barra dell'URL e chiunque potrebbe modificarli, quindi lato server devi fare dei controlli aggiuntivi perché i dati ricevuti siano coerenti con la pagina visualizzata (qualche utente potrebbe andare a modificare la richiesta direttamente nella barra dell'URL).
Stavo pensando che dato che i posti li visualizzo dentro un div content, potrei usare gli elementi del dom tipo replace child, append child, ecc per modificare la pagina (tipo inner html ma più pulito forse) solo che non ho capito esattamente come creare i vari pezzi...mi pare un po laborioso forse...Ma niente di che, devi solo crearti dinamicamente la pagina buttando fuori il codice HTML... niente appendChild e simili.
Ma per caso ti mancano le basi di PHP per farlo? Se è così chiedi pure.
pabloski
31-05-2010, 14:30
Ma niente di che, devi solo crearti dinamicamente la pagina buttando fuori il codice HTML... niente appendChild e simili.
Ma per caso ti mancano le basi di PHP per farlo? Se è così chiedi pure.
quoto
che c'è di osceno nell'usare il dom e javascript per modificare una pagina?
ovviamente è preferibile usare dei framework preesistenti per risparmiare lavoro, ma per imparare è un must sporcarsi le mani col dom
no no generare la pagina in php è la cosa più semplice che potrei fare :D :D cioè ho ben chiaro in testa come si fa, avevo il problema sopra descritto del passaggio dei dati.
Più che altro finchè si tratta dei posti ci può stare una form nascosta, però ad esempio le info da spedire alla banca? Li non posso fare una cosa così :(...stessa cosa per la risposta della banca.
pabloski
31-05-2010, 18:44
Più che altro finchè si tratta dei posti ci può stare una form nascosta, però ad esempio le info da spedire alla banca? Li non posso fare una cosa così :(...stessa cosa per la risposta della banca.
in che senso?
il metodo POST è quello usato normalmente anche per gestire transazione dati di quel tipo, quindi comunque si usano dei form alla fin fine
si può ovviamente sfruttare XMLHttpRequest e quindi ajax
beh un campo hidden di un form è modificabile dall'utente...basta usare ad esempio programmi come firebug o web developer (parlo x firefox)...
Questo non è proprio ottimale a mio avviso, anche se a valle ci saranno altri controlli in php
pabloski
31-05-2010, 21:00
beh un campo hidden di un form è modificabile dall'utente...basta usare ad esempio programmi come firebug o web developer (parlo x firefox)...
Questo non è proprio ottimale a mio avviso, anche se a valle ci saranno altri controlli in php
beh se è per quello con greasemonkey puoi modificare tutto :D
beh un campo hidden di un form è modificabile dall'utente...basta usare ad esempio programmi come firebug o web developer (parlo x firefox)...Buona osservazione, ma devi contare che il campo verrebbe modificato giusto un attimo prima di chiamare la funzione submit() del form. A quel punto, per fare davvero l'hacker, dovresti impostare un breakpoint prima della chiamata ed intervenire da console.
A questo punto neppure l'AJAX è sicuro, quindi metti i controlli lato server in ogni caso ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.