Magento 2 - lo sconto dipende dal metodo di pagamento non funziona


13

Vado su Magento 2 Admin> Marketing> Promozioni> Regole dei prezzi del carrello e creo una nuova regola: Pagamento tramite bonifico bancario:

Informazioni sulle regole della scheda:

  • Nome regola: Pagamento tramite bonifico bancario
  • Stato: attivo
  • Siti Web: sito Web principale
  • Gruppi di clienti: selezionare tutto
  • Coupon: nessun coupon
  • Usi per cliente: 0
  • Da: vuoto
  • A: vuoto
  • Priorità: 0
  • Pubblico nel feed RSS: No

Scheda Condizioni:

  • Se TUTTE queste condizioni sono VERE:
    • Il metodo di pagamento è il pagamento tramite bonifico bancario

Scheda Azioni:

  • Applica: percentuale dello sconto sul prezzo del prodotto
  • Importo sconto: 2
  • Lo sconto quantità massima è applicato a: 0
  • Sconto Qtà Step (Acquista X): 0
  • Applica all'importo di spedizione: No
  • Elimina le regole successive: No
  • Spedizione gratuita: no
  • Applicare la regola solo per carrello articoli che soddisfano le seguenti condizioni (lasciare in bianco per tutti gli articoli): niente

Quindi abilito il metodo di pagamento con bonifico bancario, vai alla pagina di pagamento, fai clic su Pagamento con bonifico bancario ma il prezzo percentuale di sconto non viene visualizzato nel Riepilogo ordine.

inserisci qui la descrizione dell'immagine

Per favore, dammi un consiglio. Come fare uno sconto sul metodo di pagamento su Magento 2. Per Magento 1, funziona bene.

Grazie mille


Puoi pubblicare la tua regola qui?
Khoa TruongDinh,

Ho pubblicato la mia regola. Puoi controllarmi per favore?
Nguyễn Hồng Quang

Prova ad aggiungere la data attivata della regola?
Khoa TruongDinh

Provo ad aggiungere la Data di inizio della regola ma non succede ancora nulla nel Riepilogo dell'ordine quando faccio clic sull'opzione Pagamento
bonifico

1
Grazie. Ho pubblicato il problema qui: github.com/magento/magento2/issues/5937
Nguyễn Hồng Quang

Risposte:


11

Questa regola non funziona perché Magento 2 non salva il metodo di pagamento da quotare quando ne selezioni uno. Inoltre, non ricarica i totali quando si seleziona un metodo di pagamento. E sfortunatamente, devi scrivere un modulo personalizzato per risolvere il problema.

Il nuovo modulo richiede solo 4 file per essere creato:

  1. app / code / Namespace / ModuleName / etc / frontend / routes.xml

    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
        <router id="standard">
            <route id="namespace_modulename" frontName="namespace_modulename">
                <module name="Namespace_ModuleName"/>
            </route>
        </router>
    </config>

    Ciò definirà un nuovo controller per il nostro modulo.

  2. app / code / Namespace / ModuleName / Controller / Checkout / ApplyPaymentMethod.php

    <?php
    
    namespace Namespace\ModuleName\Controller\Checkout;
    
    class ApplyPaymentMethod extends \Magento\Framework\App\Action\Action
    {
        /**
         * @var \Magento\Framework\Controller\Result\ForwardFactory
         */
        protected $resultForwardFactory;
    
        /**
         * @var \Magento\Framework\View\LayoutFactory
         */
        protected $layoutFactory;
    
        /**
         * @var \Magento\Checkout\Model\Cart
         */
        protected $cart;
    
        /**
         * @param \Magento\Framework\App\Action\Context $context
         * @param \Magento\Framework\View\LayoutFactory $layoutFactory
         * @param \Magento\Framework\Controller\Result\ForwardFactory $resultForwardFactory
         */
        public function __construct(
            \Magento\Framework\App\Action\Context $context,
            \Magento\Framework\Controller\Result\ForwardFactory $resultForwardFactory,
            \Magento\Framework\View\LayoutFactory $layoutFactory,
            \Magento\Checkout\Model\Cart $cart
        ) {
            $this->resultForwardFactory = $resultForwardFactory;
            $this->layoutFactory = $layoutFactory;
            $this->cart = $cart;
    
            parent::__construct($context);
        }
    
        /**
         * @return \Magento\Framework\Controller\ResultInterface
         */
        public function execute()
        {
            $pMethod = $this->getRequest()->getParam('payment_method');
    
            $quote = $this->cart->getQuote();
    
            $quote->getPayment()->setMethod($pMethod['method']);
    
            $quote->setTotalsCollectedFlag(false);
            $quote->collectTotals();
            $quote->save();
        }
    }

    Questo file crea un'azione del controller per salvare il metodo di pagamento selezionato da quotare

  3. app / code / Namespace / ModuleName / view / frontend / requirejs-config.js

    var config = {
        map: {
            '*': {
                'Magento_Checkout/js/action/select-payment-method':
                    'Namespace_ModuleName/js/action/select-payment-method'
            }
        }
    };

    Questo file consente di sovrascrivere il Magento_Checkout/js/action/select-payment-methodfile

  4. app / code / Namespace / ModuleName / view / frontend / web / js / Azione / selezionare-Payment-method.js

    define(
        [
            'Magento_Checkout/js/model/quote',
            'Magento_Checkout/js/model/full-screen-loader',
            'jquery',
            'Magento_Checkout/js/action/get-totals',
        ],
        function (quote, fullScreenLoader, jQuery, getTotalsAction) {
            'use strict';
            return function (paymentMethod) {
                quote.paymentMethod(paymentMethod);
    
                fullScreenLoader.startLoader();
    
                jQuery.ajax('/namespace_modulename/checkout/applyPaymentMethod', {
                    data: {payment_method: paymentMethod},
                    complete: function () {
                        getTotalsAction([]);
                        fullScreenLoader.stopLoader();
                    }
                });
    
            }
        }
    );

    Invia una richiesta Ajax per salvare il metodo di pagamento e ricaricare i totali del carrello.

