마 젠토 2-결제 방법에 따라 할인이 적용되지 않습니다


13

Magento 2 관리자> 마케팅> 프로모션> 장바구니 가격 규칙으로 이동하여 은행 송금 결제 :

탭 규칙 정보 :

  • 규칙 이름 : 은행 송금
  • 상태 : 활성
  • 웹 사이트 : 주요 웹 사이트
  • 고객 그룹 : 모두 선택
  • 쿠폰 : 쿠폰 없음
  • 고객 당 사용 : 0
  • 보낸 사람 : 공란
  • 받는 사람 : 공백
  • 우선 순위 : 0
  • RSS 피드에 공개 : 아니요

조건 탭 :

  • 이러한 조건이 모두 참인 경우 :
    • 결제 수단은 은행 송금 결제입니다

작업 탭 :

  • 적용 : 제품 가격 할인 비율
  • 할인 금액 : 2
  • 최대 수량 할인 적용 대상 : 0
  • 수량 단계 할인 (X 구매) : 0
  • 배송 금액에 적용 : 아니오
  • 후속 규칙 무시 : 아니오
  • 무료 배송 : 아니오
  • 다음 조건과 일치하는 장바구니 품목에만 규칙을 적용하십시오 (모든 품목에 대해 비워 두십시오).

그런 다음 은행 송금 결제 방법을 사용하도록 설정하고 결제 페이지로 이동 한 후 은행 송금 결제를 클릭하지만 할인 비율 가격이 주문 요약에 표시되지 않습니다.

여기에 이미지 설명을 입력하십시오

조언을 부탁드립니다. Magento 2에서 결제 방법을 할인 할 수있는 방법 Magento 1의 경우 잘 처리되었습니다.

매우 감사합니다


여기에 규칙을 게시 할 수 있습니까?
Khoa TruongDinh

규칙을 게시했습니다. 당신은 저를 확인할 수 있습니까?
Nguyễn Hồng Quang

규칙의 활성화 날짜를 추가하려고합니까?
Khoa TruongDinh

나는 규칙의 시작 날짜를 추가하려고 시도하지만 은행 송금 지불 옵션을 클릭해도 여전히 주문 요약에 아무 것도 발생하지 않습니다
Nguyễn Hồng Quang

1
감사. 여기에 문제를 게시했습니다 : github.com/magento/magento2/issues/5937
Nguyễn Hồng Quang

답변:


11

Magento 2는 결제 수단을 선택할 때 견적을 위해 견적을 저장하지 않기 때문에이 규칙이 작동하지 않습니다. 또한 결제 방법을 선택할 때 총계를 다시로드하지 않습니다. 불행히도 문제를 해결하려면 사용자 정의 모듈을 작성해야합니다.

새 모듈은 4 개의 파일 만 작성하면됩니다.

  1. app / code / 네임 스페이스 /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>

    이것은 우리 모듈을위한 새로운 컨트롤러를 정의 할 것입니다.

  2. app / code / 네임 스페이스 /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();
        }
    }

    이 파일은 선택된 지불 방법을 견적으로 저장하는 컨트롤러 작업을 생성합니다.

  3. app / code / 네임 스페이스 /ModuleName/view/frontend/requirejs-config.js

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

    이 파일은 파일을 무시할 수 Magento_Checkout/js/action/select-payment-method있습니다

  4. app / code / 네임 스페이스 /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();
                    }
                });
    
            }
        }
    );

    지불 방법을 저장하고 장바구니 총계를 다시로드하도록 ajax 요청을 보냅니다.

PS 코드 일부는 Magento 2의 지불 수수료 연장 에서 가져 왔습니다 .


1
매우 MagestyApps 감사합니다, 나는 당신의 지시에 따라 새로운 모듈을 만들었습니다. 그러나 결국이 문제 jquery.js 192.168.41.59/phoenix_checkout/checkout/applyPaymentMethod 404 (Not Found) 이 발생했습니다 . 이 버그를 전에 받았습니까?
Nguyễn Hồng Quang

1
정말 잘 작동합니다. 감사합니다 MagestyApps. 이 솔루션은 완벽합니다.
Nguyễn Hồng Quang

작동합니다, 당신은 내 시간을 절약했습니다. 감사합니다 :)
Sameer Bhayani 2016 년

대단해 결제 수단에 대한 장바구니 가격 규칙이 btw에서 제거되었습니다 ( github.com/magento/magento2/commit/… ). " 'payment_method'=> __ ( 'Payment Method')"행을 다시 추가했습니다. 이제 결제 방법에 대한 장바구니 가격 규칙을 만들 수 있습니다.
DaFunkyAlex

이것은 많은 도움이되었습니다. 감사. +1 :)
Shoaib Munir

3

Magento 2.2에서 MagestyApps 답변을 얻지 못했습니다. 추가 파일을 추가해야했습니다. 때문에:

  • 결제 방법 대한 장바구니 가격 규칙이 관리자 에서 제거되었습니다 (DaFunkyAlex에서 지적한대로).
  • Magento 2.2에서는 견적서에 할인이 적용되지 않았는데, 그 방법 \Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod::generateFilterText(실제로 는이 방법 \Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address::generateFilterText으로 돌아옴) payment_method은 견적서 주소에 데이터 가 설정 될 것으로 예상 했기 때문입니다 .
  • payment_method견적 주소에 데이터 를 설정하기 위해 MagestyApps 응답에서 컨트롤러를 변경하더라도 견적이 지속되지 않기 때문에 견적이 주문되었을 때 작동하지 않았습니다 payment_method.

다음 모듈이 나를 위해 일했습니다 (MagestyApps 답변 덕분에 그 위에 기반했습니다).

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>

컨트롤러 / 체크 아웃 /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();
    }
}

모델 / 규칙 / 조건 / FilterTextGenerator / 주소 /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;
    }
}

플러그인 /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 / requirejs-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();
                }
            });

        }
    }
);

컴파일하려고 할 때 이것을 얻습니다 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. Magento 2.2.2
Alexandros

magento 2.1.9의 경우 AdvancedSalesRule 부품을 생략해야합니까?
Doni Wibowo

컴파일시 오류 발생 : 치명적인 오류 : 7 행의 Vendor / SalesRulesPaymentMethod / Model / Rule / Condition / FilterTextGenerator / Address / PaymentMethod.php에서 'Magento \ AdvancedSalesRule \ Model \ Rule \ Condition \ Address \ PaymentMethod'클래스를 찾을 수 없음
Magecode

AdvancedSalesRule은 Magento 2.1.5에서 사용할 수 없습니다
Magecode

2

방금 동일한 규칙을 확인했는데 작동하지 않는 것으로 나타났습니다. 동일한 조건을 사용하면 선택한 선택한 방법에 대한 정보가 전송되지 않으며 주문이 이루어질 때까지 기록되지 않으며 규칙이 작동하지 않을 수 있습니다.

여기에 이미지 설명을 입력하십시오

주소는 확인 전까지 결제 수단이 없으며 정보가 전송되지 않았기 때문에 존재하지 않는 결제 견적서에서 결제 수단을 가져옵니다 ( $model->getQuote()->getPayment()->getMethod()returns null).

여기에 이미지 설명을 입력하십시오

우리는 이것이 마 젠토 버그라고 가정합니다. 지불 방법을 선택할 때는 정보를 미리 보내야합니다.


2
MagestyApps의 답변이 승인됩니다. 감사.
Nguyễn Hồng Quang

1

사용자 정의 모듈이있는 솔루션이 작동 중입니다.

방금 Magento 초보자가이 모듈을 추가하고 활성화하려면 이러한 파일을 추가해야한다는 것을 아는 것이 유용한 정보라고 생각했습니다.

(다른 모듈에서 복사하고 모듈 이름과 네임 스페이스에 따라 파일을 변경하십시오)

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

그럼 당신은 실행할 수있을 것입니다 bin/magento setup:upgrade


0

파일을 만들고 네임 스페이스와 모듈 이름을 바꾸었지만 내 파일이 실행되지 않는다고 생각합니다.

어쩌면 내 파일에 오류가 있습니까 ??

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

실제로, magento 코어 파일을 재정의하는 것은 좋은 생각이 아닙니다. 재정의하는 대신 Magento_Checkout/js/action/select-payment-method믹스 인을 만드는 것이 좋습니다. 새로운 컨트롤러를 만들지 않고도 처리 할 수 ​​있습니다. 아래를 참조하십시오 (@magestyapps 답변 외에도)

  1. app / code / 네임 스페이스 /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 / 네임 스페이스 /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();
                });
            });
        };
    });

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.