Completed
Branch master (e844c6)
by Kazi Mainuddin
01:51
created

PaymentController::getHashChecksum()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 15
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 8
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
        $data = Cache::get('tzsk_data');
23
        $status_url = Cache::get('tzsk_status_url');
24
25
        $request->replace($data);
26
        $validation = $this->validateRequest($request);
27
        $hash = $this->getHashChecksum($request);
28
29
        $redirect = collect(config('payu.redirect'))->map(function($value) use ($request, $status_url) {
30
            $seperator = str_contains($value, '?') ? '&' : '?';
31
            return url($value . $seperator . 'callback=' . $status_url);
32
        })->all();
33
34
        $form_fields = array_merge(['key' => config('payu.key'), 'hash' => $hash],
35
            array_merge($redirect, $validation));
36
37
        $prefix = (config('payu.env') == 'secure') ? 'secure' : 'test';
38
        $url = "https://{$prefix}.".config('payu.endpoint');
39
40
        $payment = (object) ['fields' => $form_fields, 'url' => $url];
41
42
        return view('tzsk::payment_form', compact('payment'));
43
    }
44
45
    /**
46
     * After payment it will return here.
47
     *
48
     * @param Request $request
49
     * @return \Illuminate\Http\RedirectResponse
50
     */
51
    public function payment(Request $request)
52
    {
53
        $attributes = $request->only([
54
            'txnid', 'mihpayid', 'firstname', 'email', 'phone', 'amount', 'discount',
55
            'net_amount_debit', 'data', 'status', 'unmappedstatus', 'mode', 'bank_ref_num',
56
            'bankcode', 'cardnum', 'name_on_card', 'issuing_bank', 'card_type'
57
        ]);
58
        $attributes['data'] = json_encode($request->all());
59
        $process = new ProcessPayment($request);
60
        $attributes['status'] = $process->getStatus();
61
62
        if (config('payu.driver') == 'database') {
63
            $payment = PayuPayment::create($attributes)->id;
64
        } else {
65
            $payment = $attributes;
66
        }
67
68
        Cache::put('tzsk_payment', $payment, 5);
69
70
        return redirect()->to($request->callback);
71
    }
72
73
    /**
74
     * @param Request $request
75
     * @return string
76
     */
77
    protected function getHashChecksum(Request $request)
78
    {
79
        $fields = array_merge(config('payu.required_fields'), config('payu.optional_fields'));
80
81
        $hash_array = [];
82
        foreach (collect($fields)->flip()->except(['phone'])->flip() as $field) {
83
            $hash_array[] = $request->has($field) ? $request->get($field) : "";
84
        }
85
86
        $checksum_array = array_merge([config('payu.key')], $hash_array, [config('payu.salt')]);
87
88
        $hash = hash('sha512', implode('|', $checksum_array));
89
90
        return $hash;
91
    }
92
93
    /**
94
     * @param Request $request
95
     * @return array
96
     */
97
    protected function validateRequest(Request $request)
98
    {
99
        $validation = [];
100
        $data = [];
101
        foreach (config('payu.required_fields') as $item) {
102
            $validation[$item] = 'required';
103
            $request->has($item) ? $data[$item] = $request->get($item) : null;
104
        }
105
106
        foreach (config('payu.optional_fields') as $item) {
107
            $request->has($item) ? $data[$item] = $request->get($item) : null;
108
        }
109
110
        foreach (config('payu.additional_fields') as $item) {
111
            $request->has($item) ? $data[$item] = $request->get($item) : null;
112
        }
113
114
        $validator = Validator::make($request->all(), $validation);
115
116
        if ($validator->fails()) {
117
            throw new \InvalidArgumentException($validator->errors()->first());
118
        }
119
120
        return $data;
121
    }
122
123
}
124