سلام یک سئوالی دارم من این کد نوشتم ایا استاندارت هستش یانه مشکلی نداره لطفا راهنمایی کنید
@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;
}
}
سلام کدت خوب هست ولی با گذشت زمان و کسب تجربه به کوتاه نویسی هم میرسی
یه چند نمونه کوتاه نویسی کردم
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;
}
مثل همین تابع بین خطوط مقداری فاصله بینداز
کامنت گذاری هم یادت نره
چون که خود فریم ورک لاراول هم اقدام به کامنت گذاری کدها نموده است
سلام وقت بخیر ، اولین نکته ای که یه کد استاندارد باید داشته باشه کامنت نویسی و توضیحات هستش ، از توضیح متغیر گرفته تا اصل داستان ،
دومین نکتش کد بهینس یعنی شما نگاه میکنی کدی که نوشتی شده ۳ خط باید جوری نوشته بشه ک مثلا بشه نیم خط ، برای مثال if هایی ک گذاشتین میتونه این قابلیت رو داشته باشه...
سلام
با تمام احترام به نظر آقای مرادی اما با نظر ایشون مخالفم، به نظرم کد باید به شکلی نوشته بشه که اصلا نیاز به کامنت نویسی نداشته باشه در واقع ما باید کد ( Keep It Simple Stupid) رو به ساده ترین شکر ممکن بنویسیم.
یکسری اصول است که عبارت اند از: 1- نام گذاری مناسب متغییر ها 2- تست پذیری 3- کاهش حجم توابع و خیلی موارد دیگه وجود داره.
خیلی ممنون بابت راهنماییتون
@samanzdev
@eniack
وبعد سئوال بعدی اینکه من این روش نوشتم ایا به مشکلی نمیخوره ؟ چون پول میخواد پرداخت کنه خطرناکه کمی میخوام بدونم کدی که نوشتم درسته ؟ یا باید عوضش کنم
@husseinhashim1133
از حالت تستی اون درگاه پرداخت استفاده کنید ، اینطور که من متوجه شدم از پکیج shetabit استقاده میکنید ، برید داخل فایل config و فایل payment و اون رو به حالت sandbox بزارید
زدم حالت تستی هم پرداخت موفق وناموفق بدون مشکل اجرا میشه حالا با زرین پال کار نکردم ولی اگر تراکنش ناموفق بود پول از حساب طرف کم شد باید چه کدی بنویسم که برگرده تو حسابش پکیج که خوندم تو بانک payir
این تکه کدی وجود داشت خودش برمیگردونه تو کارت ولی تو زرین پال تو متد verify همچین کدی وجود نداره
if (isset($body['status'])) {
if ($body['status'] != 1) {
$this->notVerified($body['errorCode']);
}
} else {
$this->notVerified(null);
}
میخوام بدونم که اگر تراکنش موفق نبوده چطوری سیستم میفهمه ناموفق که برگرده به حساب همین پول میاد تو زرین پال یا بانک یا بهتر بگم ایا درخواستی که میفرستم به زرین پال میره بعد منو منتقل میکنه به بانک یا اول به بانک منو میرسونه بعد پول واریز میکنه به زرین پال
@samanzdev
من خوده پکیج خوندم اصلا کدی ننوشته به بانک درخواست بده که این فلان پول ازش کم شده باید برگرده به حسابش ولی تو درگاه payir زده کدشو ارور میفرسته به بانک
نرفتم داکیومنت بخونم رفتم داخل خوده پکیج خوندم
@samanzdev
واز پکیج دیگه استفاده میکنم
از این استفاده میکنم shetabit/payment
سلام کدت خوب هست ولی با گذشت زمان و کسب تجربه به کوتاه نویسی هم میرسی
یه چند نمونه کوتاه نویسی کردم
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;
}
مثل همین تابع بین خطوط مقداری فاصله بینداز
کامنت گذاری هم یادت نره
چون که خود فریم ورک لاراول هم اقدام به کامنت گذاری کدها نموده است
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