paypal und Shop- Lieferadresse

XYZ

Sehr aktives Mitglied
21. September 2011
2.541
10
AW: paypal und Shop- Lieferadresse

Man beachte ... die osc Beiträge sind von 2008 / 2009 ... Aktualität ????

Ja, aber da die Variable ja bei JTL noch drinne steht, ist das erstmal ein wichtiger Hinweis, auch wenn der Beitrag von 2008/2009 stammt.


Edit: Bei Bestellung mit eigenem Testaccount und Fantasie-Lieferadresse scheint die Zahlung per Paypal nach Entfernung der Override-Variable zu funktionieren, zumindest kommt man bis zum "Zahlen" Button, ausführen möchte ich die Zahlung jetzt jedoch nicht.
 

XYZ

Sehr aktives Mitglied
21. September 2011
2.541
10
AW: paypal und Shop- Lieferadresse

wow PayPal-Support fast so fix wie JTL-Support 🙂

Erste Antwort ... doch den Parameter gibt es noch ... siehe

Ähm...vielleicht ist die Paypal-Seite aber nicht so aktuell wie der JTL-Support 😉.


Habe jetzt konkret wegen der Fehlermeldung nachgefragt

Super, da bin ich ja mal gespannt.
 

ag-websolutions.de

Sehr aktives Mitglied
29. Dezember 2009
14.548
233
AW: paypal und Shop- Lieferadresse

Sehr geehrter Herr Rütten,

Vielen Dank für Ihre Antwort.

Um zu sehen warum sie diese meldung ewrhalten müsste ich das ganze selbst im Shop testen. Könnten sie mir hierzu bitte die URL ihres Shops zukommen lassen, sowie die genauen Schritte um das Problem zu reproduzieren.

Vielen Dank im Vorraus.

Mit freundlichen Grüßen

Volker
PayPal MTS

Da ich

- das Problem nicht habe
- den Adressblock in der paypal-class nicht wieder rein genommen habe

gibt es einen Shop bei dem PayPal das testen kann????????????
 

crazy_mary

Gut bekanntes Mitglied
15. Dezember 2010
165
0
AW: paypal und Shop- Lieferadresse

Oh, na das sind ja inzwischen schon ganz gute Neuigkeiten!
Wir haben uns auch nicht getraut, den Code wieder in Aktion zu versetzen, jedenfalls nicht im Weihnachtsgeschäft. Da sind abgebrochene Paypalzahlungen oder Mails von Kunden, die nicht durchkommen nicht so toll und rauben zu viel Zeit, die wir momentan überhaupt nicht haben.
Im Januar wäre ich gerne bereit mich da zur Verfügung zu stellen.
 

XYZ

Sehr aktives Mitglied
21. September 2011
2.541
10
AW: paypal und Shop- Lieferadresse

Code:
       /* 
         'address1'=> $_SESSION['Lieferadresse']->cStrasse,
         'address2'=> $_SESSION['Lieferadresse']->cAdressZusatz,
         'city'=> $_SESSION['Lieferadresse']->cOrt,
         'country'=> $cCountryISO,
         'first_name'=> $_SESSION['Lieferadresse']->cVorname,
         'last_name'=> $_SESSION['Lieferadresse']->cNachname,
         'zip'=> $_SESSION['Lieferadresse']->cPLZ,
         'tax_cart' => number_format($order->fSteuern, 2, '.', ','),
         'address_override'=> '1',
         */

Ich will mal das bisherige zusammenfassen:

- Ziel soll sein, dass wenn ein Kunde eine abweichende Lieferanschrift angegeben hat, dass diese mit Zahlungsprozess via PayPal an PayPal übertragen wird und dort eine vorhandene Adresse überschriebt

- PayPal sieht diese Möglichkeit durch die Bereitstellung von Variablen vor

- im Shop-Standard wird die Adresse nicht nach PayPal übergeben, da in der Paypal-Zahlungs-Klasse der entsprechende Code-Block auskommentiert ist

- kommentiert man diesen wieder ein, dann wird ... wenn aus dem bestellablauf heraus unmittelbar nach Paypal weiter geleitet wird,
die Lieferadresse korrekt an PayPal übergeben und überschreibt eine dort vorhandene Adresse

- vollzieht der Kunde aber nicht sofort die Paypal-Zahlung und ruft zu einem späteren zeitpunkt aus seinem Shop-Kundenkonto via eingeblendetem Button die PayPal-Seite auf, so erhält man eine Fehlermeldung

Bis hierhin irgendwelche Anmerkungen??

Bis hierhin alles korrekt *Smiley* (<- Das Forum macht ja keine mehr). Die spätere Zahlung funktioniert nur ohne aktivierten Override, die im Shop eingegebene Lieferadresse wird dann aber nicht an Paypal übertragen.

Das Problem liegt nach meiner ersten Einschätzung daran, dass in dem Code-Block auf die Session-Variablen zurück gegriffen wird. Diese stehen zwar noch zur Verfügung, wenn der ganze Ablauf unmittelbar im Bestellablauf erfolgt, aber nicht mehr, wenn der Kunde zu einem späteren zeitpunkt (mit einer neuen Session) aus seinem Kundenkonto heraus die Zahlung vollziehen möchte

Die im Code-Block angesprochenen Session-Variablen sind dann einfach nicht mehr vorhanden.

