PDA

View Full Version : [PHP] Form per PAYPAL


Ginos
30-12-2008, 13:01
Save a tutti, sto sviluppando un sistema di iscrizione online. Dopo la registrazione reindirizzo l'utente in una pagina con un form dal quale estraggo i dati utili che verranno salvati sia nel database che in sessione(nome, cognome, tip.lavoro, etc..). Ovviamete il form avrà come action l'indirizzo per i pagamenti di paypal:

<form action="https://secure.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="mia_email@yourbusinessaccount.com">
<input type="hidden" name="txn_id" value="variabile di sessione">
<input type="hidden" name="item_name" value="variabile di sessione">
<input type="hidden" name="amount" value="variabile di sessione">
<input type="hidden" name="currency_code" value="EUR">
<input type="hidden" name="return" value="https://mia_pagina_verifica_completato_process.php">
<input type="hidden" name="cancel_return" value="https://mia_pagina_verifica_annullato_process.php">
<input type="submit" value="Paga subito">
</form>
Vorrei sapere se con gli input "return" e "cancel_return" posso passare una variabile del tipo:
"https://mia_pagina_verifica_completato_process.php?pagamentoeffettuato=ok" oppure "https://mia_pagina_verifica_completato_process.php?pagamentoeffettuato=no", in modo da aggiornare automaticamente una voce nel DB corrispondente a l'utente che ha effettuato il pagamento.
Altra e ultima cosa :)
Lo script che ci fornisce paypal per utilizzare appunto le "ipn" (sotto->):

// leggi il post del sistema PayPal e aggiungi cmd
$req = 'cmd=_notify-validate';

foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}

// reinvia al sistema PayPal per la convalida
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

// assegna variabili inviate a variabili locali
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];

if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
// controlla che payment_status sia Completed
// controlla che txn_id non sia stato già elaborato
// controlla che receiver_email sia il tuo indirizzo email PayPal principale
// controlla che payment_amount/payment_currency siano corretti
// elabora pagamento
}
else if (strcmp ($res, "INVALID") == 0) {
// registra indagine manuale
}
}
fclose ($fp);
}
?>

va inserito nella pagina successiva al form?

Grazie mille!
aspetto vostri aiuti!

Ginos
30-12-2008, 16:08
allora...da quello che ho letto in rete ho capito che il codice che ci viene fornito da paypal deve essere inserito nella pagina di redirect che configuriamo nel pannello del nostro account. I valori di risposta che riceviamo dal sistema paypal sono: Completed, Failed, Pending. Su questi valori devo formulare le condizioni if del mio file in modo da procedere nell'aggiornamento del DB?

Ginos
01-01-2009, 15:35
up

CozzaAmara
03-01-2009, 11:04
Se non sbaglio è già il Server di PayPal che ti "ritorna" (all'indirizzo specificato) una serie di variabili (in POST o GET) da cui poter ricavare l'esito della transazione e i suoi dettagli.

Spulcia bene tra la documentazione delle API. ;)

Ginos
08-01-2009, 00:23
grazie per il vostro interesse!
Fortunatamente studiando il manuale per l'integrazione di paypal con il mio script (IPN) sono riuscito a capire un pò di cose. Ho modificato il loro codice in modo da poter testare il sandbox e le ipn e verificare se realmente riesco ad aggiornare il mio database...ma sto avendo problemi con la seguente riga:
$fp = fsockopen ('https://www.paypal.com', 80, $errno, $errstr, 30);
Non riesce a mettersi in ascolto con l'url paypal.com! In locale sembra che ci riesca e non mi da nessun messaggio di errore (solo http e https-porta 80, con ssl mi segnala un errore di connessione), mentre in locale:
Warning: fsockopen() [function.fsockopen]: unable to connect to http://www.paypal.com:80 (Unable to find the socket transport "http" - did you forget to enable it when you configured PHP?)
Bisogna modificare il php.ini del server? (cosa possibile perkè è il server di un mio amico) E' la prima cosa che ho pensato dato che in locale non mi segnala nessun errore.

Vi ringrazio in anticipo!

cionci
08-01-2009, 00:32
fsockopen per funzionare deve essere abilitata da php.ini:

allow_url_fopen = On

Nella maggior parte dei servizi di hosting questa opzione è disattivata e non è attivabile per questioni di sicurezza e di traffico.

Ginos
08-01-2009, 09:01
grazie mille cionci...faccio due test e ti farò sapere.
Per quanto riguarda invece lo script che ti fornisce paypal che è configurato per una connessione in ssl? Il discorso è diverso?

Ginos
08-01-2009, 09:24
allora...questa la configurazione del php.ini del server in questione:

; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
allow_url_fopen = On

; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
allow_url_include = Off

allow_url_fopen già era impostato su On.

Il php installato è il 5.2.5
Bisogna impostare anche allow_url_include su ON?

cionci
08-01-2009, 09:34
Mmmhhh...controlla se php è in safe mode: http://it.php.net/manual/it/features.safe-mode.php
Controlla che sia attiva l'estensione php_sockets (sinceramente non so se c'è sempre, sono rimasto un po' indietro)

