parsisolution / gateway

Iranian Payment Gateways
MIT License
19 stars 7 forks source link

array_merge(): Argument #1 is not an array #21

Closed aliqasemzadeh closed 5 years ago

aliqasemzadeh commented 5 years ago

سلام الان این خطا را برای بانک ملت دریافت می کنم. مشکل چیه؟

hamed-ehtesham commented 5 years ago

آخرین قسمت (قسمت مربوط به این خطا) در laravel.log رو بفرستید لطفا

aliqasemzadeh commented 5 years ago

متاسفانه خالی است.

aliqasemzadeh commented 5 years ago

Request doesn't have required state parameter (or it doesn't match session's state).

hamed-ehtesham commented 5 years ago

این رو برای این دریافت میکنید که token ی که برای امنیت ایجاد شده بوده و قرار بوده توسط بانک به برنامه داده بشه یا اشتباه هست و یا این که قبلا توسط بانک در دخواست دیگه ای ارسال شده

در حالت پیش فرض قابلیت چند بار ارسال درخواست تایید تراکنش یا همون فراخوانی callback رو ندارید اما در حالت stateless میتونید چند بار درخواست تایید رو بفرستید که در اونجا خطای RetryException میگیرید اما در حالت پیشفرض در دفعات بعد خطای InvalidStateException میگیرید به خاطر این که در دفعه ی اول state که داخل session قرار داره به دلیل امنیتی پاک میشه

aliqasemzadeh commented 5 years ago

array_merge(): Argument #1 is not an array

را چی کار کنم.

هیچ کدام از درگاه ها بجز SabaPay درست کار نمی کنه.

hamed-ehtesham commented 5 years ago

چند جا از این کد استفاده شده باید دقیقا مشخص بشه کدوم رو دارید بهش اشاره میکنید حالت stateless هم مشکل دارید؟ کی مشکل پیش میاد در کدوم قسمت از فراخوانی در زمان authorize, redirect, settle?

چرا log خالی هست؟

aliqasemzadeh commented 5 years ago
    public function start(Request $request)
    {
        try
        {
            $gateway = Gateway::of('mellat');
            $gateway->callbackUrl(route('payment.callback',['id' => Auth::user()->id]));
            $transaction = new RequestTransaction(new Amount($request->credit,'IRR'));
            $authorizedTransaction = $gateway->authorize($transaction);
            return $gateway->redirect($authorizedTransaction);

        } catch (\Exception $e) {
            $data = $e->getMessage();
            $state = "danger";
        }

        $user = User::findOrFail(Auth::user()->id);
        $transactions = Transaction::where('user_id', Auth::user()->id)->paginate(25);
        return view('payment.fund', ['user' => $user, 'transactions' => $transactions, 'data' => $data ,'state' => $state]);
    }

    public function callBack($id,Request $request)
    {
        try
        {
            $settledTransaction = Gateway::settle();
            $trackingCode = $settledTransaction->getTrackingCode();
            $refId = $settledTransaction->getReferenceId();
            $cardNumber = $settledTransaction->getCardNumber();
            $transaction = new Transaction;
            $transaction->user_id = $id;
            $transaction->credit = $settledTransaction->getAmount();
            $transaction->system = "پرداخت آنلاین بانک ملت";
            $transaction->description = "شارژ آنلاین بانک ملت با کد پیگیری : " . $trackingCode;
            $transaction->user_id = Auth::user()->id;
            $transaction->save();

            $state = "success";
            $data = "تراکنش با موفقیت انجام شد، کد پیگیری:".$trackingCode;

        }  catch (RetryException $e) {
            $state = "danger";
            $data = $e->getMessage();
        } catch (\Exception $e) {
            $state = "danger";
            $data = $e->getMessage();
        }

        $user = User::findOrFail(Auth::user()->id);
        $transactions = Transaction::where('user_id', Auth::user()->id)->paginate(25);
        return view('payment.fund', ['user' => $user, 'transactions' => $transactions, 'data' => $data ,'state' => $state]);
    }

این کل کد های من هست در زمان بازگشت از بانک ملت

درزمان بازگشت از بانک سامان TME Error می دهد

کلا با همه دشمنی داره.

hamed-ehtesham commented 5 years ago

اون درگاهی که خودتون اضافه کردید چطور؟ مبنا2

بقیه ی درگاه ها ممکنه کدهاش به خاطر قدیمی شدن کار نکنه لطفا حالت تون رو به حالت stateless تغییر بدید به این شکل

$gateway = Gateway::of('mellat');
$gateway->stateless();

...

$settledTransaction = Gateway::settle(true);

...

حداقل یه لایه پیچیدگی کمتر میشه

aliqasemzadeh commented 5 years ago

باز هم خطای array_merge(): Argument #1 is not an array

نه مبنا کار نمی کنه اون که باید راحت هم وصل بشه وصل نمیشه.

aliqasemzadeh commented 5 years ago

سلام حالا یک خطای جدید می دهد Object of class Parsisolution\Gateway\Transactions\Amount could not be converted to string

aliqasemzadeh commented 5 years ago

$settledTransaction->getAmount(); باید یک جوری باشه که عدد باشه اگر واقعا می خواهیم از ریال و تومن استفاده کنیم و اعشار نداریم بهتره در تعریف decimal(18,0) بزاریم

hamed-ehtesham commented 5 years ago

در واحد های دیگه داریم مثل دلار فقط قرار نیست ریال و تومان استفاده بشه

aliqasemzadeh commented 5 years ago

آره درست پس این $settledTransaction->getAmount(); باید عدد برگردونه نه رشته الان من باهاش مشکل دارم.

hamed-ehtesham commented 5 years ago

چرا میخواهید amount رو چاپ کنید؟ Object of class Parsisolution\Gateway\Transactions\Amount could not be converted to string

اگه لازمه toString اضافه کنم؟

aliqasemzadeh commented 5 years ago

نه بر عکس مشکل دارم

$transaction->credit = $settledTransaction->getAmount();

مشکل دارد نمیشه تبدیل بشه و خودش ذخیره بشه

hamed-ehtesham commented 5 years ago

آخه Amount شامل واحد پول هم میشه فقط که مقدارش نیست واحد هم مهمه برای دریافت عدد باید از $settledTransaction->getAmount()->getTotal() استفاده بشه

aliqasemzadeh commented 5 years ago
    public function start(Request $request)
    {
        try
        {
            $gateway = Gateway::of('mellat');
            $gateway->stateless();
            $gateway->callbackUrl(route('payment.callback',['id' => Auth::user()->id]));
            $transaction = new RequestTransaction(new Amount($request->credit,'IRR'));
            $transaction->setExtraField('description', 'شارژ');
            $authorizedTransaction = $gateway->authorize($transaction);
            return $gateway->redirect($authorizedTransaction);

        } catch (\Exception $e) {
            $data = $e->getMessage();
            $state = "danger";
        }

        $user = User::findOrFail(Auth::user()->id);
        $transactions = Transaction::where('user_id', Auth::user()->id)->paginate(25);
        return view('payment.fund', ['user' => $user, 'transactions' => $transactions, 'data' => $data ,'state' => $state]);
    }

    public function callBack($id,Request $request)
    {
        try
        {
            $settledTransaction = Gateway::settle(true);
            $trackingCode = $settledTransaction->getTrackingCode();
            $refId = $settledTransaction->getReferenceId();
            $cardNumber = $settledTransaction->getCardNumber();

            $transaction = new Transaction;
            $transaction->user_id = $id;
            $transaction->credit = $settledTransaction->getAmount()->getTotal();
            $transaction->system = "پرداخت آنلاین بانک ملت";
            $transaction->description = "شارژ آنلاین بانک ملت با کد پیگیری : " . $trackingCode;
            $transaction->user_id = Auth::user()->id;
            $transaction->save();

            $state = "success";
            $data = "تراکنش با موفقیت انجام شد، کد پیگیری:".$trackingCode;

        }  catch (RetryException $e) {
            $state = "danger";
            $data = $e->getMessage();
        } catch (\Exception $e) {
            $state = "danger";
            $data = $e->getMessage();
        }

        $user = User::findOrFail(Auth::user()->id);
        $transactions = Transaction::where('user_id', Auth::user()->id)->paginate(25);
        return view('payment.fund', ['user' => $user, 'transactions' => $transactions, 'data' => $data ,'state' => $state]);
    }

الان درست شد ولی خب باید حالت امنیتی را درست کنیم

من حدث می زنم سامان به اسم دامنه حساس هست.

hamed-ehtesham commented 5 years ago

مشکلی که این رو براش باز کردید

array_merge(): Argument #1 is not an array

فکر میکنم با این خط درست میشه

$transaction->setExtraField('description', 'شارژ');

الان داشتم بررسی میکردم که اگه به خاطر این هست حل کنم

aliqasemzadeh commented 5 years ago

@hamed-ehtesham بله دقیقا ولی خوب نیست چون من توضیحات نداشتم.

hamed-ehtesham commented 5 years ago

بله الان درستش میکنم

aliqasemzadeh commented 5 years ago

@hamed-ehtesham

maminbajand کیه؟

hamed-ehtesham commented 5 years ago

دوست و شریک بنده هستن برای چی؟