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
PayPal Zahlungsabgleich geht nicht JTL-Wawi 1.11 20
Neu Rechnungen zeigen Paypal Text an, obwohl er in der Vorlage nicht ausgewählt ist JTL-Wawi 2.0 3
Neu PayPal Transaktionsversuche – Wie hoch sind eure Ablehnungsquoten? Allgemeine Fragen zu JTL-Shop 1
Neu Paypal 2.2.1; Fehler "Der Zahlungsanbieter hat eine Anmeldung gefordert" Plugins für JTL-Shop 0
Neu Paypal Abgleich - Schnittstelle geändert- Wawi Update Erforderlich ! JTL-Wawi - Fehler und Bugs 12
Neu Apple Pay über PayPal nicht zu verbinden (Die Domain-Verifizierungsdatei wurde nicht gefunden.) Technische Fragen zu Plugins und Templates 26
Neu JTL PayPal Checkout 2.3.0 ... 1. Update klappte nicht, 2. Update nun Eintrag doppelt Plugins für JTL-Shop 24
Neu PayPal Rundungsfehler automatischer ungewollter Rabatt in PayPal Zahlung JTL-Shop - Fehler und Bugs 19
Neu Seltsamer Fehler bei PayPal-Checkout: "Warenkorb enthielt Vaterartikel..." JTL-Shop - Fehler und Bugs 2
Neu PayPal Plugin wirft Fehler auf einmal wegen telefonnummer JTL-Shop - Fehler und Bugs 3
PayPal Abgleich funktioniert nicht (JTL 1.9.8.0) JTL-Wawi 1.9 23
Neu PayPal Käufername stimme nicht mit Liederadresse überein! Business Jungle 0
Neu Alle PayPal Zahlungsarten seit gestern verschwunden! Plugins für JTL-Shop 3
PayPal Zahlungsabgleich plötzlich nich tmehr möglich JTL-Wawi 1.11 0
Neu Lieferadresse in PayPal-Transaktion weicht von der in der Wawi ab Plugins für JTL-Shop 0
Neu SUNMI V3 MIX – Touchscreen und USB-Maus frieren nach einigen Minuten ein JTL-POS - Fehler und Bugs 1
Beantwortet [Shop 5.7.2 / Wawi 2.0.5] GPSR-Daten werden am Artikel nicht angezeigt trotz korrekter Übertragung und installiertem Plugin Allgemeine Fragen zu JTL-Shop 1
Amazon VCS-Lite und Externe Belege JTL-Wawi 1.11 1
Neu PPWR und Versandetikett Business Jungle 5
Neu DSVGO konform 1000 Kunden in WaWi und Shop löschen! User helfen Usern - Fragen zu JTL-Wawi 4
Neu Der wahrscheinlich östlichste JTL Servicepartner: Standortvorteil, faire Preise und vieles mehr Dienstleistung, Jobs und Ähnliches 16
Neu Rechte-Fehler im J10n Modul und Auswirkung auf base.mo.php in div. Plugins (Shop 5.7.1) JTL-Shop - Fehler und Bugs 0
Neu Kundengruppeneinstellungen für Mindestabnahme und Abnahmeintervall löschen User helfen Usern - Fragen zu JTL-Wawi 0
Neu Shop 5.7.1 und Downloadmodul Allgemeine Fragen zu JTL-Shop 1
Neu Plugin: JTL Exportformat Google Shopping gibt <g:google_product_category> unter Shop 5.7.1 und Wawi 2.0.4 nicht aus Plugins für JTL-Shop 1
Neu Widerrufbutton und Handy JTL-Shop - Fehler und Bugs 1
ändern von Servernamen nach Neuinstallation von SQL und Verbindung mit neuem Server in der Wawi JTL-Wawi 2.0 2
Neu Neues Tool - eBay Penner finden, beenden und neu listen Schnittstellen Import / Export 0
Neu Arbeiten mit Lieferanten EKs - Workflows und SQL User helfen Usern - Fragen zu JTL-Wawi 6
Angebliche externe Aufträge "für Rechnungserstellung freigeben" und Rechnungen erstellen. Gibt es dazu eine akzeptable Erklärung von JTL? JTL-Wawi 1.11 1
Fehlermeldungen bei Einrichtung DHL 4.0 "Objektverweis" und "Konfiguration Versandart" JTL-Wawi 1.11 2
Fehler nach Update auf Version 1.11.11 und 2.0.4 JTL-Wawi 2.0 7
Neu Es werden keine Marken ausgedruckt und die Portokasse lässt keine Anmeldung zu. Smalltalk 5
Neu Newsletter Problem und Fragen Allgemeine Fragen zu JTL-Shop 2
Neu MS Server und MS SQL Installation von JTL-Wawi 5
Neu Seller2Go – Mobile App & JTL-Plugin für Bestellungen, Support und Produktmanagement Plugins für JTL-Shop 0
Keine Datenübertragung trotz bestehender Verbindung und funktionierendem Server JTL-Wawi 2.0 35
Neu buersten.de stellt sich vor (und lädt euch ein!) Shops stellen sich vor 3
Neu Bestellabgleich Shopify - JTL | Point of Sales und Online Stores Shopify-Connector 2
Dashboard lädt nicht und Umsatzanzeige rechnet falsch seit Update auf 1.11.8 JTL-Wawi 1.11 8
Neu Falsch erzeugte Ausgangszahlung bei Teilzahlungen und Retoure (Kauf auf Rechnung) Arbeitsabläufe in JTL-Wawi 0
Neu Kritisches Problem bei DHL 4.0: Handelsstücklisten brechen EU- und Exportversand JTL-ShippingLabels - Fehler und Bugs 24
Neu Besucher und Kampagnen Statistik Konfiguration Betrieb / Pflege von JTL-Shop 0
Bestellabgleich mit JTL Wawi und WooCommerce 1h verzögert JTL-Wawi 2.0 0
JTL-Worker 2.0 - Einrichtung als Dienst - Auffälligkeiten und Problemlösungen für manche JTL-Wawi 2.0 3
Neu Summenanzeige in Zahlungen (F7) und Beschaffung (F3) JTL-Wawi - Ideen, Lob und Kritik 0
Neu jtl POS und wawi 1.11.9 Bestände User helfen Usern - Fragen zu JTL-Wawi 3
Neu Custom Checkout - Conversion optimiert mit Speicherung von Standard-Versandart und Zahlungsart am Kunden JTL-Shop - Ideen, Lob und Kritik 1
In Diskussion Workflow mit UND / ODER - Bedingung erstellen JTL-Workflows - Ideen, Lob und Kritik 7
Ameise-Export: Umsatzsteuer stimmt nicht mit Differenz aus Netto und Brutto überein (insbesondere bei mehreren Steuersätzen) JTL-Wawi 1.11 0

Ähnliche Themen