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

src/controllers/PayController.php (1 issue)

Check that an empty catch block is always commented

Coding Style Comprehensibility Informational

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\controllers;
12
13
use hipanel\modules\finance\models\Merchant;
14
use hiqdev\hiart\ResponseErrorException;
15
use hiqdev\yii2\merchant\actions\RequestAction;
16
use hiqdev\yii2\merchant\events\TransactionInsertEvent;
17
use hiqdev\yii2\merchant\transactions\Transaction;
18
use function is_array;
19
use Yii;
20
use yii\base\InvalidParamException;
21
use yii\helpers\Json;
22
23
/**
24
 * Class PayController.
25
 *
26
 * @property \hipanel\modules\finance\Module $module
27
 */
28
class PayController extends \hiqdev\yii2\merchant\controllers\PayController
29
{
30
    const SESSION_MERCHANT_LATEST_TRANSACTION_ID = 'MERCHANT_LATEST_TRANSACTION_ID';
31 1
32
    public function actions()
33 1
    {
34 1
        return array_merge(parent::actions(), [
35
            'request' => [
36
                'class' => RequestAction::class,
37
                'on ' . RequestAction::EVENT_AFTER_TRANSACTION_INSERT => function (TransactionInsertEvent $event) {
38
                    if ($event->transaction instanceof Transaction) {
39
                        Yii::$app->session->set(self::SESSION_MERCHANT_LATEST_TRANSACTION_ID, $event->transaction->getId());
40 1
                    }
41
                },
42
            ],
43
        ]);
44
    }
45
46
    public function getMerchantModule()
47
    {
48
        return $this->module->getMerchant();
49
    }
50
51
    public function render($view, $params = [])
52
    {
53
        return $this->getMerchantModule()->getPayController()->render($view, $params);
54
    }
55
56
    public function checkNotify(string $transactionId = null): ?Transaction
57
    {
58
        $transactionIdSources = [
59
            $transactionId,
60
            Yii::$app->request->get('transactionId'),
61
            Yii::$app->request->post('transactionId'),
62
            Yii::$app->session->get(self::SESSION_MERCHANT_LATEST_TRANSACTION_ID),
63
        ];
64
65
        foreach (array_filter($transactionIdSources) as $possibleTransactionId) {
66
            $transaction = $this->getMerchantModule()->findTransaction($possibleTransactionId);
67
            if ($transaction !== null) {
68
                break;
69
            }
70
        }
71
72
        /** @noinspection UnSafeIsSetOverArrayInspection */
73
        if (!isset($transaction)) {
74
            return null;
75
        }
76
77
        $data = array_merge([
78
            'merchant' => $transaction->getMerchant(),
79
            'username' => $transaction->getParameter('username'),
80
        ], $_REQUEST);
81
        Yii::info(http_build_query($data), 'merchant');
82
83
        if (($input = file_get_contents('php://input')) !== null) {
84
            try {
85
                $data['rawBody'] = Json::decode($input);
86
            } catch (InvalidParamException $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
87
            }
88
        }
89
90
        try {
91
            return Yii::$app->get('hiart')->callWithDisabledAuth(function () use ($transaction, $data) {
92
                $result = Merchant::perform('pay-transaction', $data);
93
                $this->completeTransaction($transaction, $result);
94
95
                return $transaction;
96
            });
97
        } catch (ResponseErrorException $e) {
98
        } // Does not matter, let's try the old way then.
99
100
        try {
101
            return Yii::$app->get('hiart')->callWithDisabledAuth(function () use ($transaction, $data) {
102
                $result = Merchant::perform('pay', $data);
103
                $this->completeTransaction($transaction, $result);
104
105
                return $transaction;
106
            });
107
        } catch (ResponseErrorException $e) {
108
        } // Still no luck? Then it's not the right request.
109
110
111
        return $transaction;
112
    }
113
114
    public function actionProxyNotification()
115
    {
116
        // Currently used at least for FreeKassa integration
117
        $data = array_merge(Yii::$app->request->get(), Yii::$app->request->post());
118
119
        $result = Yii::$app->get('hiart')->callWithDisabledAuth(function () use ($data) {
120
            return Merchant::perform('pay-transaction', $data);
121
        });
122
123
        $this->layout = false;
124
125
        return $result;
126
    }
127
128
    /**
129
     * @param Transaction $transaction
130
     * @param string|array $response
131
     * @return Transaction
132
     * @throws \yii\base\ExitException
133
     */
134
    protected function completeTransaction($transaction, $response)
135
    {
136
        if ($transaction->isCompleted() || isset($response['_error'])) {
137
            return $transaction;
138
        }
139
140
        if ($response === '"OK"') {
141
            echo $response;
142
            Yii::$app->end();
143
        }
144
145
        if (!is_array($response)) {
146
            return $transaction;
147
        }
148
149
        $transaction->complete();
150
        $transaction->addParameter('bill_id', $response['id']);
151
152
        $this->getMerchantModule()->saveTransaction($transaction);
153
154
        return $transaction;
155
    }
156
}
157