Man müsste daher das ganze dahingehend umschreiben, dass wenn die Session-Variablen nicht mehr zur Verfügung stehen, nachgesehen wird, ob denn in der Bestellung eine abweichende Lieferadresse gespeichert wurde...und wenn ja, dann aus dieser heraus die Daten nehmen.

Man müsste aber auch noch analysieren, ob denn ...bei unmittelbarer PP-Zahlung aus dem Bestellablauf heraus ... die Session-Variablen zur Verfügung stehen, wenn der Kunde NICHT eine abweichende Lieferanschrift angegeben hat. Wenn nämlich die Session-Variablen dann nicht zur Verfügung stehen, dann müsste es auch aus dem Bestellablauf heraus zu einem Fehler (analog dem aus dem Kundenkonto heraus) kommen.

So wird es sein, aber mir fehlt das Fachwissen, um dies zu bestätigen, hört sich für mich als Laien aber plausibel an.
 

ag-websolutions.de

Sehr aktives Mitglied
29. Dezember 2009
14.548
233
AW: paypal und Shop- Lieferadresse

OK ... ich denke ich habs (jedenfalls funktionierten meine Tests fehlerfrei)

1. der bsiherige Code-Block muss wieder auskommentiert werden
2. dann direkt darunter folgenden Code einfügen

Code:
      if ( isset($order->Lieferadresse->kLieferadresse) && ($order->Lieferadresse->kLieferadresse > 0) ) {   //Kunde hat eine abweichende Lieferanschrift angegeben
      
        $pp_address_override = array (
                'address1'=> $order->Lieferadresse->cStrasse,
                'address2'=> $order->Lieferadresse->cAdressZusatz,
                'city'=> $order->Lieferadresse->cOrt,
                'first_name'=> $order->Lieferadresse->cVorname,
                'last_name'=> $order->Lieferadresse->cNachname,
                'zip'=> $order->Lieferadresse->cPLZ
        );
        
      } else {
      
        $pp_address_override = array (
                'address1'=> $order->oKunde->cStrasse,
                'address2'=> $order->oKunde->cAdressZusatz,
                'city'=> $order->oKunde->cOrt,
                'first_name'=> $order->oKunde->cVorname,
                'last_name'=> $order->oKunde->cNachname,
                'zip'=> $order->oKunde->cPLZ
        );
      }

      $fields = array (
         'cmd'=> '_cart',
         'business'=> $Einstellungen['zahlungsarten']['zahlungsart_paypal_empfaengermail'],
         'currency_code'=> $order->Waehrung->cISO,
         
         
         'address1'=> $pp_address_override['address1'],
         'address2'=> $pp_address_override['address2'],
         'city'=> $pp_address_override['city'],
         'country'=> $cCountryISO,
         'first_name'=> $pp_address_override['first_name'],
         'last_name'=> $pp_address_override['last_name'],
         'zip'=> $pp_address_override['zip'],
         'tax_cart' => number_format($order->fSteuern, 2, '.', ','),
         'address_override'=> '1',
         
         
         // Keine Angabe von Steuern (Bruttowerte werden übergeben)
         'tax_cart' => '0.00',
         
         'invoice'=> $order->cBestellNr,
         'email'=> $order->oKunde->cMail,
         'upload'=> '1',
         'cancel_return'=> URL_SHOP,
         'return'=> URL_SHOP . "/bestellabschluss.php?i=" . $hash,
         'custom'=> $hash,
         'lc' => strtoupper($cISOSprache),
         'notify_url'=> $this->getNotificationURL($hash)
      );

Hintergrund:

Es wird jetzt geprüft, ob in der Bestellung eine abweichende Lieferanschrift angegeben ist. Das $order-Object steht sowohl unmittelbar im Bestellablauf, wie auch bei einer späteren Zahlung aus dem Kundenkonto heraus zur Verfügung.

Ist eine abweichende Lieferanschrift angegeben, dann werden die entsprechenden PayPal-Felder mit den Daten aus dieser Lieferanschrift gefüllt.

Ist keine(!) abweichende Lieferanschrift angegeben, dann werden die PP-Felder mit den Kundendaten gefüllt.

Es finde also IMMER ein override der Adresse bei PayPal statt; entweder mit der Lieferanschrift, oder aber mit der Kundenanschrift.

Wie gesagt ... meine Tests waren alle erfolgreich; aber aufgrund der Kürze der Zeit konnte ich nicht alle Eventualitäten voll durchtesten ... daher ... OHNE Garantie 😉
 

XYZ

Sehr aktives Mitglied
21. September 2011
2.541
10
AW: paypal und Shop- Lieferadresse

Hmm funzt leider nicht, bei Auswahl der Zahlungsarten bleibt dann einfach die Seite weiß...
 

ag-websolutions.de

Sehr aktives Mitglied
29. Dezember 2009
14.548
233
AW: paypal und Shop- Lieferadresse

Ich habe es jetzt noch mal in verschiedenen Testshops durchgetestet....mit Kundenkonto....ohne Kundenkonto....Weiterleitung zu PayPal unmittelbar im Bestellablauf ... Aufruf von PayPal aus dem Kundenkonto heraus.....egal wie ich es mache....ich komme immer sauber zur PayPal-Seite und die dortige Lieferanschrift entspricht der Anschrift, an die ich die Bestellung senden würde

- wurde der Code sauber übernommen und eingebaut?
- wurde Datei up-/download im binären FTP-Übertragungsmodus gemacht?

was mir in dem Zusammenhang nur aufgefallen ist, wo aber der Shop nichts für kann, was man aber auchnicht abfangen kann

