مهدی عقیقی
4 سال پیش توسط مهدی عقیقی مطرح شد
24 پاسخ

ارور getTryPublicId on null درگاه پرداخت زرین‌پال

سلام وقتتون بخیر.

من از نسخه‌ی 2.4 پکیج shetabit/payment استفاده می‌کنم و هنوز آپدیت نکردم به نسخه‌های بالاتر.
توی این نسخه هنوز قابلیت این که از سمت سرور درخواست به بانک زده بشه رو داره و من هم همین کارو کردم و بعد یک لینک به کاربر دادم که با کلیک روی یک دکمه به اون منتقل میشه.

تا حدود یک هفته پیش این کد‌ها درست کار می‌کرد ولی بدون این که من تغییری بدم یا ورژن پکیج رو بیارم بالا دچار مشکل شده و وقتی کاربر از پرداخت برمی‌گرده و من تابع زیر رو اجرا می‌کنم:

$receipt = Payment::amount((int)$transaction->paid_amount)->transactionId((int)$tr)->verify();

متاسفانه به ارور زیر می‌خوره:

\[2020-12-19 16:11:48\] local.WARNING: Call to a member function getTryPublicId() on null  
\[2020-12-19 16:28:11\] local.WARNING: file: /home/linomir/vendor/shetabit/payment/src/Drivers/Zarinpal/Zarinpal.php  
\[2020-12-19 16:28:11\] local.WARNING: Trace: #0 /home/linomir/vendor/shetabit/payment/src/Drivers/Zarinpal/Zarinpal.php(134): SoapClient->call('PaymentVerifica...', Array)

1 /home/linomir/vendor/shetabit/payment/src/PaymentManager.php(239): Shetabit\\Payment\\Drivers\\Zarinpal\\Zarinpal->verify()

2 /home/linomir/app/Http/Controllers/InvoiceController.php(170): Shetabit\\Payment\\PaymentManager->verify()

تا همین یک هفته پیش داشت درست کار می‌کرد و نمی‌دونم یهو چه اتفاقی افتاد که دچار این مشکل شد !
درایوری که استفاده می‌کنم هم زرین‌پال هستش.

@khanzadimahdi ممنون میشم اگر کمک بکنید.

در حال حاضر شرایط آپدیت کردن نسخه رو نداریم چون کمپین تبلیغ رفتم و مردم دارن خرید می‌کنن و متاسفانه مجبوریم همرو دستی پرداخت شده بزنیم توی دیتابیس که درست کار بکنه و آپدیت کردن به نسخه بالاتر دچار مشکل می‌کنه کار رو.

ممنون.


ثبت پرسش جدید
mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 4 سال پیش آپدیت شد
0

مشکل از این هست که شناسه تراکنش رو نباید موقع ذخیره کردن به نوع دیگه ای cast کنید.

https://roocket.ir/discuss/13460?page=2#subject-47559


mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 4 سال پیش مطرح شد
0

اگه امکانش هست message مربوط به exception رو بزارید.


مهدی عقیقی
تخصص : برنامه نویس وب
@MehdiAghighi 4 سال پیش مطرح شد
0

@khanzadimahdi اره منم هر چی از طرف زرین‌پال پیگیری می‌کنم میگن مشکل از ما نیست !
سعی کردم کد‌ها رو بخونم ولی درست متوجه نشدم امکانش هست یه کم اطلاعات بیشتر بدید تا من بتونم بهشون بگم ؟

مثلا این که درخواست به چه url ی زده میشه ؟


mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 4 سال پیش مطرح شد
0

یه فایل با نام payment.php توی کانفیگ هست که درخواستها به اونجا زده میشه. ادرس API ها رو میتونید از اونجا کپی کنید.


مهدی عقیقی
تخصص : برنامه نویس وب
@MehdiAghighi 4 سال پیش مطرح شد
0

@khanzadimahdi مسیج مربوط به اکسپشن این هست:

Call to a member function getTryPublicId() on null  

توی فایل

vendor/shetabit/payment/src/Drivers/Zarinpal/Zarinpal.php  

مهدی عقیقی
تخصص : برنامه نویس وب
@MehdiAghighi 4 سال پیش مطرح شد
0

@khanzadimahdi فکر کنم دقیقا درست گفتید.
چون من خودم امروز تست کردم حالت sandbox درست کار می‌کرد و وقتی چک کردم url درخواست‌ها رو دیدم مال sandbox و اصلی با هم فرق می‌کنه پس احتمالا اون درست کار می‌کرده و این غلط.

خیلی ممنون از پاسختون خیلی کمک کردید.


mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 4 سال پیش مطرح شد
0

زرین پال رسپانس wsdl نمیده به همین دلیل نال برمیگرده و نمیشه متد getTryPublicId رو صدا زد.


مهدی عقیقی
تخصص : برنامه نویس وب
@MehdiAghighi 4 سال پیش مطرح شد
0

@khanzadimahdi پس یعنی الان همه‌ی سایت‌هایی که دارن از زرین‌پال استفاده می‌کنن باید دچار مشکل باشن درسته ؟
عجیبه که قبول نمی‌کنن مشکل از طرف اوناست.

بازم خیلی ممنون لطف کردید.


mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 4 سال پیش مطرح شد
0

من الان چک کردم متدی به نام getTryPublicId نداریم توی درایور زرین پال. مشکل از کد خودتونه به احتمال زیاد.

https://github.com/shetabit/payment/blob/v2.4.4/src/Drivers/Zarinpal/Zarinpal.php


مهدی عقیقی
تخصص : برنامه نویس وب
@MehdiAghighi 4 سال پیش مطرح شد
0

@khanzadimahdi منم هر چی گشتم این تابع رو پیدا نکردم.
همین برا منم عجیبه که تا یک هفته پیش داشت درست کار می‌کرد ولی الان این مشکل پیش اومده در صورتی که ما کوچکترین تغییری ندادیم !!
این کد من هست کلا من خودم هم از اون تابع استفاده نکردم.

try {
            $invoice = CustomInvoice::findOrFail($id);
        } catch (ModelNotFoundException $e) {
            throw new \Exception("دوره مورد نظر پیدا نشد", 404);
        }

        $tr = preg_replace('/[^0-9,.]/', '', (string)$request->Authority);

        try {
            $transaction = Transaction::where("transaction_id", (string)(int)$tr)->first();

            $receipt = Payment::amount((int)$transaction->paid_amount)->transactionId((int)$tr)->verify();

            $transaction->is_paid = 1;
            $transaction->reference_id = $receipt->getReferenceId();
            $transaction->save();
            $transaction->invoice->is_paid = 1;
            $transaction->invoice->save();

            $dcUsage = $transaction->discount_code_usages()->latest()->first();
            if ($dcUsage) {
                $dcUsage->is_used = true;
                $dcUsage->save();
            }

            if ($transaction->invoice->affiliate) {
                $transaction->invoice->affiliate->deposit( ( 25 / 100 ) * ( ( int ) $transaction->amount ) , [ "description" => "خرید دوره توسط یکی از کاربران" ] );
            }

            // You can show payment referenceId to the user.
            // echo $receipt->getReferenceId();

            return redirect(env("FRONTEND_PAYMENT_URL") . "?transaction_id=" . (string)(int)$tr);

        } catch (\Exception $exception) {
            /**
                when payment is not verified, it will throw an exception.
                We can catch the exception to handle invalid payments.
                getMessage method, returns a suitable message that can be used in user interface.
            **/
            $transaction = Transaction::where("transaction_id", (string)(int)$tr)->first();
            Log::warning("file: " . $exception->getFile());
            Log::warning("Trace: " . $exception->getTraceAsString());

            $transaction->is_paid = 0;
            $transaction->save();

            return redirect(env("FRONTEND_PAYMENT_URL") . "?transaction_id=" . (string)(int)$tr);
        }

مهدی عقیقی
تخصص : برنامه نویس وب
@MehdiAghighi 4 سال پیش آپدیت شد
0

@khanzadimahdi این هم traceش هست:

Trace: #0 /home/linomir/vendor/shetabit/payment/src/Drivers/Zarinpal/Zarinpal.php(134): SoapClient->__call('PaymentVerifica...', Array)

و این هم لاین ۱۳۴ اون فایلی که گفته:

$result = $client->PaymentVerification($data);

mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 4 سال پیش مطرح شد
0

لاین 134 رو dd کنید result رو ببینید چی میده.


مهدی عقیقی
تخصص : برنامه نویس وب
@MehdiAghighi 4 سال پیش مطرح شد
0

@khanzadimahdi توی همون لاین دقیقا داره ارور میده یعنی نمی‌تونه اجراش کنه dd می‌کنم به همون ارور قبلی می‌خوره.


mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 4 سال پیش مطرح شد
0

توی همون لاین $client رو dd کنید. کلاینت توش چیه؟


مهدی عقیقی
تخصص : برنامه نویس وب
@MehdiAghighi 4 سال پیش مطرح شد
0

@khanzadimahdi
این هست:

SoapClient {#1448 ▼
  +"_encoding": "UTF-8"
  +"_stream_context": stream-context resource @666 ▼
    options: []
  }
  +"_soap_version": 1
  +"sdl": SOAP SDL resource @667
}

mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 4 سال پیش مطرح شد
0

من الان روی سیستم خودم به صورت لوکال تست کردم مشکلی نداشت!


مهدی عقیقی
تخصص : برنامه نویس وب
@MehdiAghighi 4 سال پیش مطرح شد
0

@khanzadimahdi حالت سندباکس تست کردید ؟ حالت سندباکسش درست کار کرد برای منم
فقط توی سرور مشکل داره


mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 4 سال پیش مطرح شد
0

حالت سند باکس نه! پرداخت واقعی زدم.


مهدی عقیقی
تخصص : برنامه نویس وب
@MehdiAghighi 4 سال پیش مطرح شد
0

@khanzadimahdi چطور ممکنه آخه من کوچکترین تغییری رو اپلود نکردم روی سرور‌!
بدبختی اینه ارور رو هم داره از کدای vendor میگیره نمیدونم واقعا چی کار باید بکنم


mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 4 سال پیش مطرح شد
0

کدها رو به صورت لوکال تست کردی؟ روی سیستم خودت ران کن پرداخت بزن.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام