Passed
Push — master ( 437f23...0ad4c0 )
by mahdi
03:18
created

Irankish::verify()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 12
dl 0
loc 20
rs 9.8666
c 0
b 0
f 0
cc 2
nc 2
nop 0
1
<?php
2
3
namespace Shetabit\Payment\Drivers\Irankish;
4
5
use Shetabit\Payment\Abstracts\Driver;
6
use Shetabit\Payment\Exceptions\{InvalidPaymentException, PurchaseFailedException};
7
use Shetabit\Payment\{Contracts\ReceiptInterface, Invoice, Receipt};
8
9
class Irankish extends Driver
10
{
11
    /**
12
     * Invoice
13
     *
14
     * @var Invoice
15
     */
16
    protected $invoice;
17
18
    /**
19
     * Driver settings
20
     *
21
     * @var object
22
     */
23
    protected $settings;
24
25
    /**
26
     * Irankish constructor.
27
     * Construct the class with the relevant settings.
28
     *
29
     * @param Invoice $invoice
30
     * @param $settings
31
     */
32
    public function __construct(Invoice $invoice, $settings)
33
    {
34
        $this->invoice($invoice);
35
        $this->settings = (object)$settings;
36
    }
37
38
    /**
39
     * Purchase Invoice.
40
     *
41
     * @return string
42
     *
43
     * @throws PurchaseFailedException
44
     * @throws \SoapFault
45
     */
46
    public function purchase()
47
    {
48
        if (!empty($this->invoice->getDetails()['description'])) {
49
            $description = $this->invoice->getDetails()['description'];
50
        } else {
51
            $description = $this->settings->description;
52
        }
53
54
        $data = array(
55
            'amount' => $this->invoice->getAmount() * 10, // convert to rial
56
            'merchantId' => $this->settings->merchantId,
57
            'description' => $description,
58
            'revertURL' => $this->settings->callbackUrl,
59
            'invoiceNo' => crc32($this->invoice->getUuid()),
60
            'paymentId' => crc32($this->invoice->getUuid()),
61
            'specialPaymentId' => crc32($this->invoice->getUuid()),
62
        );
63
64
        $soap = new \SoapClient(
65
            $this->settings->apiPurchaseUrl
66
        );
67
        $response = $soap->MakeToken($data);
68
69
        if ($response->MakeTokenResult->result != false) {
70
            $this->invoice->transactionId($response->MakeTokenResult->token);
71
        } else {
72
            // error has happened
73
            throw new PurchaseFailedException('خطا در هنگام درخواست برای پرداخت رخ داده است.');
74
        }
75
76
        // return the transaction's id
77
        return $this->invoice->getTransactionId();
78
    }
79
80
    /**
81
     * Pay the Invoice
82
     *
83
     * @return \Illuminate\Http\RedirectResponse|mixed
84
     */
85
    public function pay()
86
    {
87
        $payUrl = $this->settings->apiPaymentUrl;
88
89
        return $this->redirectWithForm(
90
            $payUrl,
91
            [
92
                'token' => $this->invoice->getTransactionId(),
93
                'merchantId' => $this->settings->merchantId,
94
            ],
95
            'POST'
96
        );
97
    }
98
99
    /**
100
     * Verify payment
101
     *
102
     * @return ReceiptInterface
103
     *
104
     * @throws InvalidPaymentException
105
     * @throws \SoapFault
106
     */
107
    public function verify() : ReceiptInterface
108
    {
109
        $data = array(
110
            'merchantId' => $this->settings->merchantId,
111
            'sha1Key' => $this->settings->sha1Key,
112
            'token' => $this->invoice->getTransactionId(),
113
            'amount' => $this->invoice->getAmount() * 10, // convert to rial
114
            'referenceNumber' => request()->get('referenceId'),
115
        );
116
117
        $soap = new \SoapClient($this->settings->apiVerificationUrl);
118
        $response = $soap->KicccPaymentsVerification($data);
119
120
        $status = (int)($response->KicccPaymentsVerificationResult);
121
122
        if ($status != $data['amount']) {
123
            $this->notVerified($status);
124
        }
125
126
        return $this->createReceipt($data['referenceNumber']);
127
    }
128
129
    /**
130
     * Generate the payment's receipt
131
     *
132
     * @param $referenceId
133
     *
134
     * @return Receipt
135
     */
136
    public function createReceipt($referenceId)
137
    {
138
        $receipt = new Receipt('irankish', $referenceId);
139
140
        return $receipt;
141
    }
142
143
    /**
144
     * Trigger an exception
145
     *
146
     * @param $status
147
     * @throws InvalidPaymentException
148
     */
149
    private function notVerified($status)
150
    {
151
        $translations = array(
152
            110 => 'دارنده کارت انصراف داده است',
153
            120 => 'موجودی حساب کافی نمی باشد',
154
            121 => 'مبلغ تراکنشهای کارت بیش از حد مجاز است',
155
            130 => 'اطلاعات کارت نادرست می باشد',
156
            131 => 'رمز کارت اشتباه است',
157
            132 => 'کارت مسدود است',
158
            133 => 'کارت منقضی شده است',
159
            140 => 'زمان مورد نظر به پایان رسیده است',
160
            150 => 'خطای داخلی بانک به وجود آمده است',
161
            160 => 'خطای انقضای کارت به وجود امده یا اطلاعات CVV2 اشتباه است',
162
            166 => 'بانک صادر کننده کارت شما مجوز انجام تراکنش را صادر نکرده است',
163
            167 => 'خطا در مبلغ تراکنش',
164
            200 => 'مبلغ تراکنش بیش از حدنصاب مجاز',
165
            201 => 'مبلغ تراکنش بیش از حدنصاب مجاز برای روز کاری',
166
            202 => 'مبلغ تراکنش بیش از حدنصاب مجاز برای ماه کاری',
167
            203 => 'تعداد تراکنشهای مجاز از حد نصاب گذشته است',
168
            499 => 'خطای سیستمی ، لطفا مجددا تالش فرمایید',
169
            500 => 'خطا در تایید تراکنش های خرد شده',
170
            501 => 'خطا در تایید تراکتش ، ویزگی تایید خودکار',
171
            502 => 'آدرس آی پی نا معتبر',
172
            503 => 'پذیرنده در حالت تستی می باشد ، مبلغ نمی تواند بیش از حد مجاز تایین شده برای پذیرنده تستی باشد',
173
            504 => 'خطا در بررسی الگوریتم شناسه پرداخت',
174
            505 => 'مدت زمان الزم برای انجام تراکنش تاییدیه به پایان رسیده است',
175
            506 => 'ذیرنده یافت نشد',
176
            507 => 'توکن نامعتبر/طول عمر توکن منقضی شده است',
177
            508 => 'توکن مورد نظر یافت نشد و یا منقضی شده است',
178
            509 => 'خطا در پارامترهای اجباری خرید تسهیم شده',
179
            510 => 'خطا در تعداد تسهیم | مبالغ کل تسهیم مغایر با مبلغ کل ارائه شده | خطای شماره ردیف تکراری',
180
            511 => 'حساب مسدود است',
181
            512 => 'حساب تعریف نشده است',
182
            513 => 'شماره تراکنش تکراری است',
183
            -20 => 'در درخواست کارکتر های غیر مجاز وجو دارد',
184
            -30 => 'تراکنش قبلا برگشت خورده است',
185
            -50 => 'طول رشته درخواست غیر مجاز است',
186
            -51 => 'در در خواست خطا وجود دارد',
187
            -80 => 'تراکنش مورد نظر یافت نشد',
188
            -81 => ' خطای داخلی بانک',
189
            -90 => 'تراکنش قبلا تایید شده است'
190
        );
191
        if (array_key_exists($status, $translations)) {
192
            throw new InvalidPaymentException($translations[$status]);
193
        } else {
194
            throw new InvalidPaymentException('خطای ناشناخته ای رخ داده است.');
195
        }
196
    }
197
}
198