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
232
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
232
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
232
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?
 

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
232
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
232
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.133
85
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
Titel Forum Antworten Datum
Neu Paypal Plugin Version 1.2.0 läuft und 1.4.0. läuft nicht auf derselben Umgebung Plugins für JTL-Shop 0
Neu PayPal Checkout mit Apple Pay und Google Pay Plugins für JTL-Shop 2
Neu JTL Paypal Checkout Button bei Konfigurationsartikel verhindern Plugins für JTL-Shop 6
Neu JTL PayPal: Plugin - Bestellungen werden nicht angezeigt. Fehlermeldung "Unable to load config 'file:.conf'" Plugins für JTL-Shop 2
Neu PayPal Checkout: Verständnisfrage Plugins für JTL-Shop 0
Neu Paypal express Kauf nimmt Versandart Abholung (kostenlos) Plugins für JTL-Shop 0
Ich habe auf NOVA umgestellt aber PayPal funktioniert nicht Einrichtung JTL-Shop5 1
Neu Änderung des Auftrags nach Zahlungseingang Paypal Arbeitsabläufe in JTL-Wawi 7
Neu PayPal Checkout: Kunden verwirrt wegen Zahlungsart Name Plugins für JTL-Shop 0
Neu Erledigt - Plugin PayPal Checkout, Update auf 1.4.0, Komplettabsturz Plugins für JTL-Shop 1
Neu Paypal Gebühren neue AGB Allgemeine Fragen zu JTL-Shop 2
Neu JTL-Shop 5 Paypal Zahlung 30 Tage Zahlungsziel Allgemeine Fragen zu JTL-Shop 6
Neu Paypal Plugin erzeugt "Quirks Mode" Betrieb / Pflege von JTL-Shop 0
Neu PayPal Checkout - Bestellungen werden nicht übertragen! User helfen Usern - Fragen zu JTL-Wawi 1
Neu PayPal Checkout 1.3.0 Log Notice Mindestbestellwert Plugins für JTL-Shop 1
Neu Betreuung einer Shops und die damit verbundene Pflege der Plugins. Betrieb / Pflege von JTL-Shop 5
Dropshipping und Beilegeretoure Otto.de - Anbindung (SCX) 2
Neu Kundendaten extern verschlüsseln (Für den eigenen Shop) und per Import importieren Technische Fragen zu Plugins und Templates 2
Neu Wo und wie finde ich meine Kunden mit einer Marketing-Permission? JTL-Shop - Ideen, Lob und Kritik 0
Neu JTL Shipping - Amazon Prime und nicht-Prime JTL-ShippingLabels - Ideen, Lob und Kritik 0
Neu Amazon - Angebotszuordnung löschen und wieder herstellen Onlineshop-Anbindung 1
Neu Attribute wie Farbe und Größe lassen sich nicht filtern WooCommerce-Connector 0
Farbe zwischen Header und Footer ändern Einrichtung JTL-Shop5 0
Neu WMS Vorteile und Nachteile JTL-WMS / JTL-Packtisch+ - Ideen, Lob und Kritik 5
Neu Mehrsprachiger Shop-Aufbau: .de und .nl Domain - worauf muss man achten? Allgemeine Fragen zu JTL-Shop 5
Neu Wie kann ich mit der Wawi Ebay Rechnungen erstellen und nach ebay hochladen? eBay-Anbindung - Fehler und Bugs 3
Ameisen-Export Buchungsdaten (Rechnungen) - Mahndatum und Mahnstufe fehlen JTL-Ameise - Fehler und Bugs 0
Neu Workflow - Stücklisten im Auftrag abfragen und korrekt in einer Mail auflisten User helfen Usern - Fragen zu JTL-Wawi 1
Neu JTL 5, Footerdesign, Boxabstände und Ausrichtung korrigieren Gelöste Themen in diesem Bereich 5
Neu Firmen- und E-Mail Einstellungen - Text hevorheben (fett) und Anordnung in Vorlage anpassen Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 21
4K Monitor und Skalierung JTL-Wawi 1.8 2
Neu Updatepolitik und Testen von Software - aktuell 5.2.4 Installation / Updates von JTL-Shop 8
Kunden und Artiekl ausblenden JTL-Wawi App 1
Neu Es werden nur jpg Bilder angezeigt und keine webP Gelöste Themen in diesem Bereich 3
Neu Auftragszahlung über Kasse, Auftrag wird nicht als "Verpackt und Versendet" markiert JTL-POS - Fehler und Bugs 1
Gelöst Kassenschublade und Drucker bei iMin D4 Pro JTL-POS - Fragen zu Hardware 4
Neu eBay zusammenfassen von Aufträgen und Buchhaltung User helfen Usern - Fragen zu JTL-Wawi 0
Neu Selbstabholer und eBay User helfen Usern - Fragen zu JTL-Wawi 6
Workflows: Versandgruppen finden und ansprechen JTL-Wawi 1.8 0
Auswertung POS-Umsätze nach Wochentag und Tageszeit JTL-Wawi 1.7 0
Neu Fehler bei Sprach- und Währungsumstellung Allgemeine Fragen zu JTL-Shop 0
Neu Verkaufspreis Differenz Shop und Wawi JTL-Shop - Fehler und Bugs 4
Neu Mehrere Sprachen aktivieren und verschiede Preise pro Land erstellen Betrieb / Pflege von JTL-Shop 1
Neu Was steckt hinter der Zahl von 53 Bildern auf Ebay bei Variationsartikeln (und einer unsinnigen Fehlermeldung der Wawi)? JTL-Wawi - Fehler und Bugs 2
Neu Filtereinstellungen: wenn Sonderpreis bei Vater- oder Kindartikeln, Anzeige von Vater- UND Kindartikeln User helfen Usern - Fragen zu JTL-Wawi 5
Neu Sprachvariablen nicht in korrekter Groß- und Kleinschreibung JTL-Shop - Fehler und Bugs 4
Neu Gewicht auf Rechnung (Artikelgewicht und Zusatzgewicht) Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 1
Neu Neues Plugin: Google Translate / Übersetzer (DSGVO-konform und weitere Features) Plugins für JTL-Shop 2
Neu Workflow Aktion E-Mail senden kann nicht Plain und HTML Email zusammen versenden Arbeitsabläufe in JTL-Wawi 6
Neu JTL Shopify Connector und Billbee frage Shopify-Connector 0

Ähnliche Themen