advancelearn / manage-payment-and-orders
Laravel 中的订单和支付管理系统,并为每个模型添加销售功能
Requires
- php: ^8.0.2
- guzzlehttp/guzzle: ^7.2
- laravel/framework: ^9.19
Requires (Dev)
- mockery/mockery: ^1.6
- orchestra/testbench: ^7.0|8.*
- phpunit/phpunit: ^9.0
README
#Advancelearn manage-payment-order
介绍
此包是由 Sadratech 团队成员和 AdvanceLearn 协作开发的。此包旨在创建和管理与用户订单和支付相关的各个方面。它包括跟踪产品数量和标记用户购买订单的每个步骤。“此包目前正在积极开发中,并计划在未来添加购物券模块,具体取决于支持和可行性。”
通过安装此包以及后续步骤,将为您创建地址、国家、省份、城市、订单项、订单注册步骤、订单运费、库存和价格、订单和支付等表格。借助 seder,您可以轻松地在数据库中添加伊朗及其省份和城市的表格。
安装
您可以使用 Composer 安装此包。
composer require advancelearn/manage-payment-and-orders
配置
安装后,请将其提供者添加到 app 文件中的配置文件夹,以完成并配置该包
\Advancelearn\ManagePaymentAndOrders\ManagePayOrderServiceProvider::class,
然后运行以下命令以导入并使包表公开
php artisan vendor:publish
从标签中选择此标题的行号并输入它
Tag: AdvanceLearnManagePayAndOrder-migrations ...............
通过输入上图中的标签编号,这些表将被添加到您的程序表文件夹中
然后输入以下命令以在数据库中添加表
php artisan migrate
###现在您需要遵循以下步骤在程序中初始化审计
php artisan vendor:publish
从标签中选择此标题的行号并输入它
Tag: AdvanceLearnManagePayAndOrder-seeds .....
按照图片顺序输入命令
在数据库中添加订单阶段表的价值,直到我们可以使用这些记录的 ID 来根据我们想要的每个订单阶段进行更新。
重要
在下一步中,您必须为您用户和产品设置这三个表的价值(用户的地址、将作为产品的模型已知金额以及因运输类型而产生的成本金额)
此表 adm_addresses
示例
此表 adm_inventories
示例
此表 adm_shippings
示例
##根据用户请求创建新订单“在初始步骤中,重要的是要记住我们旨在将用户的订单存储在系统中。为了实现这一点,我们需要将所需的参数发送到订单服务包的 'store' 方法。在成功验证这些参数后,我们将收到包含订单详细信息的响应。”我们从用户处接收和发送请求的参数:$shippingId , $addressId , $description , $items
__!!请注意参数的类型__
$items = [ 0 => [ 'quantity' => 2, "inventory_id" => 1 ] ]; $shippingId = $request->shippingId; //It can be null $addressId = (int)$request->addressId; $newOrder = app('orderFunction')->store($shippingId, $addressId, "test from create new order", $items); // return $newOrder; #params : # shippingId => Type of shipment, # $addressId => The address ID stored for the user in the address table , # $description => create new order by user example .... , # $items => Enter the product order number and inventory ID for the corresponding model
为您的模型与库存添加此方法以建立关系
public function inventories() { return $this->morphMany(app('inventory'), 'adm_inventories'); }
添加关系后
“在将您的模型与库存模型集成后,在您的模型中实施此合同至关重要。这允许您在支付阶段成功执行各种操作,例如发送电子邮件或更新您的模型。此外,您可以无缝更新与您的模型中销售记录相关联的库存。”
use Advancelearn\ManagePaymentAndOrders\PaymentConfirmationInterface; class Product extends Model implements PaymentConfirmationInterface { //you're methods or logic //added this method after implemention: public function paymentConfirmation($user_id, $inventory_id, $quantity) { //you're added logic after paymentConfirmation } }
“现在您在订单创建阶段已创建了一个新订单,为了将用户重定向到支付网关,您需要将此订单ID发送到该方法,您可以检查订单金额是否已支付。如果未支付,您可以重定向用户到支付网关。”
在您的类中写入此命名空间
use Advancelearn\ManagePaymentAndOrders\Enums\AuditTypes;
$order = app('order')::findOrFail($orderId); if ($order->audits->where('id', AuditTypes::PAID)->count()) { return response()->json(['errors' => 'Already paid'], 422); }
最后,将最终订单金额发送到门户
$invoice = new Invoice; $invoice->amount($order->payment_price);
在将用户发送到支付门户的相同方法中,您可以创建一个具有挂起状态的支付
app('payment')::create ([ 'order_id' => $order->id, 'driver' => $request->input('driver'), 'transaction_id' => //transactionId from your gateway sent request for pay, 'amount' => $order->payment_price ]);
例如,在您从门户返回的回调方法中,假设您的回调方法是 paymentConfirmation。
public function paymentConfirmation(Request $request) { $payment = app('payment')::where('transaction_id', $transactionId)->first(); $order = app('order')::find($payment->order_id); $receipt = //api call gateway for verifyPayment and get response add to this variable $this->verifyPayAndConfirm($payment, $order, $request); // return redirect('https://example.com?gatewayOrderID=' . // $paymentTransaction->OrderId ?? null . '&RRN=' . // $paymentTransaction->RRN ?? null); }
创建调用方法 verifyPayAndConfirm:: 在您的类中写入此命名空间
use Advancelearn\ManagePaymentAndOrders\Enums\AuditTypes;
private function verifyPayAndConfirm($receipt, $payment, Request $request): void { $payment->reference_id = $receipt->getReferenceId(); $payment->transaction = $request->all(); $payment->driver = $receipt->getDriver(); $payment->save(); $order->audits()->attach([AuditTypes::PAID => ['description' => 'Payment was successful']]); foreach ($order->items as $item) { //this method called fromAnd finally, this // method reaches the method that we implemented // in the corresponding model of the interface $item->PaymentConfirmation($order->address->user_id); } return $receipt; }
##支付状态
您可以通过检查每个新状态应该被记录的步骤来监视已准备的订单的状态。您可以添加与订单当前阶段相关的记录,并可以参考 adm_audits 表中的阶段ID。
您可以调用此方法来获取有关您订单的所有信息
$paginateCount = 6; app('orderFunction')->getOrders($paginateCount);
使用此方法显示单个订单的信息
app('orderFunction')->show($order);
####注意参数类型####您可以使用此方法更新订单。您可以创建 adm_shippings 表中的新记录,用于计算必须计算的运输步骤和价格类型,并发送其ID进行计算或更新方法中的计算。注意此示例。
$shippingId = app('shipping')::find(1)->pluck('id')->first();
$items = [ 0 => [ 'quantity' => 1, "inventory_id" => 1, "price" => 168000//It can be Nal ] ]; $shippingId = $request->shippingId; //can be null $addressId = $request->addressId; $auditId = app('audit')::find(2)->toArray(); $orderId = 9; $update = app('orderFunction')->update($shippingId, $addressId, "update order for test", "2023-09-28 10:01:03", $items, $auditId['id'], $orderId); #params => shippingId , $addressId , $description , $shippingDate , $items , $auditID , $orderId
##重要记住,您用于更新的地址ID必须与 进行购买的购买者
相关,因为我们通过代码中的地址来找到用户。####您可以使用此方法通过用户取消订单
$delete = app('orderFunction')->destroyByUser($orderId); return $delete;
####您可以使用此方法通过管理员取消订单
$delete = app('orderFunction')->destroyByAdmin($orderId); return $delete;
您可以通过这些方法和传递所需参数将订单列表和付款列表显示给管理员和登录用户。
获取订单列表或单个订单
return app('orderFunction')->getOrders(); // get Order List for AdminPanel return app('orderFunction')->singleOrder(5); // get singleOrder for AdminPanel return app('orderFunction')->ordersOfTheLoggedInUser(); // get user Authenticated Order list return app('orderFunction')->SingleOrderOfTheLoggedInUser(5); //get user Authenticated singleOrder
获取付款列表或单个付款
return app('paymentFunction')->getPayments(); // get PaymentList for AdminPanel return app('paymentFunction')->singlePayment(1); //get singlePayment for AdminPanel return app('paymentFunction')->paymentsOfTheLoggedInUser(); //get user Authenticated payment list return app('paymentFunction')->SinglePaymentsOfTheLoggedInUser(1); //send $paymentId
##注意
“当用户使用您的 User 模型,并且您已为此用户定义了地址关系时,在系统中创建新的用户账户时,通过您的包中的 AdmUserObserve,系统为该用户生成一个数字地址。这样,如果用户打算购买非实物产品,且运输费用无关紧要,我们在系统中为它们创建一个数字交付地址。”
结论
通过使用此包,您不需要为订单和支付过程创建单独的模型。此外,它允许展示用户信息历史并管理这些记录。例如,您可以进行将订单状态更新为不同类型和部分、组织订单阶段(例如,发送产品、订单取消、最终登记、准备发货)等操作,所有这些都在统一的框架内进行。