PS Parti del codice sono state prese dall'estensione della Commissione di pagamento per Magento 2.


1
Grazie mille MagestyApps, ho creato un nuovo modulo seguendo le tue istruzioni. Tuttavia, alla fine ho riscontrato questo problema jquery.js 192.168.41.59/phoenix_checkout/checkout/applyPaymentMethod 404 (Not Found). Hai ricevuto questo bug prima?
Nguyễn Hồng Quang

1
Funziona davvero bene. Grazie mille MagestyApps. Questa soluzione è perfetta
Nguyễn Hồng Quang

Funziona, mi hai risparmiato tempo. Grazie :)
Sameer Bhayani,

Roba fantastica, grazie. La regola del prezzo del carrello per i metodi di pagamento è stata rimossa tra ( github.com/magento/magento2/commit/… ). Ho aggiunto la riga "'payment_method' => __ ('Metodo di pagamento')," di nuovo, ora posso creare regole di prezzo del carrello per i metodi di pagamento.
DaFunkyAlex,

Questo ha aiutato molto. Grazie. +1 :)
Shoaib Munir,

3

Su Magento 2.2 non sono riuscito a ottenere la risposta di MagestyApps al lavoro. Avevo bisogno di aggiungere alcuni file aggiuntivi. Perché:

  • La regola del prezzo del carrello per il metodo di pagamento è stata rimossa dall'amministratore (come sottolineato da DaFunkyAlex);
  • In Magento 2.2 lo sconto non veniva applicato al preventivo, poiché il metodo \Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod::generateFilterText(in realtà ricorre a \Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address::generateFilterText) prevedeva che i dati payment_methodfossero impostati sugli indirizzi del preventivo;
  • Anche cambiando il controller dalla risposta di MagestyApps per impostare i payment_methoddati sugli indirizzi del preventivo, non ha funzionato quando il preventivo è diventato un ordine, perché non persiste payment_method;

Il seguente modulo ha funzionato per me (grazie alla risposta di MagestyApps, si basava su quello):

registration.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Vendor_SalesRulesPaymentMethod',
    __DIR__
);

etc / Module.xml

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Vendor_SalesRulesPaymentMethod" setup_version="1.0.0">
        <sequence>
            <module name="Magento_AdvancedSalesRule"/>
            <module name="Magento_Checkout"/>
            <module name="Magento_SalesRules"/>
            <module name="Magento_Quote"/>
        </sequence>
    </module>
</config>

etc / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod"
                type="Vendor\SalesRulesPaymentMethod\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod"/>
    <type name="Magento\SalesRule\Model\Rule\Condition\Address">
        <plugin name="addPaymentMethodOptionBack" type="Vendor\SalesRulesPaymentMethod\Plugin\AddPaymentMethodOptionBack" />
    </type>
</config>

etc / frontend / routes.xml

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="standard">
        <route id="salesrulespaymentmethod" frontName="salesrulespaymentmethod">
            <module name="Vendor_SalesRulesPaymentMethod"/>
        </route>
    </router>
</config>

Controller / Checkout / ApplyPaymentMethod.php

<?php

namespace Vendor\SalesRulesPaymentMethod\Controller\Checkout;

use Magento\Checkout\Model\Cart;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\ResponseInterface;
use Magento\Framework\Controller\Result\ForwardFactory;
use Magento\Framework\Controller\ResultInterface;
use Magento\Framework\View\LayoutFactory;
use Magento\Quote\Model\Quote;

class ApplyPaymentMethod extends Action
{
    /**
     * @var ForwardFactory
     */
    protected $resultForwardFactory;

    /**
     * @var LayoutFactory
     */
    protected $layoutFactory;

    /**
     * @var Cart
     */
    protected $cart;

    /**
     * @param Context $context
     * @param LayoutFactory $layoutFactory
     * @param ForwardFactory $resultForwardFactory
     */
    public function __construct(
        Context $context,
        ForwardFactory $resultForwardFactory,
        LayoutFactory $layoutFactory,
        Cart $cart
    ) {
        $this->resultForwardFactory = $resultForwardFactory;
        $this->layoutFactory = $layoutFactory;
        $this->cart = $cart;

        parent::__construct($context);
    }

    /**
     * @return ResponseInterface|ResultInterface|void
     * @throws \Exception
     */
    public function execute()
    {
        $pMethod = $this->getRequest()->getParam('payment_method');

        /** @var Quote $quote */
        $quote = $this->cart->getQuote();

        $quote->getPayment()->setMethod($pMethod['method']);

        $quote->setTotalsCollectedFlag(false);
        $quote->collectTotals();

        $quote->save();
    }
}

Modello / Regola / Condizione / FilterTextGenerator / Indirizzo / PaymentMethod.php

<?php

namespace Vendor\SalesRulesPaymentMethod\Model\Rule\Condition\FilterTextGenerator\Address;

use Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod as BasePaymentMethod;

class PaymentMethod extends BasePaymentMethod
{
    /**
     * @param \Magento\Framework\DataObject $quoteAddress
     * @return string[]
     */
    public function generateFilterText(\Magento\Framework\DataObject $quoteAddress)
    {
        $filterText = [];
        if ($quoteAddress instanceof \Magento\Quote\Model\Quote\Address) {
            $value = $quoteAddress->getQuote()->getPayment()->getMethod();
            if (is_scalar($value)) {
                $filterText[] = $this->getFilterTextPrefix() . $this->attribute . ':' . $value;
            }
        }

        return $filterText;
    }
}

Plugin / AddPaymentMethodOptionBack.php

<?php

namespace Vendor\SalesRulesPaymentMethod\Plugin;

use Magento\SalesRule\Model\Rule\Condition\Address;

class AddPaymentMethodOptionBack
{
    /**
     * @param Address $subject
     * @param $result
     * @return Address
     */
    public function afterLoadAttributeOptions(Address $subject, $result)
    {
        $attributeOption = $subject->getAttributeOption();
        $attributeOption['payment_method'] = __('Payment Method');

        $subject->setAttributeOption($attributeOption);

        return $subject;
    }
}

Vista / frontend / requirejs-config.js

var config = {
    map: {
        '*': {
            'Magento_Checkout/js/action/select-payment-method':
                'Vendor_SalesRulesPaymentMethod/js/action/select-payment-method'
        }
    }
};

view / frontend / web / js / Azione / selezionare-Payment-method.js

define(
    [
        'Magento_Checkout/js/model/quote',
        'Magento_Checkout/js/model/full-screen-loader',
        'jquery',
        'Magento_Checkout/js/action/get-totals',
    ],
    function (quote, fullScreenLoader, jQuery, getTotalsAction) {
        'use strict';
        return function (paymentMethod) {
            quote.paymentMethod(paymentMethod);

            fullScreenLoader.startLoader();

            jQuery.ajax('/salesrulespaymentmethod/checkout/applyPaymentMethod', {
                data: {payment_method: paymentMethod},
                complete: function () {
                    getTotalsAction([]);
                    fullScreenLoader.stopLoader();
                }
            });

        }
    }
);

Ottengo questo quando si cerca di compilare: Fatal error: Class 'Magento\AdvancedSalesRule\Model\Rule\Condition\Address\PaymentMethod' not found in Vendor/SalesRulesPaymentMethod/Model/Rule/Condition/FilterTextGenerator/Address/PaymentMethod.php on line 7. Ho anche provato a cambiare AdvancedSalesRule in SalesRule come posso vedere non c'è nessun modello AdvancedSalesRule in Magento 2.2.2
Alexandros

