راکت
حل شده

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

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;
    }
}
ثبت پرسش جدید

پاسخ‌ها

13
حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

بهترین پاسخ

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

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;
}

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

فرشید مرادی
فرشید مرادی
@eniack

تخصص: noob

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

Saman
Saman
@samanzdev

تخصص: برنامه نویس وب

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

شاید پاسخ شما همین‌جا باشد

hussein
hussein
@husseinhashim1133

تخصص: طراحی وب

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

فرشید مرادی
فرشید مرادی
@eniack

تخصص: noob

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

hussein
hussein
@husseinhashim1133

تخصص: طراحی وب

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

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

@eniack

Saman
Saman
@samanzdev

تخصص: برنامه نویس وب

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

hussein
hussein
@husseinhashim1133

تخصص: طراحی وب

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

Saman
Saman
@samanzdev

تخصص: برنامه نویس وب

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

hussein
hussein
@husseinhashim1133

تخصص: طراحی وب

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

@samanzdev

Saman
Saman
@samanzdev

تخصص: برنامه نویس وب

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

hussein
hussein
@husseinhashim1133

تخصص: طراحی وب

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

hussein
hussein
@husseinhashim1133

تخصص: طراحی وب

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

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