Antworten auf deine Fragen:
Neues Thema erstellen

Problem mit PayPal - Session ID wird verändert

MrManko

Nicht mehr ganz neu hier

Hi @ all,

ich mal wieder und wie könnte es anders sein habe ich mal wieder ein Problem - womit ? Weiß ich selber noch nicht so genau. Es könnte mein PHP Skript sein oder an PayPal liegen ... da ich den Fehler nicht finde, bin ich auf eure Hilfe angewiesen.

Es kann natürlich sein, dass ich mal wieder den Wald vor lauter Bäumen nicht sehe.

Hier jetzt erstmal die Klasse, mit der ich die Verbindung zu PayPal herstelle. Mein Problem und meine bisherigen Erkenntnisse folgen gleich:

PHP:
<?php
    class paypal extends paymentInterface {
        
        private $api_username = '***********';
        private $api_password = '***********';
        private $api_signature = '***********';
        private $api_endpoint = 'https://api-3t.sandbox.paypal.com/nvp';
        private $checkoutSite = 'https://localhost/shop/checkout.php?action=show&payment=paypal';
        private $ReturnUrl = 'https://localhost/shop/checkout.php?payment=paypal&action=do';
        private $CancelUrl = 'https://localhost/cart';
        private $CurrencyCodeType = 'EUR';
        private $version = '53.0';
        private $thank_u_page = 'http://localhost/shop/thanks.php';
        protected $db;
        protected $cart;
        
        public function __construct() {
            require_once 'classes/database/dbFactory.class.php';
            $this->db = DBInterface::getInstance('mysql');
            $this->db->connect('localhost','root','','shop');
            
            require_once 'classes/cart.class.php';
            $this->cart = new Cart;
            $arr = $this->cart->return_cart();
            
            if($_GET['action'] != 'checkout' && $_GET['action'] != 'show') {
                if(empty($_REQUEST['token'])) { //Kunde war noch nicht auf der Paypal Seite gewesen, mit Adresse weiterleiten!
                    $this->SetExpressCheckout($this->cart->get_total_price());
                } else { //Kunde war auf der Paypal Seite gewesen und hat seine Einstellungen vorgenommen, Bestätigungsseite anzeigen!
                    $this->GetExpressCheckoutDetails();
                }
            }
        }
        
        public function return_address() {
            $_SESSION['payment']['p_name'] = "PayPal";
            return $_SESSION['payment'];
        }
        
        public function do_checkout($shipping_costs) { //Für Paypal hier DoExpressCheckoutPayment ausführen
            $token = urlencode($_SESSION['res']['token']);
            $paymentAmount = urlencode ($_SESSION['res']['AMT']);
            $currCodeType = urlencode($_SESSION['res']['CURRENCYCODE']);
            $payerID = urlencode($_SESSION['res']['PAYERID']);
            $serverName = urlencode($_SERVER['SERVER_NAME']);
            
            $paymentAmount += $shipping_costs;
            urlencode($paymentAmount);
            
            $nvpstr = '&TOKEN='.$token.'&PAYERID='.$payerID.'&AMT='.$paymentAmount.'&CURRENCYCODE='.$currCodeType.'&IPADDRESS='.$serverName.'&PAYMENTACTION=Sale';
            $res = $this->cmd('DoExpressCheckoutPayment', $nvpstr);
            
            $ack = strtoupper($res['ACK']);
            
            if($ack == 'SUCCESS') {
                header('Location: '.$this->thank_u_page);
            } else {
                $location = "APIError.php?do_checkout";
                header("Location: $location");
            }
        }
        
        private function SetExpressCheckout($paymentAmount) {
            $nvpstr = "&Amt=".urlencode($paymentAmount)."&ReturnUrl=".$this->ReturnUrl."&CANCELURL=".$this->CancelUrl ."&CURRENCYCODE=".$this->CurrencyCodeType;
            
            $add = $this->return_address();
            
            $nvpstr .= "&SHIPTONAME=".urlencode($add['del_vname'])." ".urlencode($add['del_name'])."&SHIPTOSTREET=".urlencode($add['del_str'])."&SHIPTOCITY=".urlencode($add['del_ort'])."&SHIPTOZIP=".urlencode($add['del_plz'])."&SHIPTOCOUNTRYCODE=DE&SHIPTOCOUNTRYNAME=Deutschland";
            
            $nvpstr .= "&CUSTOM=".session_id();
            
            $res = $this->cmd('SetExpressCheckout', $nvpstr);                                    
            
            $ack = strtoupper($res['ACK']);
            
            if($ack == 'SUCCESS') {
                header("Location: https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=".$res['TOKEN']);
            } else {
                $location = "APIError.php?SetExpressCheckout";
                header("Location: $location");
            }
        }
        
        private function GetExpressCheckoutDetails() {
            $token = urlencode($_REQUEST['token']);
            $nvpstr="&TOKEN=".$token;
            
            $res = $this->cmd('GetExpressCheckoutDetails', $nvpstr);
            $ack = strtoupper($res['ACK']);
            $_SESSION['res'] = $res;
            $_SESSION['res']['token'] = $token;
            
            echo "<pre>";
            print_r($_SESSION);
            echo "</pre>";
            
            echo "<pre>";
            echo session_id(); 
            echo "</pre>";
            
            die();
            
            if($ack == 'SUCCESS') {
                header('Location: '.$this->checkoutSite);
            } else {
                $location = "APIError.php?GetExpressCheckoutDetails";
                header("Location: $location");
            }
        }
        
        private function cmd($method, $nvpstr) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $this->api_endpoint); // Die Url, die aufgerufen wird
            curl_setopt($ch, CURLOPT_VERBOSE, 1); // Ausführliche Informationen
            
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Rückgabe als String
            curl_setopt($ch, CURLOPT_POST, 1); // Als POST Request abschicken
            
            // Den Request zusammensetzen
            $nvpreq = 'METHOD='.urlencode($method).'&VERSION='.$this->version.'&PWD='.urlencode($this->api_password).'&USER='.urlencode($this->api_username).'&SIGNATURE='.urlencode($this->api_signature).$nvpstr; 
            
            curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq); // Den Request als Post Variable bekannt machen
            
            $response = curl_exec($ch); // Request abschicken und eine Antwort vom Server erhalten
            
            // Die Antwort in ein assoziatives Array umwandeln (einfacher zu verarbeiten)
            $nvpResArray = $this->deformatNVP($response);
            
            if(curl_errno($ch)) { // Etwas ist schief gelaufen
                $_SESSION['curl_error_no'] = curl_errno($ch) ;
                $_SESSION['curl_error_msg'] = curl_error($ch);
                $location = "APIError.php";
                header("Location: $location");
            } else { // Alles lief glatt
                curl_close($ch); // Verbindung zum Server schließen
            }
            
            return $nvpResArray;
        }
        
        private function deformatNVP($nvpstr) {
            $rspArray = array(); // Array wird den String zerlegt aufnehmen
            $first = explode("&", $nvpstr); // NVP String an den & Zeichen auftrennen
            
            foreach($first as $value) { // Entstandenes Array durchlaufen und innerhalb jedes & Abschnitts am = Zeichen auftrennen
                $second = explode("=", $value);
                $rspArray[$second[0]] = $second[1]; // Array wird assoziativ befüllt
            }
            
            return $rspArray; // Assoziatives Array zurückgeben
        }
    }
?>
Die Klasse basiert auf dem offizielen SDK von PayPal.

Nun zu dem PRoblem:

Immer, wenn ich PayPal als Zahlungsmethode wähle, dann "vergisst" mein Browser anscheinend die Session ID und dann wird durch den Aufruf von session_start natürlich eine neue ID erzeugt, aber warum verliert der Browser das Cookie mit der PHPSESSID ???

Um das zu überprüfen, habe ich in einen Customvalue meine ID reingeschrieben, bevor ich den Benutzer nach PayPal umleite und diese ID mit der aktuellen ID verglichen und siehe da, sie sind unterschiedlich.

Ist das jetzt ein Problem von PayPal oder ein Problem mit meine Skript??

Ich hoffe ihr habt eine AHnung woran das liegen könnte.

Edit: Ich habe auch mehrere Browser ausprobiert, da ich zuerst dachte, dass die Cookie Verwaltung von Firefox spinnt, aber dem ist nicht so, gleiches Verhalten in Chrome und Internet Explorer

MfG
MrManko
 
Zuletzt bearbeitet:

MrManko

Nicht mehr ganz neu hier

AW: Problem mit PayPal - Session ID wird verändert

Es war mal wieder der Wald vor lauter Bäumen :D

Wie man an dem Skript unschwer erkennen kann leite ich von PayPal auf mein eignes System zurück (man sollte immer seine devoloper Sachen rausnehmen wenn man veröffentlichen will ^^) und dann ist klar, dass der Cookie in den Browsern verloren geht.

Ich denke mal, dass hat mit den Sicherheitszonen zu tun, dass die Browser die Cookies dann in diesem Fall ablehnen und lieber wieder neu setzen.

So, der Thread kann nun geschlossen werden, habe das dumme Problem ja gelöst bekommen ^^

MfG
MrManko
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Keine Mitglieder online.

Statistik des Forums

Themen
118.619
Beiträge
1.538.363
Mitglieder
67.540
Neuestes Mitglied
Alex Weidner
Oben