Ginos
08-01-2009, 10:12
php_socket.dll è presente nel php.ini...questa la riga:
;extension=php_sockets.dll (ho un dubbio sul ; prima dell'estensione...credo sia commentato)

questo invece il safe_mode:
;
; Safe Mode
;
safe_mode = Off

safe_mode_gid = Off

safe_mode_include_dir =

safe_mode_exec_dir =

safe_mode_allowed_env_vars = PHP_

safe_mode_protected_env_vars = LD_LIBRARY_PATH

;open_basedir =

disable_functions =

disable_classes =

Credo sia disattivato

p.s. una volta apportate le modifiche devo riavviare iis? Probabilmente il php gira sul software di MS invece che su apache

cionci
08-01-2009, 10:18
;extension=php_sockets.dll

Togli il punto e virgola, era commentata la linea.
Ci sta che giri su IIS, comunque sì, riavvia il servizio.

Ginos
08-01-2009, 11:05
commento rimosso da ;extension=php_sockets.dll (la dll è presente nella cartella ext di php) Riavviato iis...nulla di nuovo.

Ho provato a impostare anche allow_url_include = Off su On riavviato nuovamente iis e nulla ancora

Non capisco dove possa essere il problema!
safe_mode = Off
allow_url_fopen = On
allow_url_include = On
extension=php_sockets.dll (decommentata)
Riavviato iis ma mi compare sempre il messaggio di errore:
Warning: fsockopen() [function.fsockopen]: unable to connect to http://www.paypal.com:80

Per sicurezza ho creato un file con echo phpinfo(); in modo da verificare l'esatta directory nella quale risiede il file di configurazione... (come da default in C:\windows)
Mi consigli di attivare anche l'estensione: ;extension=php_openssl.dll in modo da tentare di far girare lo script originale con fsockopen impostato in questo modo: $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

grazie e scusa se ti sto disturbando ma è un problema che dovrei risolvere entro oggi.

cionci
08-01-2009, 11:28
Sei sicuro vero che non ci sia Apache installato ? La pagina php è sulla porta 80 del server http ?

Ginos
08-01-2009, 11:53
Forse hai ragione tu nella cartella di php5 ho trovato php5apache2.dll, php5apache2_2.dll, php5apache2_2_filter.dll, php5apache2_filter.dll ma non ho trovato un file apache.exe.
In + ho trovato anche la directory extras\openssl\ (può servire per un eventuale connessione in ssl?)
Non ho controllato accuratamente perkè di solito utilizza iis per questo genere di cose :doh:
Potresti dirmi come posso riavviare apache? da riga di comando?
E' un bel pò che non lo riavvio manualmente dato che utilizzo software che installato il tutto con un click.

grazie mille

Ginos
08-01-2009, 12:03
dietro front...ho contattato il mio amico (che non riuscivo a contattare da un bel pezzo) e mi ha detto che php gira sotto iis in più mi ha detto che la porta che https utilizza è la 443.
Ora non so...nelle specifiche paypal mi veniva segnalata la porta 80 per questo tipo di connessione.
Cmq per concludere bisogna configurarala direttamente su iis

Che ne pensi cionci?

cionci
08-01-2009, 12:26
Non ti funziona così:
http://www.paypal.com:80
e non ti funziona così:
ssl://www.paypal.com:443
Non c'entra la configurazione su IIS di SSL. Non ti serve che paypal si connetta tramite SSL al tuo server. Qui il problema è: o php non percepisce le variazioni nella configurazione o non hai riavviato il servizio giusto o la fsockopen non riesce a raggiungere l'host di paypal.

Apache è un servizio come IIS. Lo devi trovare fra i servizi.

Se puoi, riavvia la macchina.

Ginos
08-01-2009, 17:10
...dopo aver sbattuto la testa tutto il pomeriggio sono riuscito a farlo funzionare con questa configurazione però:
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);

Ho sostituto la prima impostazione della funzione fsockopen:
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

Avevo preso e adattato il codice fornito da paypal per le mie esigenze ma non avevo notato che l'indirizzo da puntare era www.sandbox.paypal.com
Fatto vari test e le righe del database mi vengono aggiornate senza problemi.
Ho provato di volta in volta, per scrupolo, ad anteporre http://(su porta 80), https://(su porta 443) e ssl://(su porta 443) alla nuova impostazione e come per magia :) mi compare il famoso errore warning: etc..etc... senza nulla invece non da problemi!
Ora mi domando...e quando dovrò pubblicare la versione definitiva e far puntare la funzione fsockopen a www.paypal.com?
IIS l'ho riavviato correttamente e fortunatamente la funzione punta correttamente all'url.
Credo quindi sia solo un problema di configurazione del server...
Grazie mille cionci per la tua disponibilità!
Appena interfaccerò definitivamente il mio sistema a paypal ti farò sapere come è andata...speriamo bene altrimenti avrò bisogno di un'altra mano ;)

p.s. cmq se hai altri consigli da darmi resto in ascolto sulla porta 80 (per tutti ;))

cionci
08-01-2009, 17:51
Azz, non mi ricordavo bene come funzionava fsockopen.
Comunque metti www.paypal.com e porta 80 o 443 a seconda che tu voglia usare SSL o la connessione normale.