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?
 

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
Titel Forum Antworten Datum
Neu Paypal Zahlung erfolgreich, Auftrag mit Status Neu im Shop und fehlt in WAWI JTL-Shop - Fehler und Bugs 4
Neu Paypal Checkout nimmt neue CLIENT ID und SECRET nicht wahr User helfen Usern - Fragen zu JTL-Wawi 1
Neu Nach Update auf PayPal 2.1.0 doppelte Zahlungsarten und Ratepay Plugin erforderlich Plugins für JTL-Shop 0
Neu JTLPOS PayPal Reader JTL-POS - Fehler und Bugs 0
Neu PayPal lehnt Zahlung ab, weil PLZ angeblich nicht beliefert wird User helfen Usern 2
Neu VeroPay Plugin? Kampfansage gegen PayPal? User helfen Usern 54
Neu Link zu Paypal Zahlungsaufforderung funktioniert nicht mehr User helfen Usern - Fragen zu JTL-Wawi 3
Neu PayPal-Meldung: XXX versendet nicht an diesen Ort. Verwenden Sie eine andere Adresse. Plugins für JTL-Shop 20
Neu Paypal Plugin JTL-Shop - Fehler und Bugs 1
Neu Paypal bei bestimmten Produkten nicht anbieten Plugins für JTL-Shop 1
Neu PayPal lädt nicht mehr nach Update auf 5.6 (Child theme Checkout index.tpl Bug) Installation / Updates von JTL-Shop 0
Neu PayPal-Plugin blockiert bei PayPal-Störung Checkout JTL-Shop - Fehler und Bugs 4
Neu Falsche Umsatzsteuer bei Paypal-Checkout Bestellungen im Webshop JTL-Shop - Fehler und Bugs 3
Neu Paypal: Erweiterte Kreditkartenzahlung geht nicht JTL-Shop - Fehler und Bugs 20
Paypal-Zahlungen doppelt > keine automatische Zuweisung JTL-Wawi 1.10 0
Neu PayPal Checkout Plugin (iPhone), Probleme mit PayPal-App Plugins für JTL-Shop 0
Zahlungsabgleich Paypal Express Ausgänge JTL-Wawi 1.10 3
Neu JTL PayPal Plugin - keine Einstellmöglichkeiten, keine Anzeige im Frontend Plugins für JTL-Shop 2
Steuer Einstellung bei Sonderpreis und nach OSS Landauswahl JTL-Wawi 1.10 0
Neu Rechnungen werden und können nicht mehr vom Rechner im Lager gedruckt werden JTL-Wawi - Fehler und Bugs 3
Erfahrungen zur JTL Wawi 1.11.5 – Tipps, Bugs und Praxisberichte JTL-Wawi 1.11 10
Neu JTL SHOP 5.6 und Konfigurationsartikel Allgemeine Fragen zu JTL-Shop 0
Neu POS doppelte Artikel und Kategorien nach Update Einrichtung / Updates von JTL-POS 0
Neu Artikelname und Preis zentrieren Allgemeine Fragen zu JTL-Shop 8
Neu Downloadmodul – Keine Reiter "Downloads" und keine Download nach Bestellung möglich Technische Fragen zu Plugins und Templates 6
Neu Eine Amazon-Abrechnung wurde mit Verspätung generiert und fehlt jetzt in WAWI Amazon-Anbindung - Fehler und Bugs 3
Neu Wo kann ich mich über JTL Kundencenter beschweren? 20 Minuten Lang einen Bug im Ticket dokumentiert, und am Ende "ein Fehler ist aufgetreten" Smalltalk 3
Neu Interne Links in den Dropdowns "Sortierung" und "Artikel pro Seite" auf follow setzen Betrieb / Pflege von JTL-Shop 1
Neu Ist ein Hin- und Rückversand so machbar? User helfen Usern - Fragen zu JTL-Wawi 3
Neu 2x 19% Steuern ausweisen möglich? (MwSt und Versicherungssteuer) Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 1
Monatsabschluss Amazon FBA UK / CH mit JTL2Datev WaWi 1.10 bei IDU Nutzung und Zwangs VCS für GB / Schweiz JTL-Wawi 1.10 0
Neu Shopabgleich und McAfee Virenschutz = Problem? User helfen Usern - Fragen zu JTL-Wawi 2
Kein E-Mail-Versand von Versandbestätigung und Zahlungsbestätigung JTL-Wawi 1.10 0
Auftrag hängt in Pickliste fest und lässt sich nicht ausliefern! Tipps und Tricks - hilfreiche Videoanleitungen 2
Neu Sind Support-Tickets für WaWi und Ameise ohne kostenpflichtigen Tarif nicht mehr möglich? JTL-Wawi - Fehler und Bugs 3
Vorlagen und eigene Felder JTL-Wawi 1.10 3
JTL AGBs und Gewährleistungsrechte / Schadensersatz JTL-Wawi 1.11 1
Neu Frage zum Thema Skonto bei Bezahlungsarten Barzahlung und QR-Code Betrieb / Pflege von JTL-Shop 0
Neu SUCHE Freelancer für JTL WAWI Anbindung an WooCommerce und Einrichtung Dienstleistung, Jobs und Ähnliches 2
Neu Rechnungsvorlage Tarik und Herkunftsland User helfen Usern - Fragen zu JTL-Wawi 4
Neu Rechnung als pdf. speichern mit Rechnungsnummer und Kundennummer im Namen klappt nicht User helfen Usern - Fragen zu JTL-Wawi 4
Neu Artikel KinderArtikel anlegen: Workflow "Artikel erstellt und Artikel geändert" werden NUR beim Vaterartikel gestartet User helfen Usern - Fragen zu JTL-Wawi 0
Liste exportieren mit Kategorien und Anzahl der Artikel in der jeweiligen Kategorie JTL Ameise - Eigene Exporte 3
Vollständiger Ex- und Import wegen fehlerhafter Datenbank - Reihenfolge? JTL-Wawi 1.6 9
Am eigenen Lager Bestand = 0, bei FBA = 170, Probleme mit dem eigenen Shop und Otto.de JTL-Wawi 1.10 3
JTL Wawi und JTL-POS gleichen nicht mehr ab JTL-Wawi 1.11 2
Neu Packtisch + Waage – Meldung bei großem Unterschied zwischen tatsächlichem Gewicht und Systemgewicht? Arbeitsabläufe in JTL-WMS / JTL-Packtisch+ 1
Neu Lister 2.0 und Lagerbestände Amazon-Lister - Fehler und Bugs 0
Neu Keine plugins im header und footer mehr auf Startseite shop 5.6.0 angezeigt Installation / Updates von JTL-Shop 5
Ich möchte den Bestand der Verpackungskartons im System verwalten und nachverfolgen JTL-Wawi 1.10 2

Ähnliche Themen