- Kunde bestellt OHNE Kundenkonto und nutzt PayPal
- auf der PayPal-Seite bricht er den Zahlungsvorgang ab und kehrt zurück in den Shop
- die Bestellung ist in diesem Moment schon gespeichert, da aber der Kunde kein Kundenkonto hat, kann er eine erneute Zahlung nicht aus dem Shop heraus durchführen
- er muss quasi "manuell" die PayPal-Seite aufrufen...sich einloggen...und als Zahlungsempfänger die PayPal-Adresse vom Shop eintragen (steht ja auch so in der Bestellbestätigungsmail).

In diesem Szenario weiß PayPal aber nichts von einer eventuell abweichenden Lieferadresse, da ja der PayPal-Aufruf manuell erfolgte (erfolgen muss) ... ergo geht bei einer derartigen Konstellation der Verkäuferschutz flöten, wenn die Lieferung an eine andere Anschrift erfolgt
 

XYZ

Sehr aktives Mitglied
21. September 2011
2.541
10
AW: paypal und Shop- Lieferadresse

Hmm, scheint sich mit BillSAFE zu beissen:

Warning: include_once(/var/www/XYZ/html/includes/modules/Paymentmethod.class.php) [function.include-once]: failed to open stream: No such file or directory in /var/www/XYZ/html/includes/plugins/rm_billsafe/version/100/paymentmethod/Billsafe/billsafe.class.php on line 13

Warning: include_once() [function.include]: Failed opening '/var/www/XYZ/html/includes/modules/Paymentmethod.class.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear:/var/www/XYZ/html/includes/libs/phpQuery/phpQuery/:/var/www/XYZ/html/includes/libs/phpQuery/phpQuery/plugins/') in /var/www/web104/html/includes/plugins/rm_billsafe/version/100/paymentmethod/Billsafe/billsafe.class.php on line 13

Parse error: syntax error, unexpected T_IF, expecting ')' in /var/www/XYZ/html/includes/modules/paypal/PayPal.class.php on line 72

bzw. irgendwo fehlt nen /if?
 

ag-websolutions.de

Sehr aktives Mitglied
29. Dezember 2009
14.548
233
AW: paypal und Shop- Lieferadresse

zeig mal bitte deine PayPal-Class-File ... bitte in code-tags (oder mail sie mir mal zu)
 

XYZ

Sehr aktives Mitglied
21. September 2011
2.541
10
AW: paypal und Shop- Lieferadresse

Ich glaube Deine Datei ist irgendwie anders aufgebaut, habe gerade gesehen, das wenn ich Deinen Code einfüge, vieles doppelt ist. Hier ist die Originaldatei ohne Änderungen:
Code:
<?php
include_once (PFAD_ROOT.PFAD_INCLUDES_MODULES.'PaymentMethod.class.php');

// Mode
define("PP_MODE", 0); // 1 = Test / 0 = Live

// Debug
define("D_MODE", 0); // 1 = An / 0 = Aus
define("D_PFAD", PFAD_ROOT . "jtllogs/paypal.log");

// Sandbox
define("URL_TEST", "https://www.sandbox.paypal.com/cgi-bin/webscr");
define("URLVALID_TEST", "ssl://www.sandbox.paypal.com");

// Live
define("URL_LIVE", "https://www.paypal.com/cgi-bin/webscr");
define("URLVALID_LIVE", "ssl://www.paypal.com");

class PayPal extends PaymentMethod
{   
   var $oPosition_arr = array();
   function init()
   {
      $this->name = 'PayPal';
      $this->caption = 'PayPal';
   }
   
