Completed
Push — master ( bf97a3...fb31dc )
by Kazi Mainuddin
01:54
created

PaymentController::payment()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 33
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 33
rs 8.8571
c 0
b 0
f 0
cc 3
eloc 21
nc 3
nop 1
1
<?php
2
namespace Tzsk\Payu\Controllers;
3
4
5
use App\Http\Controllers\Controller;
6
use Illuminate\Http\Request;
7
use Illuminate\Support\Facades\Cache;
8
use Illuminate\Support\Facades\Validator;
9
use Tzsk\Payu\Model\PayuPayment;
10
use Tzsk\Payu\ProcessPayment;
11
12
class PaymentController extends Controller
13
{
14
    /**
15
     * Got to payment.
16
     *
17
     * @param Request $request
18
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
19
     */
20
    public function index(Request $request)
21
    {
22
        $payment = $this->getPaymentFormInformation($request);
23
24
        return view('tzsk::payment_form', compact('payment'));
25
    }
26
27
    /**
28
     * After payment it will return here.
29
     *
30
     * @param Request $request
31
     * @return \Illuminate\Http\RedirectResponse
32
     */
33
    public function payment(Request $request)
34
    {
35
        $attributes = $request->only([
36
            'txnid', 'mihpayid', 'firstname', 'email', 'phone', 'amount', 'discount',
37
            'net_amount_debit', 'data', 'status', 'unmappedstatus', 'mode', 'bank_ref_num',
38
            'bankcode', 'cardnum', 'name_on_card', 'issuing_bank', 'card_type'
39
        ]);
40
        $attributes['data'] = json_encode($request->all());
41
        $process = new ProcessPayment($request);
42
        $attributes['status'] = $process->getStatus();
43
44
        $model = Cache::get('tzsk_model');
45
46
        if (config('payu.driver') == 'database') {
47
            $payment_instance = PayuPayment::create($attributes);
48
49
            if (!empty($model)) {
50
                $payment_instance->fill([
51
                    'payable_id' => $model->id,
52
                    'payable_type' => get_class($model)
53
                ])->save();
54
            }
55
56
            $payment = $payment_instance->id;
57
58
        } else {
59
            $payment = $attributes;
60
        }
61
62
        Cache::put('tzsk_payment', $payment, 5);
63
64
        return redirect()->to(base64_decode($request->callback));
65
    }
66
67
    /**
68
     * @param  Request $request
69
     * @return object
70
     * @throws \Exception
71
     */
72
    protected  function getPaymentFormInformation(Request $request)
73
    {
74
        $data = Cache::get('tzsk_data');
75
        $status_url = Cache::get('tzsk_status_url');
76
77
        if (empty($status_url)) {
78
            throw new \Exception("There is no Redirect URL specified.");
79
        }
80
81
        $request->replace($data);
82
        $validation = $this->validateRequest($request);
83
        $hash = $this->getHashChecksum($request);
84
85
        $redirect = collect(config('payu.redirect'))->map(function($value) use ($request, $status_url) {
86
            $seperator = str_contains($value, '?') ? '&' : '?';
87
            return url($value.$seperator.'callback='.urlencode(base64_encode($status_url)));
88
        })->all();
89
90
        $form_fields = array_merge(['key' => config('payu.key'), 'hash' => $hash],
91
            array_merge($redirect, $validation));
92
93
        $prefix = (config('payu.env') == 'secure') ? 'secure' : 'test';
94
        $url = "https://{$prefix}.".config('payu.endpoint');
95
96
        $payment = (object) ['fields' => $form_fields, 'url' => $url];
97
98
        return $payment;
99
    }
100
101
    /**
102
     * @param Request $request
103
     * @return string
104
     */
105
    protected function getHashChecksum(Request $request)
106
    {
107
        $fields = array_merge(config('payu.required_fields'), config('payu.optional_fields'));
108
109
        $hash_array = [];
110
        foreach (collect($fields)->flip()->except(['phone'])->flip() as $field) {
111
            $hash_array[] = $request->has($field) ? $request->get($field) : "";
112
        }
113
114
        $checksum_array = array_merge([config('payu.key')], $hash_array, [config('payu.salt')]);
115
116
        $hash = hash('sha512', implode('|', $checksum_array));
117
118
        return $hash;
119
    }
120
121
    /**
122
     * @param Request $request
123
     * @return array
124
     */
125
    protected function validateRequest(Request $request)
126
    {
127
        list($validation, $data) = $this->getValidationData($request);
128
129
        $validator = Validator::make($request->all(), $validation);
130
131
        if ($validator->fails()) {
132
            throw new \InvalidArgumentException($validator->errors()->first());
133
        }
134
135
        return $data;
136
    }
137
138
    /**
139
     * @param  Request $request
140
     * @return array
141
     */
142
    protected function getValidationData(Request $request)
143
    {
144
        $validation = [];
145
        $data = [];
146
        foreach (config('payu.required_fields') as $item) {
147
            $validation[$item] = 'required';
148
            $request->has($item) ? $data[$item] = $request->get($item) : null;
149
        }
150
151
        foreach (config('payu.optional_fields') as $item) {
152
            $request->has($item) ? $data[$item] = $request->get($item) : null;
153
        }
154
155
        foreach (config('payu.additional_fields') as $item) {
156
            $request->has($item) ? $data[$item] = $request->get($item) : null;
157
        }
158
159
        return [$validation, $data];
160
    }
161
162
}
163