|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Genova
Messaggi: 2285
|
[HTML] Realizzare comunicazione tra un sito e una banca per pagamento online
Piano piano il progetto d'esame che sto facendo inizia a funzionare
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 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
__________________
Lego ™ Fans Club |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Secondo me potresti usare JSP! Cono non molto codice java dovresti riuscire a fare tutto quello che ti serve! Puoi usare JSP?
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Genova
Messaggi: 2285
|
ti posto le specifiche, però non mi pare ci sia JSP..
Codice:
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".
__________________
Lego ™ Fans Club |
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Apr 2004
Città: Livorno
Messaggi: 6659
|
Quote:
Quote:
__________________
HWU Rugby Group :'( - FAQ Processori - Aurea Sectio - CogitoWeb: idee varie sviluppando nel web
|
||
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
in questo caso stai usando proprio AJAX |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Aug 2005
Città: Genova
Messaggi: 2285
|
Quote:
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
__________________
Lego ™ Fans Club |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
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.');}
}
}
}
|
|
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
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 |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Genova
Messaggi: 2285
|
Provando ad usare ajax con questo codice
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);
}
Arriva fino a dove ho messo gli asterischi, dopodichè basta... EDIT: che pirla 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?
__________________
Lego ™ Fans Club Ultima modifica di Dani88 : 30-05-2010 alle 12:11. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
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. |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Apr 2004
Città: Livorno
Messaggi: 6659
|
Quote:
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
__________________
HWU Rugby Group :'( - FAQ Processori - Aurea Sectio - CogitoWeb: idee varie sviluppando nel web
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Genova
Messaggi: 2285
|
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...
__________________
Lego ™ Fans Club |
|
|
|
|
|
#13 | ||
|
Senior Member
Iscritto dal: Apr 2004
Città: Livorno
Messaggi: 6659
|
Quote:
E' una pratica comune, non preoccuparti 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). Quote:
Ma per caso ti mancano le basi di PHP per farlo? Se è così chiedi pure.
__________________
HWU Rugby Group :'( - FAQ Processori - Aurea Sectio - CogitoWeb: idee varie sviluppando nel web
|
||
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
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 |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Genova
Messaggi: 2285
|
no no generare la pagina in php è la cosa più semplice che potrei fare
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ì
__________________
Lego ™ Fans Club |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
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 |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Genova
Messaggi: 2285
|
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
__________________
Lego ™ Fans Club |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
|
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Apr 2004
Città: Livorno
Messaggi: 6659
|
Quote:
A questo punto neppure l'AJAX è sicuro, quindi metti i controlli lato server in ogni caso
__________________
HWU Rugby Group :'( - FAQ Processori - Aurea Sectio - CogitoWeb: idee varie sviluppando nel web
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:09.












HWU Rugby Group








