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:
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
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
}
}
?>
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: