مرتضی رحمانی
4 سال پیش توسط مرتضی رحمانی مطرح شد
21 پاسخ

مشکل در پکیج shetabit-payment

@khanzadimahdi

سلام خسته نباشید...
من در سایتم میخوام از پکیج shetabit استفاده کنم اما به یه مشکلی بر خوردم
وقتی کاربر روی دکمه خرید کلیک میکنه یک کنترلر خونده میشه و به درگاه پرداخت منتقل میشه :

$invoice = new Invoice;
$invoice->amount(1000);
$invoice->detail(['detailName' => $transaction->transactionable_type]);
$payment = Payment::purchase($invoice, function($driver, $transactionId){
    return;
});
return $payment->pay()->render();

بعد از اتمام خرید کاربر به صفحه ی verify منتقل میشه. اونجا من این کد ها رو قرار دادم تا وریفای کنه اما خطای (کد تراکنش صحیح نیست) به من میده :

$userId = auth()->user()->id;
$transaction = Transaction::where('user_id', $userId)->orderBy('id', 'DESC')->first();

try {
   // check and save informations
   $receipt = Payment::amount((int)$transaction->total_price)->verify();
   $transaction->ref_id = $receipt->getReferenceId();
   $transaction->status = 1;
   $transaction->save();
   ...
}

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


ثبت پرسش جدید
mahdi khanzadi
تخصص : backend developer at Snapp mar...
@khanzadimahdi 4 سال پیش مطرح شد
0

سلام. از چه درگاهی استفاده میکنید؟


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

@khanzadimahdi
از درگاه NEXTPAY
کنترلر هام درستن؟


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

@mohsenbostan
@mohammadeng3731
@MehdiAghighi
@ali.bayat
@behzadd
@milad
شما هم کمکم کنید کاربرای برتر


محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 4 سال پیش مطرح شد
0

@rmorteza3000
سلام.
به نظر من همه چیز درست میومد.
اما آقای خانزادی بهتر می تونن کمک کنن. به هر حال ایشون سازنده این پکیج هستن.


woz
تخصص : fan of open source world
@wozniak 4 سال پیش مطرح شد
0

@rmorteza3000
بوسیله dd تست کنید درخواست شما تا کجا می رسه. اصلا به متد وریفای کنترلر میرسه یانه. اینو تست کنید اول و پیدا کنید کجا کدوم فانکشن شما این ارور رو generate میکنه


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

@behzadd
بهزاد من متد dd تست کردم از مرحله اول رد میشه و یک transaction id هم ایجاد میشه.
در مرحله verify هم dd($request) میزنم اما null برمیگردونه. اگه dd($transaction) رو بزنم (که یک جدول در دیتابیس هست) اطلاعات اون کاربر رو نشون میده. حالا نمیدونم اینجا شاید خود درگاه بانکی nextpay، مقادیر خاصی رو به فانکشن verify من ارسال میکنه، و من باید اونو دریافت کنم تا مشکل برطرف بشه. نمیدونم دیگه... راهنماییم کنید.
خلاصه تا اون متد verify میره و اونجا چون transaction_id تایید نمیشه میره و از try رد میشه و catch رو اجرا میکنه.


woz
تخصص : fan of open source world
@wozniak 4 سال پیش مطرح شد
1

@rmorteza3000
ببینید وریفای نباید $request داخلش نال باشه! و البته یادتون باشه که route وریفای شما رو nextpay کال میکنه و ریدایرکت میده.
پس اگر این null رو شما با کال بک گرفتن از نکست پی دریافت کردی که یه جای کار اشکال داره. ولی اگه خودت مسیر وریفای رو هیت کردی ، این کار اشتباهه و این کار رو با انجام مراحل و کال بک گرفتن از نکست پی دوباره تکرار کن.

یه مطلب دیگه ، یبار اون کدی که به عنوان کد تراکنش میفرستی رو چک کن ببین موقع برگشت هم همون رو وریفای میکنی یا نه؟اینو بررسی کن


مرتضی رحمانی
تخصص : توسعه دهنده وب
@mortezarahmani 4 سال پیش مطرح شد
1

@behzadd
@khanzadimahdi
مسیر وریفای رو خودم در روت تعریف کردم و براش یک کنترلر ایجاد کردم که رَوش خود داکیومنتیشن این پکیج هست.
ولی شاید همینجا یه مشکلی هست که نمیدونم.

اون کد تراکنش رو هم چون خود آقای خانزادی گفتند که تو آپدیت جدید این پکیج نیازی به دریافت و ذخیره transaction id نیست من هم این کار رو نکردم.


مرتضی رحمانی
تخصص : توسعه دهنده وب
@mortezarahmani 4 سال پیش مطرح شد
1

@khanzadimahdi

آقای خانزادی لطفا زودتر پاسخ بدین من لنگ این پکیجتون موندم😐


woz
تخصص : fan of open source world
@wozniak 4 سال پیش مطرح شد
0

@rmorteza3000
متوجه نشدم متاسفانه


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

وقتی از متد purchase استفاده میکنی، باید داخل کلوژر transactionId رو ذخیره کنی..
توی مستندات که این رو نوشته و من هم به همین شکل استفاده کردم و مشکلی نداشته.


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

@khanzadimahdi
کدوم قسمت رو متوجه نشدید؟


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

@ali.bayat
احتمالا من مستنداتش رو خوب متوجه نشدم ولی خوندمش
میشه بگید دقیقا باید چه تغییراتی در کدم ایجاد کنم؟


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
2

باید اول یه Order بسازی که بعدا بتونی داخل کلوژر از transactionId استفاده کنی و فیلد Order رو مقدار دهی کنی.

function () {
    $order->update(['transaction_id' => $transactionId]);
}

بعد هم که خواستی verify کنی .. فیلد Order که همون transactionId هست رو پاس میدی.


Payment::amount($price)
            ->transactionId($order->transaction_id)
            ->verify()

mahdi khanzadi
تخصص : backend developer at Snapp mar...
@khanzadimahdi 4 سال پیش آپدیت شد
2

شما یا باید طبق چیزی که اقای بیات گفت ایدی تراکنش رو واسه وریفای شدن پاس بدی یا اینکه خودش اون رو از request میگیره.

طبق صحبتی که کردی request هم مثل اینکه نال هست! مشکل از پکیج نیست و از جای دیگه ای هست.

وقتی که request برابر با null میشه طبیعی هست که توی verify نمیتونه کد تراکنش رو از درخواست برگشتی درگاه بگیره.

https://github.com/shetabit/multipay/blob/master/src/Drivers/Nextpay/Nextpay.php

کدهای درایور نکست پی درون مسیر بالا قرار داره. پیشنهاد میکنم یه نگاهی بهش بندازید و متد های purchase و verify رو بررسی کنید.


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
1

@khanzadimahdi
درود آقای خانزادی

یا اینکه خودش اون رو از request میگیره.

این ویژگی تو نسخه جدید اضافه شده؟


mahdi khanzadi
تخصص : backend developer at Snapp mar...
@khanzadimahdi 4 سال پیش آپدیت شد
1

@ali.bayat

بله. البته بهتره که خودتون کد تراکنش رو ذخیره کنید و موقع وریفای ازش استفاده کنید.
توی تمامی درایور ها در صورتی که کد تراکنش رو پاس نداده باشید سعی میکنه اون رو از request برگشتی بانک پیدا کنه و استفاده کنه. اما خیلی از درگاه ها توی request بازگشت دیگه کد تراکنش رو نمیزارن! من این فیچر رو به این دلیل اظافه کردم که اگه یه موقع مشکلی در گرفتن کد تراکنش بود, مرحله ی وریفای fail نشه و به درستی انجام بشه.

    /**
     * Verify payment
     *
     * @return ReceiptInterface
     *
     * @throws InvalidPaymentException
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function verify() : ReceiptInterface
    {
        $transactionId = $this->invoice->getTransactionId() ?? Request::input('trans_id');

        $data = [
            'api_key' => $this->settings->merchantId,
            'order_id' => Request::input('order_id'),
            'amount' => $this->invoice->getAmount(),
            'trans_id' => $transactionId,
        ];

یه تیکه از کد وریفای رو میزارم. دقت کنید اگه کد تراکنش رو پاس بدید از چیزی که شما دادین استفاده میکنه اما اگه اون رو بنا به هر دلایلی پاس ندید از درخواست بازگشتی بانک استفاده میشه).
واسه پکیج باید change log هم بزارم تا فیچر ها رو بشه مرور کرد.


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

@ali.bayat
@khanzadimahdi

از پاسختون متشکرم
من در داخل دیتابیس یک فیلدی به نام transaction_id دارم و میخوام اون مقدار رو داخل کلوژر سیو کنم.

            $payment = Payment::purchase($invoice, function($driver, $transactionId){
                $transaction->transaction_id = $transactionId;
                $transaction->save();
            });
            return $payment->pay()->render();

منتهی اینجا مشکلی هست و برام یک ارور میاد :
ErrorException
Creating default object from empty value
مشکل چیه؟

درضمن آقای بیات روشی که شما گفتید (ساختن یک Order و مقدار دهی اون) من این روش رو متوجه نشدم


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

شما باید در یه جایی اون شماره تراکنش رو ذخیره کنید..
روشی که من اشتفاده میکنم، ذخیره شماره تراکنش داخل آبجکت Order هست
شما میتونید هر جا که دوست دارید ذخیرش کنید و بعد وریفای کنید


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

@khanzadimahdi
بسیار عالی، جدیدا سورس کد رو چک نکرده بودم..
بله change log هم باشه، عالی میشه


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

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