PHP Problema con il richiamo della funzione verifyIPN()

Le magic quotes sono state rimosse e comunque da molto tempo sono state disabilitate di default. Puoi tranquillamente sostituire questa parte di codice come segue:

PHP:
    $req = 'cmd=_notify-validate';
    foreach ($myPost as $key => $value)
        $req .= "&$key=" . urlencode($value);
    
    $ch = curl_init($this->getPaypalUri());
    //...
 

gabb2304

Utente Iron
11 Agosto 2022
5
1
0
5
Sono giorni, settimane che non riesco a risolvere un problema.. Arrivo dritto al punto, ho usato alcuni codici per poter integrare l'ipn di PayPal con il mio sito web, tramite php. Tutto sembra andare liscio tranne il richiamo del risultato della funzione pubblica verifyIPN(), nel file di response.php, la variabile $verified non funziona come dovrebbe, non mi permette nemmeno di entrare dentro l'if per eseguire le operazioni di inserimento nel db, praticamente è come se tornasse un valore "false", quando dovrebbe restituire "true". Spero di essere stato chiaro. Grazie in anticipo!

notify.php
PHP:
public function verifyIPN()
{
        if ( ! count($_POST)) {
            throw new Exception("Missing POST Data");
        }

        $raw_post_data = file_get_contents('php://input');
        $raw_post_array = explode('&', $raw_post_data);
        $myPost = array();
        foreach ($raw_post_array as $keyval) {
            $keyval = explode('=', $keyval);
            if (count($keyval) == 2) {
                // Since we do not want the plus in the datetime string to be encoded to a space, we manually encode it.
                if ($keyval[0] === 'payment_date') {
                    if (substr_count($keyval[1], '+') === 1) {
                        $keyval[1] = str_replace('+', '%2B', $keyval[1]);
                    }
                }
                $myPost[$keyval[0]] = urldecode($keyval[1]);
            }
        }

        // Build the body of the verification post request, adding the _notify-validate command.
        $req = 'cmd=_notify-validate';
        $get_magic_quotes_exists = false;
        if (function_exists('get_magic_quotes_gpc')) {
            $get_magic_quotes_exists = true;
        }
        foreach ($myPost as $key => $value) {
            if ($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
                $value = urlencode(stripslashes($value));
            } else {
                $value = urlencode($value);
            }
            $req .= "&$key=$value";
        }

        // Post the data back to PayPal, using curl. Throw exceptions if errors occur.
        $ch = curl_init($this->getPaypalUri());
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
        curl_setopt($ch, CURLOPT_SSLVERSION, 6);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

        // This is often required if the server is missing a global cert bundle, or is using an outdated one.
        if ($this->use_local_certs) {
            curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . "/cert/cacert.pem");
        }
        curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'User-Agent: PHP-IPN-Verification-Script',
            'Connection: Close',
        ));
        $res = curl_exec($ch);
        if ( ! ($res)) {
            $errno = curl_errno($ch);
            $errstr = curl_error($ch);
            curl_close($ch);
            throw new Exception("cURL error: [$errno] $errstr");
        }

        $info = curl_getinfo($ch);
        $http_code = $info['http_code'];
        if ($http_code != 200) {
            throw new Exception("PayPal responded with http code $http_code");
        }

        curl_close($ch);

        // Check if PayPal verifies the IPN data, and if so, return true.
        if ($res == self::VALID) {
            return true;
        } else {
            return false;
        }
    }


response.php

PHP:
<?php
require('notify.php');

use PaypalIPN;

$ipn = new PaypalIPN();

$ipn->useSandbox();

$verified = $ipn->verifyIPN();

if ($verified) {

}
 
Usa un debugger o almeno visualizza in qualche modo il contenuto delle variabili durante gli step intermedi (es. var_dump($res); dopo curl_close).

Assurdo di come questo codice sia davvero quello ufficiale sul loro repo.
 
Usa un debugger o almeno visualizza in qualche modo il contenuto delle variabili durante gli step intermedi (es. var_dump($res); dopo curl_close).

Assurdo di come questo codice sia davvero quello ufficiale sul loro repo.
Grazie intanto per la risposta.
Ho già utilizzato il link da te citato per ricavare i due file "notify.php" e "response.php", che sarebbe il "PaypalIPN.php" e "example_usage.php" quelli riportati su github come esempi.
Ho appena utilizzato il var_dump subito dopo il curl_close ma non ho risposta, pagina vuota. Non so se può tornare utlile ma, fuori dalla classe e dalla funzione, il var_dump($res) mi da a schermo "NULL".
 
A questo punto devi usare un debugger, un ipotesi potrebbe essere che viene lanciata un eccezione e non essendo mai catturata fa uscire lo script: in base al livello di ERROR_REPORTING potrebbe non visualizzare alcun errore. In ogni caso ti consiglio di usare qualcosa come xdebug. Se proprio non puoi metti tutto dentro un try/catch e visualizza il contenuto dell'eccezione.
 
A questo punto devi usare un debugger, un ipotesi potrebbe essere che viene lanciata un eccezione e non essendo mai catturata fa uscire lo script: in base al livello di ERROR_REPORTING potrebbe non visualizzare alcun errore. In ogni caso ti consiglio di usare qualcosa come xdebug. Se proprio non puoi metti tutto dentro un try/catch e visualizza il contenuto dell'eccezione.
Ho appena provato il try catch ma non mi risulta nessuna eccezione.
Stasera o domani provo a usare il debugger da te citato e vedo un po.., ti aggiorno
 
A questo punto devi usare un debugger, un ipotesi potrebbe essere che viene lanciata un eccezione e non essendo mai catturata fa uscire lo script: in base al livello di ERROR_REPORTING potrebbe non visualizzare alcun errore. In ogni caso ti consiglio di usare qualcosa come xdebug. Se proprio non puoi metti tutto dentro un try/catch e visualizza il contenuto dell'eccezione.
Ho appena fatto il debug, questo è il risultato del file notify.php
 

Allegati

  • 1.PNG
    1.PNG
    90.6 KB · Visualizzazioni: 9
Le magic quotes sono state rimosse e comunque da molto tempo sono state disabilitate di default. Puoi tranquillamente sostituire questa parte di codice come segue:

PHP:
    $req = 'cmd=_notify-validate';
    foreach ($myPost as $key => $value)
        $req .= "&$key=" . urlencode($value);
   
    $ch = curl_init($this->getPaypalUri());
    //...
Scusami per l'attesa, ho avuto problemi di natura diversa inerenti al sito.
Ho rimosso le magic quotes e aggiornato il file come da te consigliato ma, senza risolvere il problema principale purtroppo.
Ci sono vie d'uscita?
 
Scusami per l'attesa, ho avuto problemi di natura diversa inerenti al sito.
Ho rimosso le magic quotes e aggiornato il file come da te consigliato ma, senza risolvere il problema principale purtroppo.
Ci sono vie d'uscita?

Io non ho modo di eseguire quello script in locale, mancano tutta una serie di componenti. Se vuoi risolvere devi mettere un breakpoint e debuggare, cerca per valori inaspettati e controlla input e risposte di paypal. La maggior parte degli IDE per PHP supportano l'interfaccia con xdebug, significa che una volta configurato puoi vedere direttamente da editor di codice quello che succede uno step alla volta, avendo a vista tutte le variabili del contesto e tante altre informazioni utili a trovare la soluzione al problema.