   function preparePaymentProcess($order)
   {
      global $Einstellungen, $DB, $smarty;

      $hash = $this->generateHash($order);

      $cISOSprache = "";
      $cISOSprache_arr = array("FR", "ES", "IT", "DE", "CN", "AU", "EN");
      
      if(strlen($_SESSION['cISOSprache']) > 0)
      {
         $cISOSprache = convertISO2ISO639($_SESSION['cISOSprache']);
      }
      else
      {
         $oSprache = $GLOBALS['DB']->executeQuery("SELECT kSprache, cISO FROM tsprache WHERE cShopStandard = 'Y'", 1);
         if($oSprache->kSprache > 0)
            $cISOSprache = convertISO2ISO639($oSprache->cISO);
      }
      
      if(!in_array(strtoupper($cISOSprache), $cISOSprache_arr))
         $cISOSprache = "DE";
         
      $cCountryISO = $order->oKunde->cLand;
      if (strlen($cCountryISO) > 2)
         $cCountryISO = landISO($cCountryISO);

      $fields = array (
         'cmd'=> '_cart',
         'business'=> $Einstellungen['zahlungsarten']['zahlungsart_paypal_empfaengermail'],
         'currency_code'=> $order->Waehrung->cISO,
         
         /*
         'address1'=> $_SESSION['Lieferadresse']->cStrasse,
         'address2'=> $_SESSION['Lieferadresse']->cAdressZusatz,
         'city'=> $_SESSION['Lieferadresse']->cOrt,
         'country'=> $cCountryISO,
         'first_name'=> $_SESSION['Lieferadresse']->cVorname,
         'last_name'=> $_SESSION['Lieferadresse']->cNachname,
         'zip'=> $_SESSION['Lieferadresse']->cPLZ,
         'tax_cart' => number_format($order->fSteuern, 2, '.', ','),
         'address_override'=> '1',
         */
         
         // Keine Angabe von Steuern (Bruttowerte werden übergeben)
         'tax_cart' => '0.00',
         
         'invoice'=> $order->cBestellNr,
         'email'=> $order->oKunde->cMail,
         'upload'=> '1',
         'cancel_return'=> URL_SHOP,
         'return'=> URL_SHOP . "/bestellabschluss.php?i=" . $hash,
         'custom'=> $hash,
         'lc' => strtoupper($cISOSprache),
         'notify_url'=> $this->getNotificationURL($hash)
      );
      
      /*
      $cNeedState_arr = array("US", "CA");
      if (in_array(strtoupper($cCountryISO), $cNeedState_arr))
         $fields['state'] = $_SESSION['Lieferadresse']->cBundesland;
      */
      
      $idx = 1;
      $fDiscountCart = 0;
      
      if ($order->fGuthaben != 0)
      {
         if ($order->fGuthaben < 0)
            $order->fGuthaben *= -1;
      
         $fDiscountCart += $order->fGuthaben;
      }
      
      foreach ($order->Positionen as $oPosition)
      {
         if ($oPosition->nPosTyp == C_WARENKORBPOS_TYP_KUPON || $oPosition->nPosTyp == C_WARENKORBPOS_TYP_GUTSCHEIN || $oPosition->nPosTyp == C_WARENKORBPOS_TYP_NEUKUNDENKUPON || $oPosition->fPreis < 0)
         {
            $fDiscount = berechneBrutto($oPosition->fPreis * $order->Waehrung->fFaktor, $oPosition->fMwSt);
            if ($fDiscount < 0)
               $fDiscount *= -1;
            
            $fDiscountCart += $fDiscount;
         }
         elseif ($oPosition->nPosTyp != C_WARENKORBPOS_TYP_VERSANDPOS && $oPosition->nPosTyp != C_WARENKORBPOS_TYP_VERPACKUNG && $oPosition->nPosTyp != C_WARENKORBPOS_TYP_VERSAND_ARTIKELABHAENGIG)
         {

        if(intval($oPosition->nAnzahl) != $oPosition->nAnzahl) {
            $fields['item_name_' . $idx] = $oPosition->cName.' ('.str_replace('.', ',',$oPosition->nAnzahl).' '.$oPosition->cEinheit.')';
            $fields['quantity_' . $idx] = 1;
            $fields['amount_' . $idx] = round(berechneBrutto($oPosition->fPreis * $order->Waehrung->fFaktor, $oPosition->fMwSt)*$oPosition->nAnzahl, 2);

        } else {
            $fields['item_name_' . $idx] = $oPosition->cName;
            $fields['quantity_' . $idx] = $oPosition->nAnzahl;
            $fields['amount_' . $idx] = round(berechneBrutto($oPosition->fPreis * $order->Waehrung->fFaktor, $oPosition->fMwSt), 2);

        }
            
            if ($oPosition->Artikel)
               $fields['item_number_' . $idx] = $oPosition->Artikel->cArtNr;

            if ($idx == 1)
               $fields['shipping_' . $idx] = round($order->fVersandKundenwaehrung, 2);
               
            $idx++;
         }
      }
      
      if ($fDiscountCart > 0)
         $fields['discount_amount_cart'] = round($fDiscountCart, 2);

      $smarty->assign('fields', $fields);
      $smarty->assign('url', PP_MODE == 1 ? URL_TEST : URL_LIVE);
   }

   function handleNotification($order, $paymentHash, $args)
   {      
      if($this->verifyNotification($order, $paymentHash, $args))
      {
            $zahlungsid = $GLOBALS['DB']->executeQuery("select * from tzahlungsid where cId=\"".$args['custom']."\"",1);
            
            if(D_MODE == 1)
                writeLog(D_PFAD, "kBestellung: " . $zahlungsid->kBestellung, 1);
            
         $b = $GLOBALS['DB']->executeQuery("select kKunde from tbestellung where kBestellung=".$zahlungsid->kBestellung,1);
         $kunde = new Kunde($b->kKunde);
         $Sprache = $GLOBALS["DB"]->executeQuery("select cISO from tsprache where kSprache=".$kunde->kSprache,1);
         if (!$Sprache)
            $Sprache = $GLOBALS["DB"]->executeQuery("select cISO from tsprache where cShopStandard=\"Y\"",1);
         
         $bestellung = new Bestellung($zahlungsid->kBestellung);
         $bestellung->fuelleBestellung(0);
         if ($bestellung->Waehrung->cISO!=$_POST['mc_currency'])
         {
                if(D_MODE == 1)
                    writeLog(D_PFAD, "Falsche Waehrung: " . $bestellung->Waehrung->cISO . " != " . $_POST['mc_currency'], 1);
            die('0');
         }
         
         //zahlung setzen
         $GLOBALS['DB']->executeQuery("update tbestellung set 
                                 dBezahltDatum=now(), 
                                 cStatus=\"".BESTELLUNG_STATUS_BEZAHLT."\" where kBestellung=".intval($bestellung->kBestellung),4);

         unset($bestellung);
         $bestellung = new Bestellung($zahlungsid->kBestellung);
         $bestellung->fuelleBestellung(0);

         // process payment
         $paymentDateTmp=strtotime($_POST['payment_date']);
         $zahlungseingang->kBestellung = $bestellung->kBestellung;
         $zahlungseingang->cZahlungsanbieter = "PayPal";
         $zahlungseingang->fBetrag = $_POST['mc_gross'];
         $zahlungseingang->fZahlungsgebuehr = $_POST['payment_fee'];
         $zahlungseingang->cISO = $_POST['mc_currency'];
         $zahlungseingang->cEmpfaenger = $_POST['receiver_email'];
         $zahlungseingang->cZahler = $_POST['payer_email'];
         $zahlungseingang->cAbgeholt = 'N';
         $zahlungseingang->cHinweis = $_POST['txn_id'];
         $zahlungseingang->dZeit = strftime('%Y-%m-%d %H:%M:%S',$paymentDateTmp);
         
         $GLOBALS['DB']->insertRow('tzahlungseingang',$zahlungseingang);
         
         //mail
         $obj->tkunde = $kunde;
         $obj->tbestellung = $bestellung;
         sendeMail(MAILTEMPLATE_BESTELLUNG_BEZAHLT,$obj);
         
         echo $this->getReturnURL($order);
      }
   }

   /**
    * @return boolean
    * @param Bestellung $order
    * @param array $args
    */
   function verifyNotification($order, $paymentHash, $args)
   {        
      $req = 'cmd=_notify-validate';
      
      foreach ($args as $key => $value) 
      {
         $value = urlencode(stripslashes($value));
         $req .= "&$key=$value";
      }

      // post back to PayPal system to validate
      $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 (PP_MODE == 1 ? URLVALID_TEST : URLVALID_LIVE, 443, $errno, $errstr, 30);

      if (!$fp) 
      {
         // HTTP ERROR
            if(D_MODE == 1)
                writeLog(D_PFAD, $errstr . "(" . $errno . ")", 1);
      } 
      else 
      {
         fputs ($fp, $header . $req);
         while (!feof($fp)) 
         {
            $res = fgets ($fp, 1024);
            if (strcmp ($res, "VERIFIED") == 0) 
            {
               // echo the response
               if(D_MODE == 1)
                        writeLog(D_PFAD, "VERIFIED - true", 1);
               
               // check the payment_status is Completed
               if ($args['payment_status']!="Completed")
               {
                        if(D_MODE == 1)
                            writeLog(D_PFAD, $args['payment_status'] . " != Completed", 1);
                            
                  return false;
               }
               // check that txn_id has not been previously processed
               
               
               $txn_id_obj = $GLOBALS['DB']->executeQuery("select * from tzahlungsid where txn_id=\"".$args['txn_id']."\"",1);
               if ($txn_id_obj->kBestellung>0)
               {
                        if(D_MODE == 1)
                            writeLog(D_PFAD, "ZahlungsID " . $args['txn_id'] . " bereits gehabt.", 1);
                        
                  return false;
               }
               // check that receiver_email is your Primary PayPal email

               
               $Einstellungen = getEinstellungen(array(CONF_ZAHLUNGSARTEN));
               if ($Einstellungen['zahlungsarten']['zahlungsart_paypal_empfaengermail']!=$args['receiver_email'] && $Einstellungen['zahlungsarten']['zahlungsart_paypal_empfaengermail']!=$args['business'])
               {
                        if(D_MODE == 1)
                            writeLog(D_PFAD, "Falscher Emailempfaenger: " . $args['receiver_email'] . " != " . $Einstellungen['zahlungsarten']['zahlungsart_paypal_empfaengermail'], 1);
            
                  return false;
               }
               // check that payment_amount/payment_currency are correct
               
               if($_POST['custom']{0} == "_")
               {
                  checkeExterneZahlung($args['custom']);
               }
               else
               {
                  $zahlungsid = $GLOBALS['DB']->executeQuery("select * from tzahlungsid where cId=\"".$args['custom']."\"",1);
                  if (!$zahlungsid->kBestellung)
                  {
                            if(D_MODE == 1)
                                writeLog(D_PFAD, "ZahlungsID ist unbekannt: " . $args['custom'], 1);
            
                     return false;
                  }
               }      
            }            
         }
      } 
      
      return true;
   }
   
    function finalizeOrder($order, $hash, $args)
   {
      return $this->verifyNotification($order, $hash, $args);
   }

   function parse($resultURL) 
   {
      $r_arr=explode("&",$resultURL);

      foreach($r_arr AS $buf)
      {
         $temp=urldecode($buf);
         $temp=split("=",$temp,2);

         $postatt=$temp[0];
         $postvar=$temp[1];

         $returnvalue[$postatt]=$postvar;

      }
      return($returnvalue);
   }
   
    function isValidIntern($args_arr = array())
    {                        
        if(strlen($GLOBALS['Einstellungen']['zahlungsarten']['zahlungsart_paypal_empfaengermail']) == 0 || $GLOBALS['Einstellungen']['zahlungsarten']['zahlungsart_paypal_empfaengermail'] == "")
        {
            ZahlungsLog::add($this->moduleID, "Pflichtparameter 'Empfaengeremail' ist nicht gesetzt!", null, LOGLEVEL_ERROR);
            return false;
        }

        return true;
    }
    
    public function canPayAgain()
    {
        return true;
    }
}
?>
 

ag-websolutions.de

Sehr aktives Mitglied
29. Dezember 2009
14.548
233
AW: paypal und Shop- Lieferadresse

ahhhhh .... mein Fehler bei der Anleitung oben ...


hier die komplette PayPal-Class mit der es klappen sollte

Code:
<?php
include_once (PFAD_ROOT.PFAD_INCLUDES_MODULES.'PaymentMethod.class.php');

// Mode
define("PP_MODE", 0); // 1 = Test / 0 = Live

// Debug
define("D_MODE", 0); // 1 = An / 0 = Aus
define("D_PFAD", PFAD_ROOT . "jtllogs/paypal.log");

// Sandbox
define("URL_TEST", "https://www.sandbox.paypal.com/cgi-bin/webscr");
define("URLVALID_TEST", "ssl://www.sandbox.paypal.com");

// Live
define("URL_LIVE", "https://www.paypal.com/cgi-bin/webscr");
define("URLVALID_LIVE", "ssl://www.paypal.com");

class PayPal extends PaymentMethod
{   
   var $oPosition_arr = array();
   function init()
   {
      $this->name = 'PayPal';
      $this->caption = 'PayPal';
   }
   
   function preparePaymentProcess($order)
   {
      global $Einstellungen, $DB, $smarty;

      $hash = $this->generateHash($order);

      $cISOSprache = "";
      $cISOSprache_arr = array("FR", "ES", "IT", "DE", "CN", "AU", "EN");
      
      if(strlen($_SESSION['cISOSprache']) > 0)
      {
         $cISOSprache = convertISO2ISO639($_SESSION['cISOSprache']);
      }
      else
      {
         $oSprache = $GLOBALS['DB']->executeQuery("SELECT kSprache, cISO FROM tsprache WHERE cShopStandard = 'Y'", 1);
         if($oSprache->kSprache > 0)
            $cISOSprache = convertISO2ISO639($oSprache->cISO);
      }
      
      if(!in_array(strtoupper($cISOSprache), $cISOSprache_arr))
         $cISOSprache = "DE";
         
      $cCountryISO = $order->oKunde->cLand;
      if (strlen($cCountryISO) > 2)
         $cCountryISO = landISO($cCountryISO);
         
      if ( isset($order->Lieferadresse->kLieferadresse) && ($order->Lieferadresse->kLieferadresse > 0) ) {   //Kunde hat eine abweichende Lieferanschrift angegeben
      
        $pp_address_override = array (
                'address1'=> $order->Lieferadresse->cStrasse,
                'address2'=> $order->Lieferadresse->cAdressZusatz,
                'city'=> $order->Lieferadresse->cOrt,
                'first_name'=> $order->Lieferadresse->cVorname,
                'last_name'=> $order->Lieferadresse->cNachname,
                'zip'=> $order->Lieferadresse->cPLZ
        );
        
      } else {
      
        $pp_address_override = array (
                'address1'=> $order->oKunde->cStrasse,
                'address2'=> $order->oKunde->cAdressZusatz,
                'city'=> $order->oKunde->cOrt,
                'first_name'=> $order->oKunde->cVorname,
                'last_name'=> $order->oKunde->cNachname,
                'zip'=> $order->oKunde->cPLZ
        );
      }

      $fields = array (
         'cmd'=> '_cart',
         'business'=> $Einstellungen['zahlungsarten']['zahlungsart_paypal_empfaengermail'],
         'currency_code'=> $order->Waehrung->cISO,
         
          /*
         'address1'=> $_SESSION['Lieferadresse']->cStrasse,
         'address2'=> $_SESSION['Lieferadresse']->cAdressZusatz,
         'city'=> $_SESSION['Lieferadresse']->cOrt,
         'country'=> $cCountryISO,
         'first_name'=> $_SESSION['Lieferadresse']->cVorname,
         'last_name'=> $_SESSION['Lieferadresse']->cNachname,
         'zip'=> $_SESSION['Lieferadresse']->cPLZ,
         'tax_cart' => number_format($order->fSteuern, 2, '.', ','),
         'address_override'=> '1',
         */
        
         'address1'=> $pp_address_override['address1'],
         'address2'=> $pp_address_override['address2'],
         'city'=> $pp_address_override['city'],
         'country'=> $cCountryISO,
         'first_name'=> $pp_address_override['first_name'],
         'last_name'=> $pp_address_override['last_name'],
         'zip'=> $pp_address_override['zip'],
         'tax_cart' => number_format($order->fSteuern, 2, '.', ','),
         'address_override'=> '1',
         
         
         // Keine Angabe von Steuern (Bruttowerte werden übergeben)
         'tax_cart' => '0.00',
         
         'invoice'=> $order->cBestellNr,
         'email'=> $order->oKunde->cMail,
         'upload'=> '1',
         'cancel_return'=> URL_SHOP,
         'return'=> URL_SHOP . "/bestellabschluss.php?i=" . $hash,
         'custom'=> $hash,
         'lc' => strtoupper($cISOSprache),
         'notify_url'=> $this->getNotificationURL($hash)
      );
      
     
      /*
      $cNeedState_arr = array("US", "CA");
      if (in_array(strtoupper($cCountryISO), $cNeedState_arr))
         $fields['state'] = $_SESSION['Lieferadresse']->cBundesland;
      */
      
      $idx = 1;
      $fDiscountCart = 0;
      
      if ($order->fGuthaben != 0)
      {
         if ($order->fGuthaben < 0)
            $order->fGuthaben *= -1;
      
         $fDiscountCart += $order->fGuthaben;
      }
      
      foreach ($order->Positionen as $oPosition)
      {
         if ($oPosition->nPosTyp == C_WARENKORBPOS_TYP_KUPON || $oPosition->nPosTyp == C_WARENKORBPOS_TYP_GUTSCHEIN || $oPosition->nPosTyp == C_WARENKORBPOS_TYP_NEUKUNDENKUPON || $oPosition->fPreis < 0)
         {
            $fDiscount = berechneBrutto($oPosition->fPreis * $order->Waehrung->fFaktor, $oPosition->fMwSt);
            if ($fDiscount < 0)
               $fDiscount *= -1;
            
            $fDiscountCart += $fDiscount;
         }
         elseif ($oPosition->nPosTyp != C_WARENKORBPOS_TYP_VERSANDPOS && $oPosition->nPosTyp != C_WARENKORBPOS_TYP_VERPACKUNG && $oPosition->nPosTyp != C_WARENKORBPOS_TYP_VERSAND_ARTIKELABHAENGIG)
         {

        if(intval($oPosition->nAnzahl) != $oPosition->nAnzahl) {
            $fields['item_name_' . $idx] = $oPosition->cName.' ('.str_replace('.', ',',$oPosition->nAnzahl).' '.$oPosition->cEinheit.')';
            $fields['quantity_' . $idx] = 1;
            $fields['amount_' . $idx] = round(berechneBrutto($oPosition->fPreis * $order->Waehrung->fFaktor, $oPosition->fMwSt)*$oPosition->nAnzahl, 2);

        } else {
            $fields['item_name_' . $idx] = $oPosition->cName;
            $fields['quantity_' . $idx] = $oPosition->nAnzahl;
            $fields['amount_' . $idx] = round(berechneBrutto($oPosition->fPreis * $order->Waehrung->fFaktor, $oPosition->fMwSt), 2);

        }
            
            if ($oPosition->Artikel)
               $fields['item_number_' . $idx] = $oPosition->Artikel->cArtNr;

            if ($idx == 1)
               $fields['shipping_' . $idx] = round($order->fVersandKundenwaehrung, 2);
               
            $idx++;
         }
      }
      
      if ($fDiscountCart > 0)
         $fields['discount_amount_cart'] = round($fDiscountCart, 2);

      $smarty->assign('fields', $fields);
      $smarty->assign('url', PP_MODE == 1 ? URL_TEST : URL_LIVE);
   }

   function handleNotification($order, $paymentHash, $args)
   {      
      if($this->verifyNotification($order, $paymentHash, $args))
      {
            $zahlungsid = $GLOBALS['DB']->executeQuery("select * from tzahlungsid where cId=\"".$args['custom']."\"",1);
            
            if(D_MODE == 1)
                writeLog(D_PFAD, "kBestellung: " . $zahlungsid->kBestellung, 1);
            
         $b = $GLOBALS['DB']->executeQuery("select kKunde from tbestellung where kBestellung=".$zahlungsid->kBestellung,1);
         $kunde = new Kunde($b->kKunde);
         $Sprache = $GLOBALS["DB"]->executeQuery("select cISO from tsprache where kSprache=".$kunde->kSprache,1);
         if (!$Sprache)
            $Sprache = $GLOBALS["DB"]->executeQuery("select cISO from tsprache where cShopStandard=\"Y\"",1);
         
         $bestellung = new Bestellung($zahlungsid->kBestellung);
         $bestellung->fuelleBestellung(0);
         if ($bestellung->Waehrung->cISO!=$_POST['mc_currency'])
         {
                if(D_MODE == 1)
                    writeLog(D_PFAD, "Falsche Waehrung: " . $bestellung->Waehrung->cISO . " != " . $_POST['mc_currency'], 1);
            die('0');
         }
         
         //zahlung setzen
         $GLOBALS['DB']->executeQuery("update tbestellung set 
                                 dBezahltDatum=now(), 
                                 cStatus=\"".BESTELLUNG_STATUS_BEZAHLT."\" where kBestellung=".intval($bestellung->kBestellung),4);

         unset($bestellung);
         $bestellung = new Bestellung($zahlungsid->kBestellung);
         $bestellung->fuelleBestellung(0);

         // process payment
         $paymentDateTmp=strtotime($_POST['payment_date']);
         $zahlungseingang->kBestellung = $bestellung->kBestellung;
         $zahlungseingang->cZahlungsanbieter = "PayPal";
         $zahlungseingang->fBetrag = $_POST['mc_gross'];
         $zahlungseingang->fZahlungsgebuehr = $_POST['payment_fee'];
         $zahlungseingang->cISO = $_POST['mc_currency'];
         $zahlungseingang->cEmpfaenger = $_POST['receiver_email'];
         $zahlungseingang->cZahler = $_POST['payer_email'];
         $zahlungseingang->cAbgeholt = 'N';
         $zahlungseingang->cHinweis = $_POST['txn_id'];
         $zahlungseingang->dZeit = strftime('%Y-%m-%d %H:%M:%S',$paymentDateTmp);
         
         $GLOBALS['DB']->insertRow('tzahlungseingang',$zahlungseingang);
         
         //mail
         $obj->tkunde = $kunde;
         $obj->tbestellung = $bestellung;
         sendeMail(MAILTEMPLATE_BESTELLUNG_BEZAHLT,$obj);
         
         echo $this->getReturnURL($order);
      }
   }

   /**
    * @return boolean
    * @param Bestellung $order
    * @param array $args
    */
   function verifyNotification($order, $paymentHash, $args)
   {        
      $req = 'cmd=_notify-validate';
      
      foreach ($args as $key => $value) 
      {
         $value = urlencode(stripslashes($value));
         $req .= "&$key=$value";
      }

      // post back to PayPal system to validate
      $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 (PP_MODE == 1 ? URLVALID_TEST : URLVALID_LIVE, 443, $errno, $errstr, 30);

      if (!$fp) 
      {
         // HTTP ERROR
            if(D_MODE == 1)
                writeLog(D_PFAD, $errstr . "(" . $errno . ")", 1);
      } 
      else 
      {
         fputs ($fp, $header . $req);
         while (!feof($fp)) 
         {
            $res = fgets ($fp, 1024);
            if (strcmp ($res, "VERIFIED") == 0) 
            {
               // echo the response
               if(D_MODE == 1)
                        writeLog(D_PFAD, "VERIFIED - true", 1);
               
               // check the payment_status is Completed
               if ($args['payment_status']!="Completed")
               {
                        if(D_MODE == 1)
                            writeLog(D_PFAD, $args['payment_status'] . " != Completed", 1);
                            
                  return false;
               }
               // check that txn_id has not been previously processed
               
               
               $txn_id_obj = $GLOBALS['DB']->executeQuery("select * from tzahlungsid where txn_id=\"".$args['txn_id']."\"",1);
               if ($txn_id_obj->kBestellung>0)
               {
                        if(D_MODE == 1)
                            writeLog(D_PFAD, "ZahlungsID " . $args['txn_id'] . " bereits gehabt.", 1);
                        
                  return false;
               }
               // check that receiver_email is your Primary PayPal email

               
               $Einstellungen = getEinstellungen(array(CONF_ZAHLUNGSARTEN));
               if ($Einstellungen['zahlungsarten']['zahlungsart_paypal_empfaengermail']!=$args['receiver_email'] && $Einstellungen['zahlungsarten']['zahlungsart_paypal_empfaengermail']!=$args['business'])
               {
                        if(D_MODE == 1)
                            writeLog(D_PFAD, "Falscher Emailempfaenger: " . $args['receiver_email'] . " != " . $Einstellungen['zahlungsarten']['zahlungsart_paypal_empfaengermail'], 1);
            
                  return false;
               }
               // check that payment_amount/payment_currency are correct
               
               if($_POST['custom']{0} == "_")
               {
                  checkeExterneZahlung($args['custom']);
               }
               else
               {
                  $zahlungsid = $GLOBALS['DB']->executeQuery("select * from tzahlungsid where cId=\"".$args['custom']."\"",1);
                  if (!$zahlungsid->kBestellung)
                  {
                            if(D_MODE == 1)
                                writeLog(D_PFAD, "ZahlungsID ist unbekannt: " . $args['custom'], 1);
            
                     return false;
                  }
               }      
            }            
         }
      } 
      
      return true;
   }
   
    function finalizeOrder($order, $hash, $args)
   {
      return $this->verifyNotification($order, $hash, $args);
   }

   function parse($resultURL) 
   {
      $r_arr=explode("&",$resultURL);

      foreach($r_arr AS $buf)
      {
         $temp=urldecode($buf);
         $temp=split("=",$temp,2);

         $postatt=$temp[0];
         $postvar=$temp[1];

         $returnvalue[$postatt]=$postvar;

      }
      return($returnvalue);
   }
   
    function isValidIntern($args_arr = array())
    {                        
        if(strlen($GLOBALS['Einstellungen']['zahlungsarten']['zahlungsart_paypal_empfaengermail']) == 0 || $GLOBALS['Einstellungen']['zahlungsarten']['zahlungsart_paypal_empfaengermail'] == "")
        {
            ZahlungsLog::add($this->moduleID, "Pflichtparameter 'Empfaengeremail' ist nicht gesetzt!", null, LOGLEVEL_ERROR);
            return false;
        }

        return true;
    }
    
    public function canPayAgain()
    {
        return true;
    }
}
?>
 

XYZ

Sehr aktives Mitglied
21. September 2011
2.541
10
AW: paypal und Shop- Lieferadresse

Und BillSAFE-Fehlermeldung ist auch gelöst, Schreibfehler im Modulnamen, statt PaymentMethod.class.php wurde Paymentmethod.class.php aufgerufen...
 

ag-websolutions.de

Sehr aktives Mitglied
29. Dezember 2009
14.548
233
AW: paypal und Shop- Lieferadresse


Danke für Test und Rückmeldung ... dann sollte dem Endspurt im Weihnachtsgeschäft ja nichts mehr im Wege stehen

PS: Frage mich wie billsafe bisher funktionieren konnte, wenn die übergeordnete class nie gefunden und geladen werden konnte .... ist aber andere Baustelle 😉
 

maydo

Sehr aktives Mitglied
28. März 2011
2.135
86
DE-Fulda
AW: paypal und Shop- Lieferadresse

Hi Leute,

uns hat das eben mal 875,48€ gekostet.

Transaktion v. 18.11.
Ausgeliefert am 21.11. an übermittelte Lieferanschrift aus dem JTL Shop 3.

5.12. Konfliktmeldung Paypal.
Jetzt wurde zu gunsten des Käufers entschieden, weil wir nicht an die bei Paypal hinterlegte Lieferanschift versandt haben.

Schönes Weihnachtsgeschenk 🙂

Nachtrag: Rein Interesse halber bin ich einige andere Paypalbestellungen durchgegangen. Mindestens 20% der Bestellung sind abweichend von der Paypal Lieferanschrift. Diese Käufer könnten rein theoretisch alle den Kaufbetrag zurückerzwingen.
 

Ähnliche Themen