Ergebnis 1 bis 14 von 14

Thema: Lastschrift / Bankeinzug | isotope_payment_directdebit

  1. #1
    Contao-Nutzer
    Registriert seit
    12.11.2010.
    Beiträge
    178

    Frage Lastschrift / Bankeinzug | isotope_payment_directdebit

    Hallo,

    ich möchte als zusätzliche Zahlart noch Lastschrift anbieten, weshalb zusätzliche Eingabefelder für die Bankverbindung benötigt werden, dessen Eingaben dann in den E-Mails angezeigt oder in der Datenbank gespeichert werden.
    Die Erweiterung isotope_payment_directdebit integriert diese Funktion in Isotope, doch funktioniert sie mit der aktuellen Contao- und Isotope-Version nicht korrekt. Im Frontend läuft alles korrekt ab, doch in der E-Mail ist die Bankverbindung nicht enthalten – die Simple Tokens funktionieren offenbar nicht.

    Wie löst ihr das bislang? Oder könnt mir helfen, die Erweiterung fit für Isotope 1.3 und Contao 2.11.2 zu machen?

    config/config.php
    PHP-Code:
    /**
     * Payment modules
     */
    $GLOBALS['ISO_PAY']['directdebit'] = 'Isotope_Payment_PaymentDirectDebit';

    /**
     * Hooks
     */
    $GLOBALS['TL_HOOKS']['iso_writeOrder'][] = array('Isotope_Payment_DirectDebitHelper''onWriteOrder'); 

    Isotope_Payment_DirectDebitHelper.php – hier werden die Simple Tokens definiert.
    Die Datei wird aber wohl überhaupt nicht aufgerufen, da keinerlei Fehler auftritt, wenn ich in die Datei nur Mist schreibe.
    PHP-Code:
    /**
     * Helper class for direct debit payment method
     *
     * Provides hook to inject direct debit payment data such as
     * the account holder on writing the order.
     *
     * @copyright  Copyright (c) 2010 Michael Gruschwitz <info@grusch-it.de>
     * @license    http://opensource.org/licenses/lgpl-3.0.html
     * @category   Contao
     * @package    Isotope
     * @subpackage Payment
     * @uses       Frontend
     */

    class Isotope_Payment_DirectDebitHelper extends Frontend
    {
        
    /**
         * @var Isotope
         */
        
    public $Isotope;

        
    /**
         * Hook on writing the order
         *
         * TL_HOOKS::iso_writeOrder
         *
         * @param int|str $orderId                            The order id
         * @param bool $blnCheckout                            TODO: don't know what $blnCheckout realy is
         * @param ModuleIsotopeCheckout $isoModCheckout        Isotope checkout object
         * @return bool                                        TODO: don't know what $blnCheckout realy is
         */
        
    public function onWriteOrder($orderId$blnCheckout$isoModCheckout)
        {
            
    // import isotope object
            
    $this->import('Isotope');

            
    // get the id of the selected payment module
            
    $paymentId $this->Isotope->Cart->Payment->id;

            
    // get payment modules that are _not_ of type directdebit
            
    $objModules $this->Database->execute("SELECT * FROM tl_iso_payment_modules WHERE type!='directdebit' AND enabled='1'");

            
    // iterate through the payment modules that are _not_ of type directdebit
            // because we only want to inject account data if directdebit was selected
            
    while ($objModules->next()) {
                
    // the current selected payment module is not type of directdebit, so stop here
                
    if ($objModules->id == $paymentId) {
                    return 
    $blnCheckout;
                }
            }

            
    // collect data from the session
            
    $accHolder        $_SESSION['CHECKOUT_DATA']['payment'][$paymentId]['acc_holder'];
            
    $accNumber        $_SESSION['CHECKOUT_DATA']['payment'][$paymentId]['acc_number'];
            
    $accRoutingNumber $_SESSION['CHECKOUT_DATA']['payment'][$paymentId]['acc_routing_number'];
            
    // obfuscate the account number for the frontend
            
    $accNumberObf     $this->Isotope->Cart->Payment->getObfuscatedAccountNumber($accNumber);

            
    // inject data to the order data array
            
    $isoModCheckout->arrOrderData array_merge($isoModCheckout->arrOrderData, array(
                
    'acc_holder'         => $accHolder,
                
    'acc_number'         => $accNumber,
                
    'acc_number_obf'     => $accNumberObf,
                
    'acc_routing_number' => $accRoutingNumber
            
    ));

            return 
    $blnCheckout;
        }


    Isotope_Payment_PaymentDirectDebit.php
    PHP-Code:
    /**
     * Direct debit payment provider
     *
     * Provides a direct debit payment provider collecting the following data:
     *     - account holder
     *  - account number
     *  - account routing number.
     *
     * @copyright  Copyright (c) 2010 Michael Gruschwitz <info@grusch-it.de>
     * @license    http://opensource.org/licenses/lgpl-3.0.html
     * @category   Contao
     * @package    Isotope
     * @subpackage Payment
     * @uses       Frontend
     */
    class Isotope_Payment_PaymentDirectDebit extends IsotopePayment
    {
        
    /**
         * Return a list of status options
         *
         * @return array        Array of availble status options
         */
        
    public function statusOptions()
        {
            return array(
    'pending''processing''complete''on_hold');
        }

        
    /**
         * Processes the payment
         *
         * Direct debit does not require any processing; so the method will just
         * return 'true'.
         *
         * @see IsotopePayment::processPayment()
         * @return bool                                True if the processing was successfull
         */
        
    public function processPayment()
        {
            return 
    true;
        }

        
    /**
         * Returns a html form for payment data
         *
         * Includes fields for
         *  - account holder
         *  - account number
         *  - account routing number.
         *
         * @see IsotopePayment::paymentForm()
         *
         * @param ModuleIsotopeCheckout    $objCheckoutModule    The checkout module object
         * @return string                                    The html string of the form
         */
        
    public function paymentForm($objCheckoutModule)
        {
            
    // get posted payment data
            
    $arrPayment $this->Input->post('payment');

            
    // form fields as array
            
    $formFields = array
            (
                
    'acc_holder' => array
                (
                    
    'label' => &$GLOBALS['TL_LANG']['ISO']['acc_holder'],
                    
    'inputType' => 'text',
                    
    'eval' => array('mandatory' => true'tableless' => true)
                ),
                
    'acc_number' => array
                (
                    
    'label' => &$GLOBALS['TL_LANG']['ISO']['acc_number'],
                    
    'inputType' => 'text',
                    
    'eval' => array('mandatory' => true'rgxp' => 'digit''maxlength' => 12'tableless' => true)
                ),
                
    'acc_routing_number' => array
                (
                    
    'label' => &$GLOBALS['TL_LANG']['ISO']['acc_routing_number'],
                    
    'inputType' => 'text',
                    
    'eval' => array('mandatory' => true'rgxp' => 'digit''maxlength' => 8'tableless' => true)
                )
            );

            
    $strBuffer '';

            
    // build form
            
    foreach ($formFields as $fieldName => $arrData)
            {
                
    // get class of the current input field
                
    $strClass $GLOBALS['TL_FFL'][$arrData['inputType']];

                
    // if the input field class is unkown; continue
                
    if (!$this->classFileExists($strClass))
                {
                    continue;
                }

                
    // generate the name of the input field
                
    $strName   sprintf('payment[%s][%s]'$this->id$fieldName);
                
    // create the input field object/widget
                
    $objWidget = new $strClass($this->prepareForWidget($arrData$strName$_SESSION['CHECKOUT_DATA']['payment'][$this->id][$field]));

                
    // validate the posted data
                
    if ($this->Input->post('FORM_SUBMIT') == 'iso_mod_checkout_payment' && $arrPayment['module'] == $this->id)
                {
                    
    $objWidget->validate();

                    if (
    $objWidget->hasErrors())
                    {
                        
    $objCheckoutModule->doNotSubmit true;
                    }
                }

                
    $strBuffer.= $objWidget->parse();
            }

            
    // add error message
            
    if (strlen($_SESSION['CHECKOUT_DATA']['payment'][$this->id]['error']))
            {
                
    $strBuffer '<p class="error">' $_SESSION['CHECKOUT_DATA']['payment'][$this->id]['error'] . '</p>' $strBuffer;
                unset(
    $_SESSION['CHECKOUT_DATA']['payment'][$this->id]['error']);
            }

            return 
    $strBuffer;
        }

        
    /**
         * Return the checkout review information
         *
         * Displays the provided account data:
         *  - account holder
         *  - account number (obfuscated)
         *  - account routing number.
         *
         * @return string                The account data as html
         */
        
    public function checkoutReview()
        {
            
    // collect data from session
            
    $accHolder        $_SESSION['CHECKOUT_DATA']['payment'][$this->id]['acc_holder'];
            
    $accNumber        $_SESSION['CHECKOUT_DATA']['payment'][$this->id]['acc_number'];
            
    $accRoutingNumber $_SESSION['CHECKOUT_DATA']['payment'][$this->id]['acc_routing_number'];
            
    $accNumberObf     $this->getObfuscatedAccountNumber($accNumber);

            
    // html template
            
    $strBuffer '<span class="payment_label">%s</span>' PHP_EOL;
            
    $strBuffer.= '<div class="account_info">' PHP_EOL;
            
    $strBuffer.= '<span class="label">%s:</span> %s<br />' PHP_EOL;
            
    $strBuffer.= '<span class="label">%s:</span> %s<br />' PHP_EOL;
            
    $strBuffer.= '<span class="label">%s:</span> %s<br />' PHP_EOL;
            
    $strBuffer.= '</div>' PHP_EOL;

            
    // inject data into the html template
            
    return sprintf(
                    
    $strBuffer,

                    
    $this->label,

                    
    $GLOBALS['TL_LANG']['ISO']['acc_holder'],
                    
    $accHolder,

                    
    $GLOBALS['TL_LANG']['ISO']['acc_number'],
                    
    $accNumberObf,

                    
    $GLOBALS['TL_LANG']['ISO']['acc_routing_number'],
                    
    $accRoutingNumber
            
    );
        }

        
    /**
         * Obfuscates a account number
         *
         * Replaces all digits with asteriks (*) except the last four
         *
         * Examples:
         *  1093847569  ->  ******7569
         *       62534  ->  ******2534
         *          62  =>  ********62
         *
         * @param int|str $number       The account number
         * @return string               The obfuscated account number
         */
        
    public function getObfuscatedAccountNumber($number)
        {
            
    $number  = (string) $number;
            
    $visible $number;

            if (
    strlen($number) > 4) {
                
    $visible substr($number, (strlen($number) - 4));
            }

            return 
    sprintf("%'*10s"$visible);
        }

    Vielen Dank im Voraus,
    Gruß JaiBee

  2. #2
    Contao-Nutzer
    Registriert seit
    12.11.2010.
    Beiträge
    178

    Standard

    Ok, der Hook ist wohl rausgeflogen: https://www.contao-community.de/show...562#post156562

    … und hier noch ne Erklärung zum neuen Hook „postCheckout“. Komme aber noch nicht ganz klar.
    Geändert von JaiBee (30.03.2012 um 00:49 Uhr)

  3. #3
    Contao-Nutzer
    Registriert seit
    12.11.2010.
    Beiträge
    178

    Standard

    Bin kein großartiger PHPler, sonst wäre es bestimmt eine schnell erledigte Sache.

    Isotope_Payment_DirectDebitHelper.php – hier habe ich etwas rumgepfuscht
    PHP-Code:
    /**
     * Helper class for direct debit payment method
     *
     * Provides hook to inject direct debit payment data such as
     * the account holder on writing the order.
     *
     * @copyright  Copyright (c) 2010 Michael Gruschwitz <info@grusch-it.de>
     * @license    http://opensource.org/licenses/lgpl-3.0.html
     * @category   Contao
     * @package    Isotope
     * @subpackage Payment
     * @uses       Frontend
     */
    class Isotope_Payment_DirectDebitHelper extends Frontend
    {
        
    /**
         * Hook on writing the order
         *
         * TL_HOOKS::iso_writeOrder
         *
    deprecated:  * @param int|str $orderId                            The order id
         * @param bool $blnCheckout                            TODO: don't know what $blnCheckout realy is
         * @param ModuleIsotopeCheckout $isoModCheckout        Isotope checkout object
         * @return bool                                        TODO: don't know what $blnCheckout realy is

    new  * @param $isotope              IsotopeOrder Objekt.
         * @param $arrItemIds           IDs der Warenkorb Items
         * @param $arrData              Daten welche in der Email benutzt werden (erst ab RC1) 


         */
        
    public function onWriteOrder($isotope$arrItemIds$arrData)
        {
            
    // get payment modules that are _not_ of type directdebit
            
    $objModules $this->Database->execute("SELECT * FROM tl_iso_payment_modules WHERE type!='directdebit' AND enabled='1'");

            
    // iterate through the payment modules that are _not_ of type directdebit
            // because we only want to inject account data if directdebit was selected
            
    while ($objModules->next()) {
                
    // the current selected payment module is not type of directdebit, so stop here
                
    if ($objModules->id == $paymentId) {
                    return 
    $blnCheckout;
                }
            }

            
    // collect data from the session
            
    $accHolder        $_SESSION['CHECKOUT_DATA']['payment'][$paymentId]['acc_holder'];
            
    $accNumber        $_SESSION['CHECKOUT_DATA']['payment'][$paymentId]['acc_number'];
            
    $accRoutingNumber $_SESSION['CHECKOUT_DATA']['payment'][$paymentId]['acc_routing_number'];
            
    // obfuscate the account number for the frontend
            //$accNumberObf     = $this->Isotope->Cart->Payment->getObfuscatedAccountNumber($accNumber);

            // inject data to the order data array
           /* $isotope->arrData = array_merge($arrData, array(
                'acc_holder'         => "holder " . $accHolder,
                'acc_number'         => "number " . $accNumber,
                'acc_number_obf'     => "number_obf " . $accNumberObf,
                'acc_routing_number' => "routing_number " . $accRoutingNumber
            ));*/

        
    array_insert($isotope->arrData0, array
        (
                
    'acc_holder'         => "holder: " $accHolder,
                
    'acc_number'         => "number: " $accNumber,
                
    'acc_number_obf'     => "number_obf: " $accNumberObf,
                
    'acc_routing_number' => "routing_number: " $accRoutingNumber
        
    ));


            return 
    $isotope;
        }


    config/config.php – neuen Checkout integriert
    PHP-Code:
    []
    $GLOBALS['ISO_HOOKS']['postCheckout'][] = array('Isotope_Payment_DirectDebitHelper''onWriteOrder');
    [

    IsotopeOrder.php
    PHP-Code:
    []
    // HOOK: process checkout
    if (isset($GLOBALS['ISO_HOOKS']['postCheckout']) && is_array($GLOBALS['ISO_HOOKS']['postCheckout']))
    {
        foreach (
    $GLOBALS['ISO_HOOKS']['postCheckout'] as $callback)
        {
            
    $this->import($callback[0]);
            
    $this->$callback[0]->$callback[1]($this$arrItemIds$arrData);
        }
    }
    [

    Wer weiß Rat?

    Danke,
    Gruß


    EDIT:
    Happy Hacking direkt in der ModuleIsotopeCheckout.php ab Zeile 955. Ist natürlich eine unflexible und unschöne Übergangslösung, aber funktioniert immerhin:
    PHP-Code:
    $arrData array_merge($this->arrOrderData, array
    (
        
    'uniqid'            => $objOrder->uniqid,
        
    'items'                => $this->Isotope->Cart->items,
        
    'products'            => $this->Isotope->Cart->products,
        
    'subTotal'            => $this->Isotope->formatPriceWithCurrency($this->Isotope->Cart->subTotalfalse),
        
    'taxTotal'            => $this->Isotope->formatPriceWithCurrency($this->Isotope->Cart->taxTotalfalse),
        
    'shippingPrice'        => $this->Isotope->formatPriceWithCurrency($this->Isotope->Cart->Shipping->pricefalse),
        
    'paymentPrice'        => $this->Isotope->formatPriceWithCurrency($this->Isotope->Cart->Payment->pricefalse),
        
    'grandTotal'        => $this->Isotope->formatPriceWithCurrency($this->Isotope->Cart->grandTotalfalse),
        
    'cart_text'            => strip_tags($this->replaceInsertTags($this->Isotope->Cart->getProducts('iso_products_text'))),
        
    'cart_html'            => $this->replaceInsertTags($this->Isotope->Cart->getProducts('iso_products_html')),

        
    'acc_holder'            => $_SESSION['CHECKOUT_DATA']['payment']['3']['acc_holder'] ? "Kontoinhaber: " $_SESSION['CHECKOUT_DATA']['payment']['3']['acc_holder'] : '',
        
    'acc_number'            => $_SESSION['CHECKOUT_DATA']['payment']['3']['acc_number'] ? "Kontonummer:  " $_SESSION['CHECKOUT_DATA']['payment']['3']['acc_number'] : '',
        
    'acc_routing_number'        => $_SESSION['CHECKOUT_DATA']['payment']['3']['acc_routing_number'] ? "Bankleitzahl: " $_SESSION['CHECKOUT_DATA']['payment']['3']['acc_routing_number'] : '',
    ));    
    // ATTENTION: last 3 lines – DIRTY HACK 
    Geändert von JaiBee (30.03.2012 um 13:58 Uhr) Grund: better hack…

  4. #4
    Contao-Nutzer
    Registriert seit
    18.02.2010.
    Beiträge
    163

    Standard

    Hallo,

    hab das gleiche Problem. Hab versucht, das was du gemacht hast, nachzuvollziehen, komme aber zu keinem brauchbaren Ergebnis.
    Irgendwelche Tipps?

    Gruß

  5. #5
    Contao-Nutzer
    Registriert seit
    12.11.2010.
    Beiträge
    178

    Standard

    Zitat Zitat von d23 Beitrag anzeigen
    Irgendwelche Tipps?
    Hmm… arg viel mehr kann ich dazu nicht sagen. Ich habe die Erweiterung isotope_payment_directdebit installiert, die Datei ModuleIsotopeCheckout.php wie beschrieben erweitert und dann in der E-Mail-Vorlage die Simple Tokens (wie etwa ##acc_holder##) eingefügt.

    Gruß

  6. #6
    Contao-Nutzer
    Registriert seit
    18.02.2010.
    Beiträge
    163

    Standard

    Achso, an den anderen Dateien hast du gar nichts verändert?

  7. #7
    Contao-Nutzer
    Registriert seit
    12.11.2010.
    Beiträge
    178

    Standard

    Zitat Zitat von d23 Beitrag anzeigen
    Achso, an den anderen Dateien hast du gar nichts verändert?
    Nee, ich glaube, dass war nur ein Versuch, das Ganze sauber und updatesicher zu integrieren. Die Anpassung von ModuleIsotopeCheckout.php geht bei jedem Update von Isotope verloren!

    Gruß

  8. #8
    Contao-Nutzer
    Registriert seit
    18.02.2010.
    Beiträge
    163

    Standard

    Zitat Zitat von JaiBee Beitrag anzeigen
    Nee, ich glaube, dass war nur ein Versuch, das Ganze sauber und updatesicher zu integrieren. Die Anpassung von ModuleIsotopeCheckout.php geht bei jedem Update von Isotope verloren!
    Hab das eben mal versucht - leider ohne Erfolg.
    Bei welchen Versionen hast du das lauffähig bekommen?
    Hier: Contao 2.11.3 und Isotope 1.3.1

  9. #9
    Contao-Nutzer
    Registriert seit
    12.11.2010.
    Beiträge
    178

    Standard ID anpassen

    Zitat Zitat von d23 Beitrag anzeigen
    Hab das eben mal versucht - leider ohne Erfolg.
    Bei welchen Versionen hast du das lauffähig bekommen?

    Contao 2.11.2; Isotope 1.3.0.

    Mir fällt eben noch ein, dass du die ID der Zahlungsart "directdebit" ggf. noch anpassen musst. Also die '3' ggf. durch die ID, die unter "Shop-Konfiguration -> Zahlungsarten -> directbit" angezeigt wird, ersetzen.

    Gruß

  10. #10
    Contao-Nutzer
    Registriert seit
    18.02.2010.
    Beiträge
    163

    Daumen hoch

    Zitat Zitat von JaiBee Beitrag anzeigen

    Mir fällt eben noch ein, dass du die ID der Zahlungsart "directdebit" ggf. noch anpassen musst. Also die '3' ggf. durch die ID, die unter "Shop-Konfiguration -> Zahlungsarten -> directbit" angezeigt wird, ersetzen.
    BÄM! Und damit hast Du Dir einen Platz ganz weit oben in meinem kleinen schwarzen Buch der coolen Leute gesichert!
    Das war's nämlich, was noch gefehlt hat. Jetzt funzt das!

    Habt vielmals Dank werter Herr!

  11. #11
    Contao-Nutzer
    Registriert seit
    12.11.2010.
    Beiträge
    178

    Standard

    Hehe, gern geschehen .

    An einer sauberen Lösung bin ich weiterhin interessiert, falls hier noch jemand mitliest.

    Gruß

  12. #12
    Contao Core-Team
    Association Vorstand
    Avatar von andreas.schempp
    Registriert seit
    15.06.2009.
    Ort
    Lyss
    Beiträge
    5.619
    Partner-ID
    8667
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Von wem ist denn dieses Modul? Es wäre Aufgabe des Moduls die Daten korrekt zu speichern und in den Bestelldetails auszugeben...
    terminal42 gmbh
    Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
    Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle

  13. #13
    Contao-Nutzer
    Registriert seit
    12.11.2010.
    Beiträge
    178

    Standard

    Zitat Zitat von andreas.schempp Beitrag anzeigen
    Von wem ist denn dieses Modul? Es wäre Aufgabe des Moduls die Daten korrekt zu speichern und in den Bestelldetails auszugeben...
    Ja, prinzipiell schon; jedoch ist das Modul zur aktuellen Version von Isotope nicht kompatibel, da es den Hook iso_writeOrder nicht mehr gibt. Mit dem neuen Hook postCheckout habe zumindest ich es nicht hinbekommen.

    Gruß

  14. #14
    Contao-Nutzer
    Registriert seit
    01.10.2010.
    Beiträge
    18

    Standard

    Erweiterung ist an Isotope 1.3 angepasst.

    Die Daten werden aber vorerst weiterhin nicht in der Datenbank gespeichert. In einer späteren Version ist aber das (verschlüsselte) Speichern sowie eine Bankleitzahlprüfungen mit automatischer Ermittlung des Kreditinstituts geplant.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •