hussein
2 سال پیش توسط hussein مطرح شد
13 پاسخ

ایا این کد استاندارد هست

سلام یک سئوالی دارم من این کد نوشتم ایا استاندارت هستش یانه مشکلی نداره لطفا راهنمایی کنید
@hesammousavi
@endworld
@samanzdev

<?php

namespace App\Http\Controllers\Cart;

use App\Http\Controllers\Controller;
use App\Models\Address;
use App\Models\Discount;
use App\Models\Order;
use App\Models\Product;
use App\Models\ShoppingCart;
use Illuminate\Http\Request;
use Shetabit\Multipay\Exceptions\InvalidPaymentException;
use Shetabit\Multipay\Invoice;
use Shetabit\Payment\Facade\Payment;

class PaymentController extends Controller
{
    function getPrice(Product $product)
    {
        $price = null;
        if (($discount = $product->price->discount) !== null) {
            $price = $discount;
        } else {
            $price = $product->price->value;
        }
        return $price;
    }

    public function payment(Request $request)
    {
        $shoppingCart = ShoppingCart::where('user_id', auth()->user()->id)->with('product')->get();

        if (isset($shoppingCart)) {
            if ($request->address_id != null) {
                $address = Address::where('id', $request->address_id)->first();
            }

            $order = $this->firstOrCreateOrder($shoppingCart, $request, $address, $request->resnumber);
        }

        $invoice = (new Invoice)->amount($this->sum($shoppingCart, $request->couponText));
        $Uuid = $invoice->getUuid();
        $payment = Payment::callbackUrl('http://127.0.0.1:8000/products/checkout/callback?resnumber=' . $Uuid)
            ->purchase($invoice,
                function ($driver, $transactionId) use ($order, $invoice, $shoppingCart, $Uuid) {
                    $order->where('id', $order->id)->update([
                        'resnumber' => $Uuid
                    ]);
                    foreach ($shoppingCart as $cart) {
                        $cart->delete();
                    }
                })->pay()->toJson();
        $payment = json_decode($payment);
        return response([
            'isSuccess' => true,
            'message' => 'لطفا شکیبا باشید درحال انتقال به بانک هستید',
            'payment' => "{$payment->action}"
        ]);
    }

    private function sum($shoppingCart, $couponText)
    {
        $sum = null;
        foreach ($shoppingCart as $cart) {
            $sum = $sum + ($this->getPrice($cart->product) * $cart['quantity']);
        }

        if ($couponText != null) {
            $discount = Discount::where('code', $couponText)->first();
            if ($discount != null) {
                $sum = (($sum * (100 - $discount->percent)) / 100);
            }
        }
        return $sum;
    }

    public function paymentCallback(Request $request)
    {
        $order = Order::where('resnumber', $request->resnumber)->firstOrFail();
        try {
            $payment = Payment::amount($order->total_price)->transactionId($request->Authority)->verify();
            $order->update([
                'status' => 'paid'
            ]);
            return response([
                'isSuccess' => true,
                'message' => 'خرید شما با موفقیت پرداخت شده ',
            ]);
        } catch (InvalidPaymentException  $e) {
            return response([
                'isSuccess' => false,
                'message' => $e->getMessage(),
            ]);
        }

    }

    /**
     * @param $shoppingCart
     * @param Request $request
     * @param $address
     * @return Order|\Illuminate\Database\Eloquent\Model
     */
    private function firstOrCreateOrder($shoppingCart, Request $request, $address, $resnumber = null)
    {
        $orderItems = $shoppingCart->mapWithKeys(function ($cart) {
            return [$cart['product']->id => ['quantity' => $cart['quantity']]];
        });

        if ($resnumber != null) {
            $order = Order::where('resnumber', $resnumber)->first();
        } else {
            $order = Order::create([
                'user_id' => auth()->user()->id,
                'delivery' => $request->delivery_method,
                'payment_method' => $request->selected_payment_method,
                'address_id' => $address ? $address->id : null,
                'discount_code' => $request->couponText,
                'total_price' => $this->sum($shoppingCart, $request->couponText),
                'status' => 'unpaid',
            ]);
        }

        $order->products()->attach($orderItems);
        return $order;
    }
}

ثبت پرسش جدید
حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 2 سال پیش مطرح شد
1

سلام کدت خوب هست ولی با گذشت زمان و کسب تجربه به کوتاه نویسی هم میرسی
یه چند نمونه کوتاه نویسی کردم

function getPrice(Product $product)
{

    if ($discount = $product->price->discount) {
        return $discount;
    } 

    return $product->price->value;
}

این خطو میتونی به این روش بنویسی به ساختار if توجه کن که چطوری تغییر کرده

 if ($request->address_id != null) {
                $address = Address::where('id', $request->address_id)->first();
            }

به این صورت بنویس

if ($request->address_id) {
    $address = Address::whereId($request->address_id)->first();
}

خط 104 رو همیشه به این صورت بنویس یعنی اول Request رو تزریق کن بعد متغییرهای خودتو

private function firstOrCreateOrder(Request $request, $shoppingCart, $address, $resnumber = null)

تو این حالت سعی کن یا حتما یه کد ریسپانس هم برگردون چون اگه کد خطا رو مشخص نکنی پیش فرض 200 در نظر میگیره

return response([
    'isSuccess' => false,
    'message' => $e->getMessage(),
], 500);

خط 31 رو اینطوری بنویس

$shoppingCart = ShoppingCart::with('product')->where('user_id', auth()->user()->id)->get();

در خط 38 چون شما مت؛ییر $request رو ارسال کردی دیگه resnumber رو به تنهایی ارسال نکن چون با مت؛ییر request ارسال شده

$order = $this->firstOrCreateOrder($shoppingCart, $request, $address);

تابع sum رو هم اینطوری بنویس

private function sum($shoppingCart, $couponText)
{
    $sum = 0;

    foreach ($shoppingCart as $cart) {
        $sum +=  $this->getPrice($cart->product) * $cart['quantity'];
    }

    if ($couponText) {
        $discount = Discount::firstWhere('code', $couponText);

        if ($discount) {
            $sum = $sum * (100 - $discount->percent) / 100;
        }
    }

    return $sum;
}

مثل همین تابع بین خطوط مقداری فاصله بینداز
کامنت گذاری هم یادت نره
چون که خود فریم ورک لاراول هم اقدام به کامنت گذاری کدها نموده است


فرشید مرادی
تخصص : noob
@eniack 2 سال پیش مطرح شد
0

سلام وقت بخیر ، اولین نکته ای که یه کد استاندارد باید داشته باشه کامنت نویسی و توضیحات هستش ، از توضیح متغیر گرفته تا اصل داستان ،
دومین نکتش کد بهینس یعنی شما نگاه میکنی کدی که نوشتی شده ۳ خط باید جوری نوشته بشه ک مثلا بشه نیم خط ، برای مثال if هایی ک گذاشتین میتونه این قابلیت رو داشته باشه...


Saman
تخصص : برنامه نویس وب
@samanzdev 2 سال پیش مطرح شد
0

سلام
با تمام احترام به نظر آقای مرادی اما با نظر ایشون مخالفم، به نظرم کد باید به شکلی نوشته بشه که اصلا نیاز به کامنت نویسی نداشته باشه در واقع ما باید کد ( Keep It Simple Stupid) رو به ساده ترین شکر ممکن بنویسیم.
یکسری اصول است که عبارت اند از: 1- نام گذاری مناسب متغییر ها 2- تست پذیری 3- کاهش حجم توابع و خیلی موارد دیگه وجود داره.


hussein
تخصص : طراحی وب
@husseinhashim1133 2 سال پیش مطرح شد
0

خیلی ممنون بابت راهنماییتون
@samanzdev
@eniack
وبعد سئوال بعدی اینکه من این روش نوشتم ایا به مشکلی نمیخوره ؟ چون پول میخواد پرداخت کنه خطرناکه کمی میخوام بدونم کدی که نوشتم درسته ؟ یا باید عوضش کنم


فرشید مرادی
تخصص : noob
@eniack 2 سال پیش مطرح شد
0

@husseinhashim1133
از حالت تستی اون درگاه پرداخت استفاده کنید ، اینطور که من متوجه شدم از پکیج shetabit استقاده میکنید ، برید داخل فایل config و فایل payment و اون رو به حالت sandbox بزارید


hussein
تخصص : طراحی وب
@husseinhashim1133 2 سال پیش آپدیت شد
0