per magento 2.1.9, dovremmo omettere le parti AdvancedSalesRule?
Doni Wibowo,

Errore durante la compilazione: errore irreversibile: classe 'Magento \ AdvancedSalesRule \ Model \ Rule \ Condition \ Address \ PaymentMethod' non trovata in Vendor / SalesRulesPaymentMethod / Model / Rule / Condition / FilterTextGenerator / Address / PaymentMethod.php on line 7
Magecode

AdvancedSalesRule non è disponibile in Magento 2.1.5
Magecode

2

Abbiamo appena controllato la stessa regola e abbiamo scoperto che non funziona. Utilizzando le stesse condizioni, non viene inviata alcuna informazione sul metodo selezionato selezionato e non viene registrata da nessuna parte fino a quando l'ordine non viene inserito e la regola potrebbe non funzionare.

inserisci qui la descrizione dell'immagine

L'indirizzo non ha alcun metodo di pagamento fino alla convalida e ottiene il metodo di pagamento dal preventivo di pagamento che non esiste perché non sono state inviate informazioni ( $model->getQuote()->getPayment()->getMethod()resi null).

inserisci qui la descrizione dell'immagine

Supponiamo che questo sia un bug di Magento. Quando si sceglie un metodo di pagamento, le informazioni devono essere inviate in anticipo.


2
La risposta di MagestyApps è accettata. Grazie.
Nguyễn Hồng Quang

1

La soluzione con il modulo personalizzato sta funzionando.

Ho appena pensato che sarebbe utile che i principianti di Magento sappiano che è necessario aggiungere anche questi file per poter aggiungere e abilitare questo modulo:

(copia da un modulo diverso e modifica i file in base al nome e allo spazio dei nomi del modulo)

app/code/Namespace/ModuleName/composer.js
app/code/Namespace/ModuleName/registration.php
app/code/Namespace/ModuleName/etc/module.xml

allora saresti in grado di correre bin/magento setup:upgrade


0

ho creato i file e sostituito gli spazi dei nomi e il nome modul ma penso che i miei file non verranno eseguiti.

Forse un errore sui miei file ??

registration.php

<?php

use Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(
ComponentRegistrar::MODULE,
'Jacor_Checkoutpayment',
__DIR__
);

composer.json

{
"name": "jacor/checkoutpayment",
"autoload": {
    "psr-4": {
        "Jacor\\Checkoutpayment\\": ""
    },
    "files": [
        "registration.php"
    ]
}

}

Module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Jacor_Checkoutpayment" setup_version="1.0.0" />
</config>

0

in realtà, l'override dei file core di magento non è una buona idea. Invece di scavalcare Magento_Checkout/js/action/select-payment-methodmeglio creare un mixin per esso. E puoi deale senza creare un nuovo controller. Vedi sotto (oltre alla risposta di @magestyapps)

  1. app / code / Namespace / ModuleName / view / frontend / requirejs-config.js

        var config = {
            config: {
                mixins: {
                    'Magento_Checkout/js/action/select-payment-method': {
                        'Namespace_ModuleName/js/checkout/action/select-payment-method-mixin': true
                    },
                }
            }
        };
  2. app / code / Namespace / ModuleName / view / frontend / js / cassa / Azione / selezionare-Payment-metodo-mixin.js

        define([
        'jquery',
        'mage/utils/wrapper',
        'mage/storage',
        'Magento_Checkout/js/action/get-totals',
        'Magento_Checkout/js/model/full-screen-loader',
        'Magento_Checkout/js/model/quote',
        'Magento_Checkout/js/model/url-builder',
        'Magento_Customer/js/model/customer',
    ], function ($, wrapper, storage, getTotalsAction, fullScreenLoader, quote, urlBuilder, customer) {
        'use strict';
        return function (selectPaymentMethod) {
            return wrapper.wrap(selectPaymentMethod, function (originalAction, paymentMethod) {
                var serviceUrl, payload;
    
                originalAction(paymentMethod);
    
                payload = {
                    method: paymentMethod
                };
                if (customer.isLoggedIn()) {
                    serviceUrl = urlBuilder.createUrl('/carts/mine/selected-payment-method', {});
                } else {
                    serviceUrl = urlBuilder.createUrl('/guest-carts/:cartId/selected-payment-method', {
                        cartId: quote.getQuoteId()
                    });
                }
                fullScreenLoader.startLoader();
                storage.put(
                    serviceUrl,
                    JSON.stringify(payload)
                ).success(function () {
                    getTotalsAction([]);
                    fullScreenLoader.stopLoader();
                });
            });
        };
    });

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.