سلام وقتتون بخیر.
من از نسخهی 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 ممنون میشم اگر کمک بکنید.
در حال حاضر شرایط آپدیت کردن نسخه رو نداریم چون کمپین تبلیغ رفتم و مردم دارن خرید میکنن و متاسفانه مجبوریم همرو دستی پرداخت شده بزنیم توی دیتابیس که درست کار بکنه و آپدیت کردن به نسخه بالاتر دچار مشکل میکنه کار رو.
ممنون.
مشکل از این هست که شناسه تراکنش رو نباید موقع ذخیره کردن به نوع دیگه ای cast کنید.
@khanzadimahdi اره منم هر چی از طرف زرینپال پیگیری میکنم میگن مشکل از ما نیست !
سعی کردم کدها رو بخونم ولی درست متوجه نشدم امکانش هست یه کم اطلاعات بیشتر بدید تا من بتونم بهشون بگم ؟
مثلا این که درخواست به چه url ی زده میشه ؟
یه فایل با نام payment.php توی کانفیگ هست که درخواستها به اونجا زده میشه. ادرس API ها رو میتونید از اونجا کپی کنید.
@khanzadimahdi مسیج مربوط به اکسپشن این هست:
Call to a member function getTryPublicId() on null
توی فایل
vendor/shetabit/payment/src/Drivers/Zarinpal/Zarinpal.php
@khanzadimahdi فکر کنم دقیقا درست گفتید.
چون من خودم امروز تست کردم حالت sandbox درست کار میکرد و وقتی چک کردم url درخواستها رو دیدم مال sandbox و اصلی با هم فرق میکنه پس احتمالا اون درست کار میکرده و این غلط.
خیلی ممنون از پاسختون خیلی کمک کردید.
زرین پال رسپانس wsdl نمیده به همین دلیل نال برمیگرده و نمیشه متد getTryPublicId رو صدا زد.
@khanzadimahdi پس یعنی الان همهی سایتهایی که دارن از زرینپال استفاده میکنن باید دچار مشکل باشن درسته ؟
عجیبه که قبول نمیکنن مشکل از طرف اوناست.
بازم خیلی ممنون لطف کردید.
من الان چک کردم متدی به نام getTryPublicId نداریم توی درایور زرین پال. مشکل از کد خودتونه به احتمال زیاد.
https://github.com/shetabit/payment/blob/v2.4.4/src/Drivers/Zarinpal/Zarinpal.php
@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);
}
@khanzadimahdi این هم traceش هست:
Trace: #0 /home/linomir/vendor/shetabit/payment/src/Drivers/Zarinpal/Zarinpal.php(134): SoapClient->__call('PaymentVerifica...', Array)
و این هم لاین ۱۳۴ اون فایلی که گفته:
$result = $client->PaymentVerification($data);
@khanzadimahdi توی همون لاین دقیقا داره ارور میده یعنی نمیتونه اجراش کنه dd میکنم به همون ارور قبلی میخوره.
@khanzadimahdi
این هست:
SoapClient {#1448 ▼
+"_encoding": "UTF-8"
+"_stream_context": stream-context resource @666 ▼
options: []
}
+"_soap_version": 1
+"sdl": SOAP SDL resource @667
}
@khanzadimahdi حالت سندباکس تست کردید ؟ حالت سندباکسش درست کار کرد برای منم
فقط توی سرور مشکل داره
@khanzadimahdi چطور ممکنه آخه من کوچکترین تغییری رو اپلود نکردم روی سرور!
بدبختی اینه ارور رو هم داره از کدای vendor میگیره نمیدونم واقعا چی کار باید بکنم
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