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

Saman::purchase()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 23
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

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