Completed
Push — master ( c2bc12...ef5bc2 )
by Dmitry
04:55
created

src/merchant/PurchaseRequestCollection.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * Finance module for HiPanel
4
 *
5
 * @link      https://github.com/hiqdev/hipanel-module-finance
6
 * @package   hipanel-module-finance
7
 * @license   BSD-3-Clause
8
 * @copyright Copyright (c) 2015-2019, HiQDev (http://hiqdev.com/)
9
 */
10
11
namespace hipanel\modules\finance\merchant;
12
13
use hipanel\modules\finance\models\Merchant;
14
use hiqdev\hiart\ResponseErrorException;
15
use hiqdev\php\merchant\response\RedirectPurchaseResponse;
16
use hiqdev\yii2\merchant\models\DepositRequest;
17
use hiqdev\yii2\merchant\models\PurchaseRequest;
18
use Yii;
19
20
class PurchaseRequestCollection extends \hiqdev\yii2\merchant\Collection
21
{
22
    public function init()
23
    {
24
        parent::init();
25
26
        if ($this->depositRequest === null) {
27
            $this->depositRequest = $this->createDefaultDepositRequest();
28
        }
29
30
        $this->loadMerchants($this->depositRequest);
31
    }
32
33
    public function loadMerchants($depositRequest)
34
    {
35
        $this->addItems($this->fetchMerchants($depositRequest));
36
    }
37
38
    public static $supportedSystems = [
39
        'webmoney' => 1,
40
        'paypal' => 1,
41
        'yandex' => 1,
42
        'yandexmoney' => 1,
43
        'interkassa' => 1,
44
        'paxum' => 1,
45
        'ecoin' => 1,
46
        'okpay' => 1,
47
        'robokassa' => 1,
48
        'freekassa' => 1,
49
        'bitpay' => 1,
50
        'epayservice' => 1,
51
        'twoco' => 1,
52
        'epayments' => 1,
53
        'ikajo' => 1,
54
        'coingate' => 1,
55
        'yandexkassa' => 1,
56
    ];
57
58
    public function fetchMerchants(DepositRequest $depositRequest)
59
    {
60
        $params = [
61
            'transactionId' => $depositRequest->id,
62
            'sum' => (float)$depositRequest->amount,
63
            'currency' => $depositRequest->currency,
64
            'site' => Yii::$app->request->getHostInfo(),
65
        ];
66
67
        if (Yii::$app->user->getIsGuest()) {
68
            $params['seller'] = Yii::$app->params['user.seller'];
69
        } elseif ($depositRequest->username !== null) {
70
            $params['username'] = $depositRequest->username;
71
        }
72
73
        if ($depositRequest->merchant !== null) {
74
            // When the Request contains concrete merchant name,
75
            // parameters `finishUrl`, `cancelUrl`, `notifyUrl` contain
76
            // correct URLs, adjusted by [[hiqdev\yii2-merchant\Module::prepareRequestData()]]
77
            // and they must be used as success, failure and confirm URLs
78
            $params['success_url'] = $depositRequest->returnUrl;
79
            $params['failure_url'] = $depositRequest->cancelUrl;
80
            $params['confirm_url'] = $depositRequest->notifyUrl;
81
        }
82
83
        try {
84
            $merchants = $this->requestMerchants($params);
85
        } catch (ResponseErrorException $e) {
86
            if ($e->getResponse()->getData() === null) {
87
                Yii::info('No available payment methods found', 'hipanel:finance');
88
                $merchants = [];
89
            } else {
90
                throw $e;
91
            }
92
        }
93
94
        $result = [];
95
        foreach ($merchants as $name => $merchant) {
96
            if (!empty(static::$supportedSystems[$merchant['system']])) {
97
                $result[$name] = $this->convertMerchant($merchant);
98
            }
99
        }
100
101
        return $result;
102
    }
103
104
    public function requestMerchants($params)
105
    {
106
        $userId = Yii::$app->user->getIsGuest() ? null : Yii::$app->user->identity->getId();
107
108
        return Yii::$app->getCache()->getOrSet([__METHOD__, $params, $userId], function () use ($params) {
109
            return Merchant::perform('prepare-info', $params, ['batch' => true]);
110
        }, 3600);
111
    }
112
113
    public function convertMerchant($data)
114
    {
115
        $request = new PurchaseRequest();
116
117
        $request->merchant_name = $data['name'];
118
        $request->system = $data['system'];
119
        $request->currency = strtoupper($data['currency']);
120
        $request->label = $data['label'];
121
        $request->fee = $data['fee'];
122
        $request->commission_fee = $data['commission_fee'];
123
        $request->id = $data['invoice_id'];
124
        $request->amount = $data['sum'];
125
        $request->form = (new RedirectPurchaseResponse($data['action'], $data['inputs']))->setMethod($data['method']);
126
        $request->disableReason = $data['disable_reason'] ?? null;
127
        $request->vat_rate = $data['vat_rate'] ?? null;
128
        $request->vat_sum = $data['vat_sum'] ?? null;
129
130
        return $request;
131
    }
132
133
    protected function createDefaultDepositRequest()
134
    {
135
        $request = new DepositRequest();
136
        $request->amount = 10;
0 ignored issues
show
Documentation Bug introduced by
The property $amount was declared of type string, but 10 is of type integer. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
137
138
        return $request;
139
    }
140
}
141