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

src/controllers/PayController.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\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