Magento 2 - diskon tergantung Metode Pembayaran tidak berfungsi

13

Saya pergi ke Magento 2 Admin> Pemasaran> Promosi> Aturan Harga Keranjang dan membuat Aturan baru: Pembayaran Transfer Bank:

Informasi Aturan Tab:

  • Nama Aturan: Pembayaran Transfer Bank
  • Status: Aktif
  • Situs web: Situs Web Utama
  • Grup Pelanggan: pilih semua
  • Kupon: Tidak Ada Kupon
  • Penggunaan per Pelanggan: 0
  • Dari: blank
  • Kepada: kosong
  • Prioritas: 0
  • Publik di Umpan RSS: Tidak

Tab Ketentuan:

  • Jika SEMUA kondisi ini BENAR:
    • Metode Pembayaran adalah Pembayaran Transfer Bank

Tab Tindakan:

  • Berlaku: persen dari diskon harga produk
  • Jumlah Diskon: 2
  • Diskon Qty Maksimum Berlaku Untuk: 0
  • Diskon Jumlah Langkah (Beli X): 0
  • Berlaku untuk Jumlah Pengiriman: No
  • Buang aturan selanjutnya: Tidak
  • Gratis Pengiriman: Tidak
  • Terapkan aturan hanya untuk mengangkut item yang cocok dengan kondisi berikut (biarkan kosong untuk semua item): tidak ada

Kemudian saya mengaktifkan metode Pembayaran Transfer Bank, buka halaman checkout, klik Pembayaran Transfer Bank tetapi Harga Diskon Persen tidak muncul dalam Ringkasan Pesanan.

masukkan deskripsi gambar di sini

Tolong beri saya saran. Bagaimana cara membuat diskon pada metode pembayaran di Magento 2. Untuk Magento 1, itu tergerus dengan baik.

Terima kasih banyak

Nguyễn Hồng Quang
sumber
Anda dapat memposting aturan Anda di sini?
Khoa TruongDinh
Saya memposting Aturan saya. Bisakah Anda memeriksa saya?
Nguyễn Hồng Quang
Coba tambahkan tanggal aturan yang diaktifkan?
Khoa TruongDinh
Saya mencoba untuk menambahkan Tanggal mulai aturan tetapi masih tidak ada yang terjadi dalam Ringkasan Pesanan ketika mengklik opsi Pembayaran Transfer Bank
Nguyễn Hồng Quang
1
Terima kasih. Saya memposting masalah ini di sini: github.com/magento/magento2/issues/5937
Nguyễn Hồng Quang

Jawaban:

11

Aturan ini tidak berfungsi karena Magento 2 tidak menyimpan metode pembayaran untuk mengutip ketika Anda memilihnya. Dan itu juga tidak memuat ulang total ketika memilih metode pembayaran. Dan sayangnya, Anda harus menulis modul khusus untuk menyelesaikan masalah.

Modul baru hanya membutuhkan 4 file yang akan dibuat:

  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>

    Ini akan menentukan pengontrol baru untuk modul kami.

  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();
        }
    }

    File ini membuat tindakan pengontrol untuk menyimpan metode pembayaran yang dipilih untuk mengutip

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

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

    File ini memungkinkan untuk mengganti Magento_Checkout/js/action/select-payment-methodfile

  4. app / code / Namespace / ModuleName / view / frontend / web / js / action / select-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();
                    }
                });
    
            }
        }
    );

    Mengirim permintaan ajax untuk menyimpan metode pembayaran dan memuat ulang total keranjang.

PS Bagian dari kode diambil dari ekstensi Biaya Pembayaran untuk Magento 2.

MagestyApps
sumber
1
Terima kasih banyak MagestyApps, saya membuat Modul baru mengikuti instruksi Anda. Namun, pada akhirnya saya mendapatkan masalah ini jquery.js 192.168.41.59/phoenix_checkout/checkout/applyPaymentMethod 404 (Tidak Ditemukan). Apakah Anda mendapatkan bug ini sebelumnya?
Nguyễn Hồng Quang
1
Ini bekerja dengan sangat baik. Terima kasih MagestyApps sangat banyak. Solusi ini sempurna.
Nguyễn Hồng Quang
Berhasil, Anda menghemat waktu saya. Terima kasih :)
Sameer Bhayani
Hal-hal luar biasa, terima kasih. Aturan harga Keranjang untuk metode pembayaran telah dihapus dengan baik ( github.com/magento/magento2/commit/… ). Saya menambahkan baris "'payment_method' => __ ('Metode Pembayaran')," lagi, sekarang saya dapat membuat aturan harga keranjang untuk metode pembayaran.
DaFunkyAlex
Ini sangat membantu. Terima kasih. +1 :)
Shoaib Munir
3

