1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Payment\Model;
use Magento\Framework\App\ObjectManager;
use Magento\Payment\Model\Method\AbstractMethod;
/**
* Methods List service class.
*
* @api
* @since 100.0.2
*/
class MethodList
{
/**
* @var \Magento\Payment\Helper\Data
* @deprecated 100.1.0 Do not use this property in case of inheritance.
*/
protected $paymentHelper;
/**
* @var \Magento\Payment\Model\Checks\SpecificationFactory
* @deprecated 100.2.0 Do not use this property in case of inheritance.
*/
protected $methodSpecificationFactory;
/**
* @var \Magento\Payment\Api\PaymentMethodListInterface
*/
private $paymentMethodList;
/**
* @var \Magento\Payment\Model\Method\InstanceFactory
*/
private $paymentMethodInstanceFactory;
/**
* @param \Magento\Payment\Helper\Data $paymentHelper
* @param Checks\SpecificationFactory $specificationFactory
*/
public function __construct(
\Magento\Payment\Helper\Data $paymentHelper,
\Magento\Payment\Model\Checks\SpecificationFactory $specificationFactory
) {
$this->paymentHelper = $paymentHelper;
$this->methodSpecificationFactory = $specificationFactory;
}
/**
* @param \Magento\Quote\Api\Data\CartInterface $quote
* @return \Magento\Payment\Model\MethodInterface[]
*/
public function getAvailableMethods(\Magento\Quote\Api\Data\CartInterface $quote = null)
{
$store = $quote ? $quote->getStoreId() : null;
$availableMethods = [];
foreach ($this->getPaymentMethodList()->getActiveList($store) as $method) {
$methodInstance = $this->getPaymentMethodInstanceFactory()->create($method);
if ($methodInstance->isAvailable($quote) && $this->_canUseMethod($methodInstance, $quote)) {
$methodInstance->setInfoInstance($quote->getPayment());
$availableMethods[] = $methodInstance;
}
}
return $availableMethods;
}
/**
* Check payment method model
*
* @param \Magento\Payment\Model\MethodInterface $method
* @param \Magento\Quote\Api\Data\CartInterface $quote
* @return bool
*/
protected function _canUseMethod($method, \Magento\Quote\Api\Data\CartInterface $quote)
{
return $this->methodSpecificationFactory->create(
[
AbstractMethod::CHECK_USE_CHECKOUT,
AbstractMethod::CHECK_USE_FOR_COUNTRY,
AbstractMethod::CHECK_USE_FOR_CURRENCY,
AbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]
)->isApplicable(
$method,
$quote
);
}
/**
* Get payment method list.
*
* @return \Magento\Payment\Api\PaymentMethodListInterface
*/
private function getPaymentMethodList()
{
if ($this->paymentMethodList === null) {
$this->paymentMethodList = ObjectManager::getInstance()->get(
\Magento\Payment\Api\PaymentMethodListInterface::class
);
}
return $this->paymentMethodList;
}
/**
* Get payment method instance factory.
*
* @return \Magento\Payment\Model\Method\InstanceFactory
*/
private function getPaymentMethodInstanceFactory()
{
if ($this->paymentMethodInstanceFactory === null) {
$this->paymentMethodInstanceFactory = ObjectManager::getInstance()->get(
\Magento\Payment\Model\Method\InstanceFactory::class
);
}
return $this->paymentMethodInstanceFactory;
}
}