Magento 2 - chiết khấu tùy thuộc vào Phương thức thanh toán không hoạt động


13

Tôi đi tới Quản trị viên Magento 2 > Tiếp thị> Khuyến mãi> Quy tắc giá giỏ hàng và tạo Quy tắc mới: Thanh toán chuyển khoản ngân hàng:

Thông tin quy tắc tab:

  • Tên quy tắc: Thanh toán chuyển khoản ngân hàng
  • Trạng thái: Đang hoạt động
  • Trang web: Trang web chính
  • Nhóm khách hàng: chọn tất cả
  • Phiếu giảm giá: Không có phiếu giảm giá
  • Sử dụng cho mỗi khách hàng: 0
  • Từ: trống
  • Tim khoảng trông
  • Ưu tiên: 0
  • Công khai trong RSS Feed: Không

Tab điều kiện:

  • Nếu TẤT CẢ các điều kiện này là ĐÚNG:
    • Phương thức thanh toán là Chuyển khoản ngân hàng

Tab hành động:

  • Áp dụng: phần trăm chiết khấu giá sản phẩm
  • Số tiền chiết khấu: 2
  • Giảm giá tối đa Qty được áp dụng cho: 0
  • Bước giảm giá (Mua X): 0
  • Áp dụng cho số tiền vận chuyển: Không
  • Hủy các quy tắc tiếp theo: Không
  • Giao hàng miễn phí: Không
  • Chỉ áp dụng quy tắc cho các mục giỏ hàng phù hợp với các điều kiện sau (để trống cho tất cả các mục): không có gì

Sau đó, tôi kích hoạt phương thức Thanh toán chuyển khoản ngân hàng, chuyển đến trang thanh toán, nhấp vào Thanh toán chuyển khoản ngân hàng nhưng Giá phần trăm chiết khấu không hiển thị trong Tóm tắt đơn hàng.

nhập mô tả hình ảnh ở đây

Xin hãy cho tôi một lời khuyên. Làm cách nào để giảm giá cho phương thức thanh toán trên Magento 2. Đối với Magento 1, nó sẽ hoạt động tốt.

Cảm ơn rất nhiều


Bạn có thể đăng quy tắc của bạn ở đây?
Khoa TruongDinh

Tôi đã đăng Quy tắc của mình. Bạn có thể kiểm tra cho tôi xin vui lòng?
Nguyễn Hồng Quang

Hãy thử thêm ngày kích hoạt của quy tắc?
Khoa TruongDinh

Tôi cố gắng thêm Ngày bắt đầu của quy tắc nhưng vẫn không có gì xảy ra trong Tóm tắt đơn hàng khi nhấp vào tùy chọn Thanh toán chuyển khoản ngân hàng
Nguyễn Hồng Quang

1
Cảm ơn. Tôi đã đăng vấn đề ở đây: github.com/magento/magento2/issues/5937
Nguyễn Hồng Quang

Câu trả lời:


11

Quy tắc này không hoạt động vì Magento 2 không lưu phương thức thanh toán để trích dẫn khi bạn chọn. Và nó cũng không tải lại tổng số khi chọn phương thức thanh toán. Và thật không may, bạn phải viết một mô-đun tùy chỉnh để giải quyết vấn đề.

Mô-đun mới chỉ cần tạo 4 tệp:

  1. ứng dụng / mã / Không gian tên / ModuleName / etc / frontend / Rout.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>

    Điều này sẽ xác định một bộ điều khiển mới cho mô-đun của chúng tôi.

  2. ứng dụng / mã / Không gian tên / ModuleName / Trình điều khiển / 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();
        }
    }

    Tệp này tạo hành động của bộ điều khiển để lưu phương thức thanh toán đã chọn để trích dẫn

  3. ứng dụng / mã / Không gian tên / ModuleName / view / frontend / allowjs-config.js

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

    Tập tin này cho phép ghi đè Magento_Checkout/js/action/select-payment-methodtập tin

  4. ứng dụng / mã / 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();
                    }
                });
    
            }
        }
    );

    Gửi yêu cầu ajax để lưu phương thức thanh toán và tải lại tổng số giỏ hàng.

Phần PS của mã được lấy từ phần mở rộng Phí thanh toán cho Magento 2.


1
Cảm ơn rất nhiều MagestyApps, tôi đã tạo ra một Mô-đun mới theo hướng dẫn của bạn. Tuy nhiên, cuối cùng tôi đã gặp vấn đề này jquery.js 192.168.41.59/phoenix_checkout/checkout/applyPaymentMethod 404 (Không tìm thấy). Bạn đã nhận được lỗi này trước?
Nguyễn Hồng Quang

1
Nó hoạt động thực sự tốt. Cảm ơn MagestyApps rất nhiều. Giải pháp này là hoàn hảo.
Nguyễn Hồng Quang

Nó hoạt động, Bạn đã tiết kiệm thời gian của tôi. Cảm ơn bạn :)
Sameer Bhayani

Công cụ tuyệt vời, thx. Quy tắc giá giỏ hàng cho phương thức thanh toán đã bị xóa btw ( github.com/magento/magento2/commit/ mẹo ). Tôi đã thêm dòng "'Payment_method' => __ ('Phương thức thanh toán')," bây giờ tôi có thể tạo quy tắc giá giỏ hàng cho phương thức thanh toán.
DaFunkyAlex

Điều này đã giúp rất nhiều. Cảm ơn. +1 :)
Shoaib Munir

3

Trên Magento 2.2 tôi không thể làm cho câu trả lời của MagestyApps hoạt động. Tôi cần thêm một số tập tin bổ sung. Bởi vì:

  • Quy tắc giá giỏ hàng cho phương thức thanh toán đã bị xóa khỏi quản trị viên (như được chỉ ra bởi DaFunkyAlex);
  • Trong Magento 2.2, việc giảm giá không được áp dụng trên báo giá, bởi vì phương thức \Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod::generateFilterText(thực tế là nó quay trở lại \Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address::generateFilterText), đã hy vọng dữ liệu payment_methodsẽ được đặt trên các địa chỉ báo giá;
  • Ngay cả việc thay đổi bộ điều khiển từ câu trả lời của MagestyApps để đặt payment_methoddữ liệu trên các địa chỉ báo giá, cũng không hoạt động khi báo giá trở thành đơn đặt hàng, vì nó không tồn tại payment_method;

Mô-đun sau đây phù hợp với tôi (nhờ câu trả lời của MagestyApps, nó dựa trên cơ sở đó):

đăng ký.php

<?php

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

vv / 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>

vv / 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>

vv / frontend / Rout.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>

Trình điều khiển / Thanh toán / 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();
    }
}

Mô hình / Quy tắc / Điều kiện / FilterTextGenerator / Địa chỉ / 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;
    }
}

xem / frontend / allowjs-config.js

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

xem / frontend / web / js / hành động / 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();
                }
            });

        }
    }
);

Tôi nhận được điều này khi cố gắng biên dịch : 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. Tôi thậm chí đã cố gắng thay đổi AdvancedSalesRule thành SalesRule vì tôi có thể thấy không có Mô hình AdvancedSalesRule nào trong Magento 2.2.2
Alexandros

đối với magento 2.1.9, chúng ta có nên bỏ qua các phần AdvancedSalesRule không?
Doni Wibowo

Bắt lỗi khi biên dịch: Fatal error: Class 'Magento \ AdvancedSalesRule \ mẫu \ Rule \ Điều kiện \ Địa chỉ \ PAYMENTMETHOD' không tìm thấy trong người bán hàng / SalesRulesPaymentMethod / mẫu / Rule / Điều Kiện / FilterTextGenerator / Địa chỉ / PaymentMethod.php trên dòng 7
Magecode

AdvancedSalesRule không khả dụng trong Magento 2.1.5
Magecode 22/03/19

2

Chúng tôi chỉ kiểm tra quy tắc tương tự và thấy rằng nó không hoạt động. Sử dụng cùng điều kiện, không có thông tin nào về phương thức được chọn được gửi và nó không được ghi lại ở bất cứ đâu cho đến khi đơn hàng được đặt và quy tắc có thể không hoạt động.

nhập mô tả hình ảnh ở đây

Địa chỉ không có phương thức thanh toán cho đến khi xác thực và nó nhận được phương thức thanh toán từ báo giá thanh toán không tồn tại vì không có thông tin nào được gửi ( $model->getQuote()->getPayment()->getMethod()trả lại null).

nhập mô tả hình ảnh ở đây

Chúng tôi cho rằng, đây là lỗi Magento. Khi bạn chọn phương thức thanh toán, thông tin sẽ được gửi trước.


2
Câu trả lời từ MagestyApps được chấp nhận. Cảm ơn.
Nguyễn Hồng Quang

1

Các giải pháp với các mô-đun tùy chỉnh đang làm việc.

Tôi chỉ nghĩ rằng nó sẽ là thông tin hữu ích cho người mới bắt đầu Magento biết rằng bạn cũng cần thêm các tệp này để có thể thêm và kích hoạt mô-đun này:

(sao chép từ một mô-đun khác và thay đổi tệp theo tên và không gian tên mô-đun của bạn)

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

sau đó bạn sẽ có thể chạy bin/magento setup:upgrade


0

tôi đã tạo các tệp và thay thế Không gian tên và tên mô-đun nhưng tôi nghĩ các tệp của tôi sẽ không được thực thi.

Có lẽ một lỗi trên tập tin của tôi ??

đăng ký.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"
    ]
}

}

mô-đun

<?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

Trên thực tế, ghi đè các tệp lõi magento không phải là một ý tưởng tốt. Thay vì ghi đè Magento_Checkout/js/action/select-payment-methodtốt hơn hãy tạo một mixin cho nó. Và bạn có thể tắt nó mà không cần tạo bộ điều khiển mới. Xem bên dưới (ngoài câu trả lời @magestyapps)

  1. ứng dụng / mã / Không gian tên / ModuleName / view / frontend / allowjs-config.js

        var config = {
            config: {
                mixins: {
                    'Magento_Checkout/js/action/select-payment-method': {
                        'Namespace_ModuleName/js/checkout/action/select-payment-method-mixin': true
                    },
                }
            }
        };
  2. ứng dụng / mã / 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();
                });
            });
        };
    });

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.