Completed
Push — master ( 129e30...79af42 )
by mahdi
03:24
created

Saman::verify()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 7
nc 2
nop 0
dl 0
loc 12
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Shetabit\Payment\Drivers;
4
5
use Shetabit\Payment\Abstracts\Driver;
6
use Shetabit\Payment\Exceptions\InvalidPaymentException;
7
use Shetabit\Payment\Invoice;
8
9
class Saman 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
    public function purchase()
44
    {
45
        $data = array(
46
            'MID' => $this->settings->merchantId,
47
            'ResNum' => $this->invoice->getUuid(),
48
            'Amount' => $this->invoice->getAmount() * 10, // convert to rial
49
        );
50
51
        $soap = new \SoapClient(
52
            $this->settings->apiPurchaseUrl
53
        );
54
55
        $response = $soap->RequestToken($data['MID'], $data['ResNum'], $data['Amount']);
56
57
        if (intval($response) < 0) { // if something has done in a wrong way
58
            $this->purchaseFailed($response);
59
        }
60
61
        // set transaction id
62
        $this->invoice->transactionId($response);
63
64
        // return the transaction's id
65
        return $this->invoice->getTransactionId();
66
    }
67
68
    /**
69
     * Pay the Invoice
70
     *
71
     * @return \Illuminate\Http\RedirectResponse|mixed
72
     */
73
    public function pay()
74
    {
75
        $payUrl = $this->settings->apiPaymentUrl;
76
77
        return $this->redirectWithForm(
78
            $payUrl,
79
            [
80
                'Token' => $this->invoice->getTransactionId(),
81
                'RedirectUrl' => $this->settings->callbackUrl,
82
            ],
83
            'POST'
84
        );
85
    }
86
87
    /**
88
     * Verify payment
89
     *
90
     * @return mixed|void
91
     * @throws InvalidPaymentException
92
     */
93
    public function verify()
94
    {
95
        $data = array(
96
            'RefNum' => request()->input('RefNum'),
97
            'merchantId' => $this->settings->merchantId,
98
        );
99
100
        $soap = new \SoapClient($this->settings->apiVerificationUrl);
101
        $status = (int) $soap->VerifyTransaction($data['RefNum'], $data['merchantId']);
102
103
        if ($status < 0) {
104
            $this->notVerified($status);
105
        }
106
    }
107
108
    public function purchaseFailed($status)
109
    {
110
        $translations = array(
111
            -1 => 'خطا در پردازش اطلاعات ارسالی (مشکل در یکی از ورودی ها و ناموفق بودن فراخوانی متد برگشت تراکنش)',
112
            -3 => 'ورودیها حاوی کارکترهای غیرمجاز میباشند.',
113
            -4 => 'کلمه عبور یا کد فروشنده اشتباه است (Merchant Authentication Failed)',
114
            -6 => 'سند قبال برگشت کامل یافته است. یا خارج از زمان 30 دقیقه ارسال شده است.',
115
            -7 => 'رسید دیجیتالی تهی است.',
116
            -8 => 'طول ورودیها بیشتر از حد مجاز است.',
117
            -9 => 'وجود کارکترهای غیرمجاز در مبلغ برگشتی.',
118
            -10 => 'رسید دیجیتالی به صورت Base64 نیست (حاوی کاراکترهای غیرمجاز است)',
119
            -11 => 'طول ورودیها ک تر از حد مجاز است.',
120
            -12 => 'مبلغ برگشتی منفی است.',
121
            -13 => 'مبلغ برگشتی برای برگشت جزئی بیش از مبلغ برگشت نخوردهی رسید دیجیتالی است.',
122
            -14 => 'چنین تراکنشی تعریف نشده است.',
123
            -15 => 'مبلغ برگشتی به صورت اعشاری داده شده است.',
124
            -16 => 'خطای داخلی سیستم',
125
            -17 => 'برگشت زدن جزیی تراکنش مجاز نمی باشد.',
126
            -18 => 'IP Address فروشنده نا معتبر است و یا رمز تابع بازگشتی (reverseTransaction) اشتباه است.',
127
        );
128
129
        if (array_key_exists($status, $translations)) {
130
            throw new InvalidPaymentException($translations[$status]);
131
        } else {
132
            throw new InvalidPaymentException('خطای ناشناخته ای رخ داده است.');
133
        }
134
    }
135
136
    /**
137
     * Trigger an exception
138
     *
139
     * @param $status
140
     * @throws InvalidPaymentException
141
     */
142
    private function notVerified($status)
143
    {
144
        $translations = array(
145
            -1 => ' تراکنش توسط خریدار کنسل شده است.',
146
            -6 => 'سند قبال برگشت کامل یافته است. یا خارج از زمان 30 دقیقه ارسال شده است.',
147
            79 => 'مبلغ سند برگشتی، از مبلغ تراکنش اصلی بیشتر است.',
148
            12 => 'درخواست برگشت یک تراکنش رسیده است، در حالی که تراکنش اصلی پیدا نمی شود.',
149
            14 => 'شماره کارت نامعتبر است.',
150
            15 => 'چنین صادر کننده کارتی وجود ندارد.',
151
            33 => 'از تاریخ انقضای کارت گذشته است و کارت دیگر معتبر نیست.',
152
            38 => 'رمز کارت 3 مرتبه اشتباه وارد شده است در نتیجه کارت غیر فعال خواهد شد.',
153
            55 => 'خریدار رمز کارت را اشتباه وارد کرده است.',
154
            61 => 'مبلغ بیش از سقف برداشت می باشد.',
155
            93 => 'تراکنش Authorize شده است (شماره PIN و PAN درست هستند) ولی امکان سند خوردن وجود ندارد.',
156
            68 => 'تراکنش در شبکه بانکی Timeout خورده است.',
157
            34 => 'خریدار یا فیلد CVV2 و یا فیلد ExpDate را اشتباه وارد کرده است (یا اصال وارد نکرده است).',
158
            51 => 'موجودی حساب خریدار، کافی نیست.',
159
            84 => 'سیستم بانک صادر کننده کارت خریدار، در وضعیت عملیاتی نیست.',
160
            96 => 'کلیه خطاهای دیگر بانکی باعث ایجاد چنین خطایی می گردد.',
161
        );
162
163
        if (array_key_exists($status, $translations)) {
164
            throw new InvalidPaymentException($translations[$status]);
165
        } else {
166
            throw new InvalidPaymentException('خطای ناشناخته ای رخ داده است.');
167
        }
168
    }
169
}
170