Di Magento 2.2 saya tidak bisa mendapatkan jawaban MagestyApps untuk bekerja. Saya perlu menambahkan beberapa file tambahan. Karena:

  • Aturan Harga Keranjang untuk Metode Pembayaran dihapus dari admin (seperti yang ditunjukkan oleh DaFunkyAlex);
  • Dalam Magento 2.2 diskon tidak diterapkan pada penawaran, karena metode \Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod::generateFilterText(sebenarnya kembali ke \Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address::generateFilterText), mengharapkan data yang payment_methodakan ditetapkan pada alamat kutipan;
  • Bahkan mengubah pengontrol dari MagestyApps jawaban untuk mengatur payment_methoddata pada alamat kutipan, tidak berfungsi ketika kutipan menjadi pesanan, karena tidak bertahan payment_method;

Modul berikut ini berfungsi untuk saya (terima kasih atas jawaban MagestyApps, yang didasarkan atas itu semua):

registrasi.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();
    }
}

Model / Aturan / Ketentuan / FilterTextGenerator / Alamat / 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;
    }
}

view / frontend / requireejs-config.js

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

view / frontend / web / js / action / select-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();
                }
            });

        }
    }
);
missoxd
sumber
Saya mendapatkan ini ketika mencoba untuk mengkompilasi: 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. Saya bahkan mencoba mengubah AdvancedSalesRule menjadi SalesRule karena saya dapat melihat tidak ada Model AdvancedSalesRule di Magento 2.2.2
Alexandros
untuk magento 2.1.9, haruskah kita menghilangkan bagian AdvancedSalesRule?
Doni Wibowo
Mendapatkan kesalahan saat mengkompilasi: Kesalahan fatal: Kelas 'Magento \ AdvancedSalesRule \ Model \ Rule \ Condition \ Address \ PaymentMethod' tidak ditemukan di Vendor / SalesRulesPaymentMethod / Model / Rule / Condition / FilterTextGenerator / Alamat / PaymentMethod.php pada baris 7
Magecode
AdvancedSalesRule tidak tersedia di Magento 2.1.5
Magecode
2

Kami baru saja memeriksa aturan yang sama dan ternyata tidak berfungsi. Dengan menggunakan kondisi yang sama, tidak ada informasi tentang metode yang dipilih dikirim dan tidak dicatat di mana pun sampai pesanan ditempatkan dan aturan mungkin tidak berfungsi.

masukkan deskripsi gambar di sini

Alamat tidak memiliki metode pembayaran hingga validasi dan mendapatkan metode pembayaran dari kutipan pembayaran yang tidak ada karena tidak ada informasi yang dikirim ( $model->getQuote()->getPayment()->getMethod()pengembalian null).

masukkan deskripsi gambar di sini

Kami menduga, bahwa ini adalah bug Magento. Ketika Anda memilih metode pembayaran, informasi tersebut harus dikirim terlebih dahulu.

MageWorx
sumber
2
Jawaban dari MagestyApps diterima. Terima kasih.
Nguyễn Hồng Quang
1

Solusi dengan modul khusus berfungsi.

Saya hanya berpikir bahwa ini akan menjadi info yang berguna bagi pemula Magento untuk mengetahui bahwa Anda juga perlu menambahkan file-file ini untuk dapat menambah dan mengaktifkan modul ini:

(salin dari modul yang berbeda dan ubah file sesuai dengan nama modul dan namespace Anda)

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

maka Anda akan bisa lari bin/magento setup:upgrade

Антон Скроботов
sumber
0

saya membuat file dan mengganti Namespace dan modulename tetapi saya pikir file saya tidak akan dieksekusi.

Mungkin ada kesalahan pada file saya ??

registrasi.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>
Tobi
sumber
0

sebenarnya, menimpa file inti magento bukanlah ide yang baik. Alih-alih menimpa Magento_Checkout/js/action/select-payment-methodlebih baik buat mixin untuk itu. Dan Anda dapat menanganinya tanpa membuat controller baru. Lihat di bawah (selain jawaban @magestyapps)

  1. app / code / Namespace / ModuleName / view / frontend / requireejs-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 / checkout / action / select-payment-method-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();
                });
            });
        };
    });
Styopchik
sumber