زدم حالت تستی هم پرداخت موفق وناموفق بدون مشکل اجرا میشه حالا با زرین پال کار نکردم ولی اگر تراکنش ناموفق بود پول از حساب طرف کم شد باید چه کدی بنویسم که برگرده تو حسابش پکیج که خوندم تو بانک payir
این تکه کدی وجود داشت خودش برمیگردونه تو کارت ولی تو زرین پال تو متد verify همچین کدی وجود نداره

if (isset($body['status'])) {
            if ($body['status'] != 1) {
                $this->notVerified($body['errorCode']);
            }
        } else {
            $this->notVerified(null);
        }

@eniack


Saman
تخصص : برنامه نویس وب
@samanzdev 2 سال پیش مطرح شد
0

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


hussein
تخصص : طراحی وب
@husseinhashim1133 2 سال پیش مطرح شد
0

میخوام بدونم که اگر تراکنش موفق نبوده چطوری سیستم میفهمه ناموفق که برگرده به حساب همین پول میاد تو زرین پال یا بانک یا بهتر بگم ایا درخواستی که میفرستم به زرین پال میره بعد منو منتقل میکنه به بانک یا اول به بانک منو میرسونه بعد پول واریز میکنه به زرین پال
@samanzdev


Saman
تخصص : برنامه نویس وب
@samanzdev 2 سال پیش مطرح شد
0

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


hussein
تخصص : طراحی وب
@husseinhashim1133 2 سال پیش آپدیت شد
0

من خوده پکیج خوندم اصلا کدی ننوشته به بانک درخواست بده که این فلان پول ازش کم شده باید برگرده به حسابش ولی تو درگاه payir زده کدشو ارور میفرسته به بانک

@samanzdev


Saman
تخصص : برنامه نویس وب
@samanzdev 2 سال پیش مطرح شد
0

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


hussein
تخصص : طراحی وب
@husseinhashim1133 2 سال پیش مطرح شد
0

نرفتم داکیومنت بخونم رفتم داخل خوده پکیج خوندم
@samanzdev
واز پکیج دیگه استفاده میکنم
از این استفاده میکنم shetabit/payment


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 2 سال پیش مطرح شد
1

سلام کدت خوب هست ولی با گذشت زمان و کسب تجربه به کوتاه نویسی هم میرسی
یه چند نمونه کوتاه نویسی کردم

function getPrice(Product $product)
{

    if ($discount = $product->price->discount) {
        return $discount;
    } 

    return $product->price->value;
}

این خطو میتونی به این روش بنویسی به ساختار if توجه کن که چطوری تغییر کرده

 if ($request->address_id != null) {
                $address = Address::where('id', $request->address_id)->first();
            }

به این صورت بنویس

if ($request->address_id) {
    $address = Address::whereId($request->address_id)->first();
}

خط 104 رو همیشه به این صورت بنویس یعنی اول Request رو تزریق کن بعد متغییرهای خودتو

private function firstOrCreateOrder(Request $request, $shoppingCart, $address, $resnumber = null)

تو این حالت سعی کن یا حتما یه کد ریسپانس هم برگردون چون اگه کد خطا رو مشخص نکنی پیش فرض 200 در نظر میگیره

return response([
    'isSuccess' => false,
    'message' => $e->getMessage(),
], 500);

خط 31 رو اینطوری بنویس

$shoppingCart = ShoppingCart::with('product')->where('user_id', auth()->user()->id)->get();

در خط 38 چون شما مت؛ییر $request رو ارسال کردی دیگه resnumber رو به تنهایی ارسال نکن چون با مت؛ییر request ارسال شده

$order = $this->firstOrCreateOrder($shoppingCart, $request, $address);

تابع sum رو هم اینطوری بنویس

private function sum($shoppingCart, $couponText)
{
    $sum = 0;

    foreach ($shoppingCart as $cart) {
        $sum +=  $this->getPrice($cart->product) * $cart['quantity'];
    }

    if ($couponText) {
        $discount = Discount::firstWhere('code', $couponText);

        if ($discount) {
            $sum = $sum * (100 - $discount->percent) / 100;
        }
    }

    return $sum;
}

مثل همین تابع بین خطوط مقداری فاصله بینداز
کامنت گذاری هم یادت نره
چون که خود فریم ورک لاراول هم اقدام به کامنت گذاری کدها نموده است


hussein
تخصص : طراحی وب
@husseinhashim1133 2 سال پیش مطرح شد

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

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