فهرست منبع

feat: bump panel to 2023.4

M1Screw 2 سال پیش
والد
کامیت
8e985d1e59

+ 1 - 1
app/predefine.php

@@ -7,4 +7,4 @@ declare(strict_types=1);
  */
  */
 
 
 const BASE_PATH = __DIR__ . '/..';
 const BASE_PATH = __DIR__ . '/..';
-const VERSION = '2023.3';
+const VERSION = '2023.4';

+ 26 - 24
src/Controllers/Admin/CouponController.php

@@ -7,16 +7,22 @@ namespace App\Controllers\Admin;
 use App\Controllers\BaseController;
 use App\Controllers\BaseController;
 use App\Models\UserCoupon;
 use App\Models\UserCoupon;
 use App\Utils\Tools;
 use App\Utils\Tools;
+use Exception;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ResponseInterface;
-use Slim\Http\Request;
 use Slim\Http\Response;
 use Slim\Http\Response;
+use Slim\Http\ServerRequest;
+use function in_array;
+use function json_decode;
+use function json_encode;
+use function property_exists;
+use function time;
 
 
 /*
 /*
  *  Coupon Controller
  *  Coupon Controller
  */
  */
 final class CouponController extends BaseController
 final class CouponController extends BaseController
 {
 {
-    public static $details = [
+    public static array $details = [
         'field' => [
         'field' => [
             'op' => '操作',
             'op' => '操作',
             'id' => '优惠码ID',
             'id' => '优惠码ID',
@@ -97,9 +103,9 @@ final class CouponController extends BaseController
     /**
     /**
      * 后台优惠码页面
      * 后台优惠码页面
      *
      *
-     * @param array     $args
+     * @throws Exception
      */
      */
-    public function index(Request $request, Response $response, array $args): ResponseInterface
+    public function index(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         return $response->write(
         return $response->write(
             $this->view()
             $this->view()
@@ -110,10 +116,8 @@ final class CouponController extends BaseController
 
 
     /**
     /**
      * 添加优惠码
      * 添加优惠码
-     *
-     * @param array     $args
      */
      */
-    public function add(Request $request, Response $response, array $args): ResponseInterface
+    public function add(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $code = $request->getParam('code');
         $code = $request->getParam('code');
         $type = $request->getParam('type');
         $type = $request->getParam('type');
@@ -125,7 +129,7 @@ final class CouponController extends BaseController
         $generate_method = $request->getParam('generate_method');
         $generate_method = $request->getParam('generate_method');
         $expire_time = $request->getParam('expire_time');
         $expire_time = $request->getParam('expire_time');
 
 
-        if ($code === '' && \in_array($generate_method, ['char', 'char_ramdom'])) {
+        if ($code === '' && in_array($generate_method, ['char', 'char_ramdom'])) {
             return $response->withJson([
             return $response->withJson([
                 'ret' => 0,
                 'ret' => 0,
                 'msg' => '优惠码不能为空',
                 'msg' => '优惠码不能为空',
@@ -146,7 +150,7 @@ final class CouponController extends BaseController
             ]);
             ]);
         }
         }
 
 
-        if ($expire_time !== '' && $expire_time < \time()) {
+        if ($expire_time !== '' && $expire_time < time()) {
             return $response->withJson([
             return $response->withJson([
                 'ret' => 0,
                 'ret' => 0,
                 'msg' => '到期时间不能小于当前时间',
                 'msg' => '到期时间不能小于当前时间',
@@ -161,7 +165,7 @@ final class CouponController extends BaseController
         }
         }
 
 
         if ($generate_method === 'char_random') {
         if ($generate_method === 'char_random') {
-            $code .= Tools::genRandomChar(8);
+            $code .= Tools::genRandomChar();
 
 
             if (UserCoupon::where('code', $code)->count() !== 0) {
             if (UserCoupon::where('code', $code)->count() !== 0) {
                 return $response->withJson([
                 return $response->withJson([
@@ -172,7 +176,7 @@ final class CouponController extends BaseController
         }
         }
 
 
         if ($generate_method === 'random') {
         if ($generate_method === 'random') {
-            $code = Tools::genRandomChar(8);
+            $code = Tools::genRandomChar();
 
 
             if (UserCoupon::where('code', $code)->count() !== 0) {
             if (UserCoupon::where('code', $code)->count() !== 0) {
                 return $response->withJson([
                 return $response->withJson([
@@ -197,9 +201,9 @@ final class CouponController extends BaseController
 
 
         $coupon = new UserCoupon();
         $coupon = new UserCoupon();
         $coupon->code = $code;
         $coupon->code = $code;
-        $coupon->content = \json_encode($content);
-        $coupon->limit = \json_encode($limit);
-        $coupon->create_time = \time();
+        $coupon->content = json_encode($content);
+        $coupon->limit = json_encode($limit);
+        $coupon->create_time = time();
         if ($expire_time !== '') {
         if ($expire_time !== '') {
             $coupon->expire_time = $expire_time;
             $coupon->expire_time = $expire_time;
         } else {
         } else {
@@ -213,7 +217,7 @@ final class CouponController extends BaseController
         ]);
         ]);
     }
     }
 
 
-    public function delete(Request $request, Response $response, array $args): ResponseInterface
+    public function delete(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $coupon_id = $args['id'];
         $coupon_id = $args['id'];
         UserCoupon::find($coupon_id)->delete();
         UserCoupon::find($coupon_id)->delete();
@@ -223,13 +227,13 @@ final class CouponController extends BaseController
         ]);
         ]);
     }
     }
 
 
-    public function disable(ServerRequest $request, Response $response, array $args)
+    public function disable(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $coupon_id = $args['id'];
         $coupon_id = $args['id'];
         $coupon = UserCoupon::find($coupon_id)->first();
         $coupon = UserCoupon::find($coupon_id)->first();
-        $limit = \json_decode($coupon->limit);
+        $limit = json_decode($coupon->limit);
         $limit->disabled = 1;
         $limit->disabled = 1;
-        $coupon->limit = \json_encode($limit);
+        $coupon->limit = json_encode($limit);
         $coupon->save();
         $coupon->save();
         return $response->withJson([
         return $response->withJson([
             'ret' => 1,
             'ret' => 1,
@@ -239,15 +243,13 @@ final class CouponController extends BaseController
 
 
     /**
     /**
      * 后台商品优惠码页面 AJAX
      * 后台商品优惠码页面 AJAX
-     *
-     * @param array     $args
      */
      */
-    public function ajax(Request $request, Response $response, array $args): ResponseInterface
+    public function ajax(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $coupons = UserCoupon::orderBy('id', 'desc')->get();
         $coupons = UserCoupon::orderBy('id', 'desc')->get();
         foreach ($coupons as $coupon) {
         foreach ($coupons as $coupon) {
-            $content = \json_decode($coupon->content);
-            $limit = \json_decode($coupon->limit);
+            $content = json_decode($coupon->content);
+            $limit = json_decode($coupon->limit);
             if ($limit->disabled === 1) {
             if ($limit->disabled === 1) {
                 $coupon->op = '<button type="button" class="btn btn-red" id="delete-coupon-' . $coupon->id . '" 
                 $coupon->op = '<button type="button" class="btn btn-red" id="delete-coupon-' . $coupon->id . '" 
                 onclick="deleteCoupon(' . $coupon->id . ')">删除</button>';
                 onclick="deleteCoupon(' . $coupon->id . ')">删除</button>';
@@ -267,7 +269,7 @@ final class CouponController extends BaseController
                 $coupon->use_time = $limit->use_time;
                 $coupon->use_time = $limit->use_time;
             }
             }
 
 
-            if ((int) $limit->total_use_time < 0) {
+            if (! property_exists($limit, 'total_use_time') || (int) $limit->total_use_time < 0) {
                 $coupon->total_use_time = '不限次数';
                 $coupon->total_use_time = '不限次数';
             } else {
             } else {
                 $coupon->total_use_time = $limit->total_use_time;
                 $coupon->total_use_time = $limit->total_use_time;

+ 12 - 7
src/Controllers/Admin/GiftCardController.php

@@ -7,13 +7,15 @@ namespace App\Controllers\Admin;
 use App\Controllers\BaseController;
 use App\Controllers\BaseController;
 use App\Models\GiftCard;
 use App\Models\GiftCard;
 use App\Utils\Tools;
 use App\Utils\Tools;
+use Exception;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ResponseInterface;
-use Slim\Http\Request;
 use Slim\Http\Response;
 use Slim\Http\Response;
+use Slim\Http\ServerRequest;
+use function time;
 
 
 final class GiftCardController extends BaseController
 final class GiftCardController extends BaseController
 {
 {
-    public static $details = [
+    public static array $details = [
         'field' => [
         'field' => [
             'op' => '操作',
             'op' => '操作',
             'id' => '礼品卡ID',
             'id' => '礼品卡ID',
@@ -52,7 +54,10 @@ final class GiftCardController extends BaseController
         ],
         ],
     ];
     ];
 
 
-    public function index(Request $request, Response $response, array $args): ResponseInterface
+    /**
+     * @throws Exception
+     */
+    public function index(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         return $response->write(
         return $response->write(
             $this->view()
             $this->view()
@@ -61,7 +66,7 @@ final class GiftCardController extends BaseController
         );
         );
     }
     }
 
 
-    public function add(Request $request, Response $response, array $args): ResponseInterface
+    public function add(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $card_number = $request->getParam('card_number') ?? 0;
         $card_number = $request->getParam('card_number') ?? 0;
         $card_value = $request->getParam('card_value') ?? 0;
         $card_value = $request->getParam('card_value') ?? 0;
@@ -95,7 +100,7 @@ final class GiftCardController extends BaseController
             $giftcard = new GiftCard();
             $giftcard = new GiftCard();
             $giftcard->card = $card;
             $giftcard->card = $card;
             $giftcard->balance = $card_value;
             $giftcard->balance = $card_value;
-            $giftcard->create_time = \time();
+            $giftcard->create_time = time();
             $giftcard->status = 0;
             $giftcard->status = 0;
             $giftcard->use_time = 0;
             $giftcard->use_time = 0;
             $giftcard->use_user = 0;
             $giftcard->use_user = 0;
@@ -109,7 +114,7 @@ final class GiftCardController extends BaseController
         ]);
         ]);
     }
     }
 
 
-    public function delete(Request $request, Response $response, array $args): ResponseInterface
+    public function delete(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $card_id = $args['id'];
         $card_id = $args['id'];
         GiftCard::find($card_id)->delete();
         GiftCard::find($card_id)->delete();
@@ -120,7 +125,7 @@ final class GiftCardController extends BaseController
         ]);
         ]);
     }
     }
 
 
-    public function ajax(Request $request, Response $response, array $args): ResponseInterface
+    public function ajax(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $giftcards = GiftCard::orderBy('id', 'desc')->get();
         $giftcards = GiftCard::orderBy('id', 'desc')->get();
 
 

+ 20 - 10
src/Controllers/Admin/InvoiceController.php

@@ -9,9 +9,13 @@ use App\Models\Invoice;
 use App\Models\Order;
 use App\Models\Order;
 use App\Models\Paylist;
 use App\Models\Paylist;
 use App\Utils\Tools;
 use App\Utils\Tools;
+use Exception;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ResponseInterface;
-use Slim\Http\Request;
 use Slim\Http\Response;
 use Slim\Http\Response;
+use Slim\Http\ServerRequest;
+use function in_array;
+use function json_decode;
+use function time;
 
 
 final class InvoiceController extends BaseController
 final class InvoiceController extends BaseController
 {
 {
@@ -29,7 +33,10 @@ final class InvoiceController extends BaseController
         ],
         ],
     ];
     ];
 
 
-    public function index(Request $request, Response $response, array $args): ResponseInterface
+    /**
+     * @throws Exception
+     */
+    public function index(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         return $response->write(
         return $response->write(
             $this->view()
             $this->view()
@@ -38,7 +45,10 @@ final class InvoiceController extends BaseController
         );
         );
     }
     }
 
 
-    public function detail(Request $request, Response $response, array $args): ResponseInterface
+    /**
+     * @throws Exception
+     */
+    public function detail(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $id = $args['id'];
         $id = $args['id'];
         $invoice = Invoice::find($id);
         $invoice = Invoice::find($id);
@@ -52,7 +62,7 @@ final class InvoiceController extends BaseController
         $invoice->create_time = Tools::toDateTime($invoice->create_time);
         $invoice->create_time = Tools::toDateTime($invoice->create_time);
         $invoice->update_time = Tools::toDateTime($invoice->update_time);
         $invoice->update_time = Tools::toDateTime($invoice->update_time);
         $invoice->pay_time = Tools::toDateTime($invoice->pay_time);
         $invoice->pay_time = Tools::toDateTime($invoice->pay_time);
-        $invoice_content = \json_decode($invoice->content);
+        $invoice_content = json_decode($invoice->content);
 
 
         return $response->write(
         return $response->write(
             $this->view()
             $this->view()
@@ -63,12 +73,12 @@ final class InvoiceController extends BaseController
         );
         );
     }
     }
 
 
-    public function markPaid(Request $request, Response $response, array $args): ResponseInterface
+    public function markPaid(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $invoice_id = $args['id'];
         $invoice_id = $args['id'];
         $invoice = Invoice::find($invoice_id);
         $invoice = Invoice::find($invoice_id);
 
 
-        if (\in_array($invoice->status, ['paid_gateway', 'paid_balance', 'paid_admin'])) {
+        if (in_array($invoice->status, ['paid_gateway', 'paid_balance', 'paid_admin'])) {
             return $response->withJson([
             return $response->withJson([
                 'ret' => 0,
                 'ret' => 0,
                 'msg' => '不能标记已经支付的账单',
                 'msg' => '不能标记已经支付的账单',
@@ -84,12 +94,12 @@ final class InvoiceController extends BaseController
             ]);
             ]);
         }
         }
 
 
-        $order->update_time = \time();
+        $order->update_time = time();
         $order->status = 'pending_activation';
         $order->status = 'pending_activation';
         $order->save();
         $order->save();
 
 
-        $invoice->update_time = \time();
-        $invoice->pay_time = \time();
+        $invoice->update_time = time();
+        $invoice->pay_time = time();
         $invoice->status = 'paid_admin';
         $invoice->status = 'paid_admin';
         $invoice->save();
         $invoice->save();
 
 
@@ -99,7 +109,7 @@ final class InvoiceController extends BaseController
         ]);
         ]);
     }
     }
 
 
-    public function ajax(Request $request, Response $response, array $args): ResponseInterface
+    public function ajax(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $invoices = Invoice::orderBy('id', 'desc')->get();
         $invoices = Invoice::orderBy('id', 'desc')->get();
 
 

+ 21 - 11
src/Controllers/Admin/OrderController.php

@@ -8,9 +8,13 @@ use App\Controllers\BaseController;
 use App\Models\Invoice;
 use App\Models\Invoice;
 use App\Models\Order;
 use App\Models\Order;
 use App\Utils\Tools;
 use App\Utils\Tools;
+use Exception;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ResponseInterface;
-use Slim\Http\Request;
 use Slim\Http\Response;
 use Slim\Http\Response;
+use Slim\Http\ServerRequest;
+use function in_array;
+use function json_decode;
+use function time;
 
 
 final class OrderController extends BaseController
 final class OrderController extends BaseController
 {
 {
@@ -30,7 +34,10 @@ final class OrderController extends BaseController
         ],
         ],
     ];
     ];
 
 
-    public function index(Request $request, Response $response, array $args): ResponseInterface
+    /**
+     * @throws Exception
+     */
+    public function index(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         return $response->write(
         return $response->write(
             $this->view()
             $this->view()
@@ -39,7 +46,10 @@ final class OrderController extends BaseController
         );
         );
     }
     }
 
 
-    public function detail(Request $request, Response $response, array $args): ResponseInterface
+    /**
+     * @throws Exception
+     */
+    public function detail(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $id = $args['id'];
         $id = $args['id'];
 
 
@@ -49,14 +59,14 @@ final class OrderController extends BaseController
         $order->create_time = Tools::toDateTime($order->create_time);
         $order->create_time = Tools::toDateTime($order->create_time);
         $order->update_time = Tools::toDateTime($order->update_time);
         $order->update_time = Tools::toDateTime($order->update_time);
 
 
-        $product_content = \json_decode($order->product_content);
+        $product_content = json_decode($order->product_content);
 
 
         $invoice = Invoice::where('order_id', $id)->first();
         $invoice = Invoice::where('order_id', $id)->first();
         $invoice->status = $invoice->status();
         $invoice->status = $invoice->status();
         $invoice->create_time = Tools::toDateTime($invoice->create_time);
         $invoice->create_time = Tools::toDateTime($invoice->create_time);
         $invoice->update_time = Tools::toDateTime($invoice->update_time);
         $invoice->update_time = Tools::toDateTime($invoice->update_time);
         $invoice->pay_time = Tools::toDateTime($invoice->pay_time);
         $invoice->pay_time = Tools::toDateTime($invoice->pay_time);
-        $invoice_content = \json_decode($invoice->content);
+        $invoice_content = json_decode($invoice->content);
 
 
         return $response->write(
         return $response->write(
             $this->view()
             $this->view()
@@ -68,7 +78,7 @@ final class OrderController extends BaseController
         );
         );
     }
     }
 
 
-    public function cancel(Request $request, Response $response, array $args): ResponseInterface
+    public function cancel(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $order_id = $args['id'];
         $order_id = $args['id'];
         $order = Order::find($order_id);
         $order = Order::find($order_id);
@@ -80,7 +90,7 @@ final class OrderController extends BaseController
             ]);
             ]);
         }
         }
 
 
-        $order->update_time = \time();
+        $order->update_time = time();
         $order->status = 'cancelled';
         $order->status = 'cancelled';
         $order->save();
         $order->save();
 
 
@@ -93,9 +103,9 @@ final class OrderController extends BaseController
             ]);
             ]);
         }
         }
 
 
-        $invoice->update_time = \time();
+        $invoice->update_time = time();
 
 
-        if (\in_array($invoice->status, ['paid_gateway', 'paid_balance', 'paid_admin'])) {
+        if (in_array($invoice->status, ['paid_gateway', 'paid_balance', 'paid_admin'])) {
             $invoice->status = 'cancelled';
             $invoice->status = 'cancelled';
             $invoice->save();
             $invoice->save();
 
 
@@ -114,7 +124,7 @@ final class OrderController extends BaseController
         ]);
         ]);
     }
     }
 
 
-    public function delete(Request $request, Response $response, array $args): ResponseInterface
+    public function delete(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $order_id = $args['id'];
         $order_id = $args['id'];
         Order::find($order_id)->delete();
         Order::find($order_id)->delete();
@@ -126,7 +136,7 @@ final class OrderController extends BaseController
         ]);
         ]);
     }
     }
 
 
-    public function ajax(Request $request, Response $response, array $args): ResponseInterface
+    public function ajax(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $orders = Order::orderBy('id', 'desc')->get();
         $orders = Order::orderBy('id', 'desc')->get();
 
 

+ 249 - 203
src/Controllers/Admin/ProductController.php

@@ -7,9 +7,13 @@ namespace App\Controllers\Admin;
 use App\Controllers\BaseController;
 use App\Controllers\BaseController;
 use App\Models\Product;
 use App\Models\Product;
 use App\Utils\Tools;
 use App\Utils\Tools;
+use Exception;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ResponseInterface;
-use Slim\Http\Request;
 use Slim\Http\Response;
 use Slim\Http\Response;
+use Slim\Http\ServerRequest;
+use function json_decode;
+use function json_encode;
+use function time;
 
 
 final class ProductController extends BaseController
 final class ProductController extends BaseController
 {
 {
@@ -45,7 +49,10 @@ final class ProductController extends BaseController
         'node_group_required',
         'node_group_required',
     ];
     ];
 
 
-    public function index(Request $request, Response $response, array $args): ResponseInterface
+    /**
+     * @throws Exception
+     */
+    public function index(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         return $response->write(
         return $response->write(
             $this->view()
             $this->view()
@@ -54,7 +61,10 @@ final class ProductController extends BaseController
         );
         );
     }
     }
 
 
-    public function create(Request $request, Response $response, array $args): ResponseInterface
+    /**
+     * @throws Exception
+     */
+    public function create(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         return $response->write(
         return $response->write(
             $this->view()
             $this->view()
@@ -63,234 +73,278 @@ final class ProductController extends BaseController
         );
         );
     }
     }
 
 
-    public function add(Request $request, Response $response, array $args): ResponseInterface
+    /**
+     * @throws Exception
+     */
+    public function edit(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
+    {
+        $id = $args['id'];
+        $product = Product::find($id);
+        $content = json_decode($product->content);
+        $limit = json_decode($product->limit);
+
+        return $response->write(
+            $this->view()
+                ->assign('product', $product)
+                ->assign('content', $content)
+                ->assign('limit', $limit)
+                ->assign('update_field', self::$update_field)
+                ->fetch('admin/product/edit.tpl')
+        );
+    }
+
+    public function add(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         // base product
         // base product
-        $type = $request->getParam('type');
-        $name = $request->getParam('name');
-        $price = $request->getParam('price');
-        $status = $request->getParam('status');
-        $stock = $request->getParam('stock');
+        $type = $request->getParam('type') ?? '';
+        $name = $request->getParam('name') ?? '';
+        $price = $request->getParam('price') ?? 0;
+        $status = $request->getParam('status') ?? 1;
+        $stock = $request->getParam('stock') ?? -1;
         // content
         // content
-        $time = $request->getParam('time');
-        $bandwidth = $request->getParam('bandwidth');
-        $class = $request->getParam('class');
-        $class_time = $request->getParam('class_time');
-        $node_group = $request->getParam('node_group');
-        $speed_limit = $request->getParam('speed_limit');
-        $ip_limit = $request->getParam('ip_limit');
+        $time = $request->getParam('time') ?? 0;
+        $bandwidth = $request->getParam('bandwidth') ?? 0;
+        $class = $request->getParam('class') ?? 0;
+        $class_time = $request->getParam('class_time') ?? 0;
+        $node_group = $request->getParam('node_group') ?? 0;
+        $speed_limit = $request->getParam('speed_limit') ?? 0;
+        $ip_limit = $request->getParam('ip_limit') ?? 0;
         // limit
         // limit
         $class_required = $request->getParam('class_required') ?? '';
         $class_required = $request->getParam('class_required') ?? '';
         $node_group_required = $request->getParam('node_group_required') ?? '';
         $node_group_required = $request->getParam('node_group_required') ?? '';
         $new_user_required = $request->getParam('new_user_required') === 'true' ? 1 : 0;
         $new_user_required = $request->getParam('new_user_required') === 'true' ? 1 : 0;
 
 
-        try {
-            $product = new Product();
+        $product = new Product();
+
+        if ($price < 0) {
+            return $response->withJson([
+                'ret' => 0,
+                'msg' => '无效的商品价格',
+            ]);
+        }
 
 
-            if ($name === '' || $name === null) {
-                throw new \Exception('请填写商品名称');
+        if ($type === 'tabp') {
+            if ($time <= 0) {
+                return $response->withJson([
+                    'ret' => 0,
+                    'msg' => '无效的商品时长',
+                ]);
             }
             }
-            if ($price === '' || $price === null) {
-                throw new \Exception('请填写商品售价');
+
+            if ($class_time <= 0) {
+                return $response->withJson([
+                    'ret' => 0,
+                    'msg' => '无效的等级时长',
+                ]);
             }
             }
-            if ($stock === '' || $stock === null) {
-                throw new \Exception('请填写商品库存');
+
+            if ($bandwidth <= 0) {
+                return $response->withJson([
+                    'ret' => 0,
+                    'msg' => '无效的套餐流量',
+                ]);
             }
             }
 
 
-            if ($type === 'tabp') {
-                if ($time === '' || $time === null) {
-                    throw new \Exception('请填写套餐时长');
-                }
-                if ($bandwidth === '' || $bandwidth === null) {
-                    throw new \Exception('请填写套餐流量');
-                }
-
-                ($class === '') && $class = '0';
-                ($class_time === '') && $class_time = $time;
-                ($speed_limit === '') && $speed_limit = '0';
-                ($ip_limit === '') && $ip_limit = '0';
-
-                $content = [
-                    'time' => $time,
-                    'bandwidth' => $bandwidth,
-                    'class' => $class,
-                    'class_time' => $class_time,
-                    'node_group' => $node_group,
-                    'speed_limit' => $speed_limit,
-                    'ip_limit' => $ip_limit,
-                ];
-            } elseif ($type === 'time') {
-                if ($time === '' || $time === null) {
-                    throw new \Exception('请填写套餐时长');
-                }
-
-                $content = [
-                    'time' => $time,
-                ];
-            } elseif ($type === 'bandwidth') {
-                if ($bandwidth === '' || $bandwidth === null) {
-                    throw new \Exception('请填写套餐流量');
-                }
-
-                $content = [
-                    'bandwidth' => $bandwidth,
-                ];
-            } else {
-                throw new \Exception('商品类型错误');
+            $content = [
+                'time' => $time,
+                'bandwidth' => $bandwidth,
+                'class' => $class,
+                'class_time' => $class_time,
+                'node_group' => $node_group,
+                'speed_limit' => $speed_limit,
+                'ip_limit' => $ip_limit,
+            ];
+        } elseif ($type === 'time') {
+            if ($time <= 0) {
+                return $response->withJson([
+                    'ret' => 0,
+                    'msg' => '无效的商品时长',
+                ]);
             }
             }
 
 
-            $limit = [
-                'class_required' => $class_required,
-                'node_group_required' => $node_group_required,
-                'new_user_required' => $new_user_required,
+            if ($class_time === '' || $class_time <= 0) {
+                return $response->withJson([
+                    'ret' => 0,
+                    'msg' => '无效的等级时长',
+                ]);
+            }
+
+            $content = [
+                'time' => $time,
+                'class' => $class,
+                'class_time' => $class_time,
+                'node_group' => $node_group,
+                'speed_limit' => $speed_limit,
+                'ip_limit' => $ip_limit,
             ];
             ];
+        } elseif ($type === 'bandwidth') {
+            if ($bandwidth <= 0) {
+                return $response->withJson([
+                    'ret' => 0,
+                    'msg' => '无效的套餐流量',
+                ]);
+            }
 
 
-            $product->type = $type;
-            $product->name = $name;
-            $product->price = $price;
-            $product->content = \json_encode($content);
-            $product->limit = \json_encode($limit);
-            $product->status = $status;
-            $product->create_time = \time();
-            $product->update_time = \time();
-            $product->sale_count = 0;
-            $product->stock = $stock;
-            $product->save();
-        } catch (\Exception $e) {
+            $content = [
+                'bandwidth' => $bandwidth,
+            ];
+        } else {
             return $response->withJson([
             return $response->withJson([
                 'ret' => 0,
                 'ret' => 0,
-                'msg' => $e->getMessage(),
+                'msg' => '商品类型错误',
             ]);
             ]);
         }
         }
 
 
+        $limit = [
+            'class_required' => $class_required,
+            'node_group_required' => $node_group_required,
+            'new_user_required' => $new_user_required,
+        ];
+
+        $product->type = $type;
+        $product->name = $name;
+        $product->price = $price;
+        $product->content = json_encode($content);
+        $product->limit = json_encode($limit);
+        $product->status = $status;
+        $product->create_time = time();
+        $product->update_time = time();
+        $product->sale_count = 0;
+        $product->stock = $stock;
+        $product->save();
+
         return $response->withJson([
         return $response->withJson([
             'ret' => 1,
             'ret' => 1,
             'msg' => '添加成功',
             'msg' => '添加成功',
         ]);
         ]);
     }
     }
 
 
-    public function edit(Request $request, Response $response, array $args): ResponseInterface
-    {
-        $id = $args['id'];
-        $product = Product::find($id);
-        $content = \json_decode($product->content, true);
-        $limit = \json_decode($product->limit, true);
-        return $response->write(
-            $this->view()
-                ->assign('product', $product)
-                ->assign('content', $content)
-                ->assign('limit', $limit)
-                ->assign('update_field', self::$update_field)
-                ->fetch('admin/product/edit.tpl')
-        );
-    }
-
-    public function update(Request $request, Response $response, array $args): ResponseInterface
+    public function update(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $product_id = $args['id'];
         $product_id = $args['id'];
         // base product
         // base product
-        $type = $request->getParam('type');
-        $name = $request->getParam('name');
-        $price = $request->getParam('price');
-        $status = $request->getParam('status');
-        $stock = $request->getParam('stock');
+        $type = $request->getParam('type') ?? '';
+        $name = $request->getParam('name') ?? '';
+        $price = $request->getParam('price') ?? 0;
+        $status = $request->getParam('status') ?? 1;
+        $stock = $request->getParam('stock') ?? -1;
         // content
         // content
-        $time = $request->getParam('time');
-        $bandwidth = $request->getParam('bandwidth');
-        $class = $request->getParam('class');
-        $class_time = $request->getParam('class_time');
-        $node_group = $request->getParam('node_group');
-        $speed_limit = $request->getParam('speed_limit');
-        $ip_limit = $request->getParam('ip_limit');
+        $time = $request->getParam('time') ?? 0;
+        $bandwidth = $request->getParam('bandwidth') ?? 0;
+        $class = $request->getParam('class') ?? 0;
+        $class_time = $request->getParam('class_time') ?? 0;
+        $node_group = $request->getParam('node_group') ?? 0;
+        $speed_limit = $request->getParam('speed_limit') ?? 0;
+        $ip_limit = $request->getParam('ip_limit') ?? 0;
         // limit
         // limit
         $class_required = $request->getParam('class_required') ?? '';
         $class_required = $request->getParam('class_required') ?? '';
         $node_group_required = $request->getParam('node_group_required') ?? '';
         $node_group_required = $request->getParam('node_group_required') ?? '';
         $new_user_required = $request->getParam('new_user_required') === 'true' ? 1 : 0;
         $new_user_required = $request->getParam('new_user_required') === 'true' ? 1 : 0;
 
 
-        try {
-            $product = Product::find($product_id);
+        $product = Product::find($product_id);
+
+        if ($price < 0) {
+            return $response->withJson([
+                'ret' => 0,
+                'msg' => '无效的商品价格',
+            ]);
+        }
+
+        if ($type === 'tabp') {
+            if ($time <= 0) {
+                return $response->withJson([
+                    'ret' => 0,
+                    'msg' => '无效的商品时长',
+                ]);
+            }
 
 
-            if ($name === '') {
-                throw new \Exception('请填写商品名称');
+            if ($class_time <= 0) {
+                return $response->withJson([
+                    'ret' => 0,
+                    'msg' => '无效的等级时长',
+                ]);
             }
             }
-            if ($price === '') {
-                throw new \Exception('请填写商品售价');
+
+            if ($bandwidth <= 0) {
+                return $response->withJson([
+                    'ret' => 0,
+                    'msg' => '无效的套餐流量',
+                ]);
             }
             }
-            if ($stock === '') {
-                throw new \Exception('请填写商品库存');
+
+            $content = [
+                'time' => $time,
+                'bandwidth' => $bandwidth,
+                'class' => $class,
+                'class_time' => $class_time,
+                'node_group' => $node_group,
+                'speed_limit' => $speed_limit,
+                'ip_limit' => $ip_limit,
+            ];
+        } elseif ($type === 'time') {
+            if ($time <= 0) {
+                return $response->withJson([
+                    'ret' => 0,
+                    'msg' => '无效的商品时长',
+                ]);
             }
             }
 
 
-            if ($type === 'tabp') {
-                if ($time === '') {
-                    throw new \Exception('请填写套餐时长');
-                }
-                if ($bandwidth === '') {
-                    throw new \Exception('请填写套餐流量');
-                }
-
-                ($class === '') && $class = '0';
-                ($class_time === '') && $class_time = $time;
-                ($speed_limit === '') && $speed_limit = '0';
-                ($ip_limit === '') && $ip_limit = '0';
-
-                $content = [
-                    'time' => $time,
-                    'bandwidth' => $bandwidth,
-                    'class' => $class,
-                    'class_time' => $class_time,
-                    'node_group' => $node_group,
-                    'speed_limit' => $speed_limit,
-                    'ip_limit' => $ip_limit,
-                ];
-            } elseif ($type === 'time') {
-                if ($time === '') {
-                    throw new \Exception('请填写套餐时长');
-                }
-
-                $content = [
-                    'time' => $time,
-                ];
-            } elseif ($type === 'bandwidth') {
-                if ($bandwidth === '') {
-                    throw new \Exception('请填写套餐流量');
-                }
-
-                $content = [
-                    'bandwidth' => $bandwidth,
-                ];
-            } else {
-                throw new \Exception('商品类型错误');
+            if ($class_time <= 0) {
+                return $response->withJson([
+                    'ret' => 0,
+                    'msg' => '无效的等级时长',
+                ]);
             }
             }
 
 
-            $limit = [
-                'class_required' => $class_required,
-                'node_group_required' => $node_group_required,
-                'new_user_required' => $new_user_required,
+            $content = [
+                'time' => $time,
+                'class' => $class,
+                'class_time' => $class_time,
+                'node_group' => $node_group,
+                'speed_limit' => $speed_limit,
+                'ip_limit' => $ip_limit,
             ];
             ];
+        } elseif ($type === 'bandwidth') {
+            if ($bandwidth <= 0) {
+                return $response->withJson([
+                    'ret' => 0,
+                    'msg' => '无效的套餐流量',
+                ]);
+            }
 
 
-            $product->type = $type;
-            $product->name = $name;
-            $product->price = $price;
-            $product->content = \json_encode($content);
-            $product->limit = \json_encode($limit);
-            $product->stock = $stock;
-            $product->status = $status;
-            $product->update_time = \time();
-            $product->save();
-        } catch (\Exception $e) {
+            $content = [
+                'bandwidth' => $bandwidth,
+            ];
+        } else {
             return $response->withJson([
             return $response->withJson([
                 'ret' => 0,
                 'ret' => 0,
-                'msg' => $e->getMessage(),
+                'msg' => '商品类型错误',
             ]);
             ]);
         }
         }
 
 
+        $limit = [
+            'class_required' => $class_required,
+            'node_group_required' => $node_group_required,
+            'new_user_required' => $new_user_required,
+        ];
+
+        $product->type = $type;
+        $product->name = $name;
+        $product->price = $price;
+        $product->content = json_encode($content);
+        $product->limit = json_encode($limit);
+        $product->stock = $stock;
+        $product->status = $status;
+        $product->update_time = time();
+        $product->save();
+
         return $response->withJson([
         return $response->withJson([
             'ret' => 1,
             'ret' => 1,
             'msg' => '更新成功',
             'msg' => '更新成功',
         ]);
         ]);
     }
     }
 
 
-    public function delete(Request $request, Response $response, array $args): ResponseInterface
+    public function delete(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $product_id = $args['id'];
         $product_id = $args['id'];
         Product::find($product_id)->delete();
         Product::find($product_id)->delete();
@@ -301,28 +355,20 @@ final class ProductController extends BaseController
         ]);
         ]);
     }
     }
 
 
-    public function copy(Request $request, Response $response, array $args): ResponseInterface
+    public function copy(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
-        try {
-            $old_product_id = $args['id'];
-            $old_product = Product::find($old_product_id);
-            $new_product = new Product();
-            // https://laravel.com/docs/9.x/eloquent#replicating-models
-            $new_product = $old_product->replicate([
-                'create_time',
-                'update_time',
-            ]);
-            $new_product->name .= ' (副本)';
-            $new_product->create_time = \time();
-            $new_product->update_time = \time();
-            $new_product->sale_count = 0;
-            $new_product->save();
-        } catch (\Exception $e) {
-            return $response->withJson([
-                'ret' => 0,
-                'msg' => $e->getMessage(),
-            ]);
-        }
+        $old_product_id = $args['id'];
+        $old_product = Product::find($old_product_id);
+
+        $new_product = $old_product->replicate([
+            'create_time',
+            'update_time',
+        ]);
+        $new_product->name .= ' (副本)';
+        $new_product->create_time = time();
+        $new_product->update_time = time();
+        $new_product->sale_count = 0;
+        $new_product->save();
 
 
         return $response->withJson([
         return $response->withJson([
             'ret' => 1,
             'ret' => 1,
@@ -330,21 +376,21 @@ final class ProductController extends BaseController
         ]);
         ]);
     }
     }
 
 
-    public function ajax(Request $request, Response $response, array $args): ResponseInterface
+    public function ajax(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
     {
         $products = Product::orderBy('id', 'desc')->get();
         $products = Product::orderBy('id', 'desc')->get();
 
 
         foreach ($products as $product) {
         foreach ($products as $product) {
-            $product->op = '<button type="button" class="btn btn-red" id="delete-product-' . $product->id . '" 
-            onclick="deleteProduct(' . $product->id . ')">删除</button>
-            <button type="button" class="btn btn-orange" id="copy-product-' . $product->id . '" 
-            onclick="copyProduct(' . $product->id . ')">复制</button>
+            $product->op = '<button type="button" class="btn btn-red" id="delete-product-' . $product->id . '"
+             onclick="deleteProduct(' . $product->id . ')">删除</button>
+            <button type="button" class="btn btn-orange" id="copy-product-' . $product->id . '"
+             onclick="copyProduct(' . $product->id . ')">复制</button>
             <a class="btn btn-blue" href="/admin/product/' . $product->id . '/edit">编辑</a>';
             <a class="btn btn-blue" href="/admin/product/' . $product->id . '/edit">编辑</a>';
-            $product->type = Tools::getProductType($product);
-            $product->status = Tools::getProductStatus($product);
+            $product->type = $product->type();
+            $product->status = $product->status();
             $product->create_time = Tools::toDateTime($product->create_time);
             $product->create_time = Tools::toDateTime($product->create_time);
             $product->update_time = Tools::toDateTime($product->update_time);
             $product->update_time = Tools::toDateTime($product->update_time);
-            $product->stock = Tools::getProductStock($product);
+            $product->stock = $product->stock();
         }
         }
 
 
         return $response->withJson([
         return $response->withJson([

+ 1 - 1
src/Controllers/Admin/TrafficLogController.php

@@ -35,7 +35,7 @@ final class TrafficLogController extends BaseController
         return $response->write(
         return $response->write(
             $this->view()
             $this->view()
                 ->assign('details', self::$details)
                 ->assign('details', self::$details)
-                ->fetch('admin/trafficlog.tpl')
+                ->fetch('admin/log/traffic.tpl')
         );
         );
     }
     }
 
 

+ 4 - 4
src/Controllers/WebAPI/UserController.php

@@ -32,7 +32,7 @@ final class UserController extends BaseController
      *
      *
      * @return ResponseInterface
      * @return ResponseInterface
      */
      */
-    public function index(Request $request, Response $response, array $args): ResponseInterface
+    public function index(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
     {
         $node_id = $request->getQueryParam('node_id');
         $node_id = $request->getQueryParam('node_id');
         $node = Node::find($node_id);
         $node = Node::find($node_id);
@@ -129,7 +129,7 @@ final class UserController extends BaseController
      *
      *
      * @return ResponseInterface
      * @return ResponseInterface
      */
      */
-    public function addTraffic(Request $request, Response $response, array $args): ResponseInterface
+    public function addTraffic(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
     {
         $data = json_decode($request->getBody()->__toString());
         $data = json_decode($request->getBody()->__toString());
 
 
@@ -189,7 +189,7 @@ final class UserController extends BaseController
      *
      *
      * @return ResponseInterface
      * @return ResponseInterface
      */
      */
-    public function addAliveIp(Request $request, Response $response, array $args): ResponseInterface
+    public function addAliveIp(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
     {
         $data = json_decode($request->getBody()->__toString());
         $data = json_decode($request->getBody()->__toString());
 
 
@@ -244,7 +244,7 @@ final class UserController extends BaseController
      *
      *
      * @return ResponseInterface
      * @return ResponseInterface
      */
      */
-    public function addDetectLog(Request $request, Response $response, array $args): ResponseInterface
+    public function addDetectLog(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
     {
         $data = json_decode($request->getBody()->__toString());
         $data = json_decode($request->getBody()->__toString());
         if (! $data || ! is_array($data->data)) {
         if (! $data || ! is_array($data->data)) {

+ 2 - 2
src/Middleware/AdminApiToken.php

@@ -5,15 +5,15 @@ declare(strict_types=1);
 namespace App\Middleware;
 namespace App\Middleware;
 
 
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ResponseInterface;
-use Slim\Http\Request;
 use Slim\Http\Response;
 use Slim\Http\Response;
+use Slim\Http\ServerRequest;
 
 
 final class AdminApiToken
 final class AdminApiToken
 {
 {
     /**
     /**
      * MID /admin/api/
      * MID /admin/api/
      *
      *
-     * @param Request $request
+     * @param ServerRequest $request
      * @param Response $response
      * @param Response $response
      * @param callable $next
      * @param callable $next
      *
      *

+ 2 - 2
src/Middleware/UserApiToken.php

@@ -5,15 +5,15 @@ declare(strict_types=1);
 namespace App\Middleware;
 namespace App\Middleware;
 
 
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ResponseInterface;
-use Slim\Http\Request;
 use Slim\Http\Response;
 use Slim\Http\Response;
+use Slim\Http\ServerRequest;
 
 
 final class UserApiToken
 final class UserApiToken
 {
 {
     /**
     /**
      * MID /user/api
      * MID /user/api
      *
      *
-     * @param Request $request
+     * @param ServerRequest $request
      * @param Response $response
      * @param Response $response
      * @param callable $next
      * @param callable $next
      *
      *

+ 18 - 39
src/Services/Gateway/AbstractPayment.php

@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 
 namespace App\Services\Gateway;
 namespace App\Services\Gateway;
 
 
-use App\Models\Code;
 use App\Models\Invoice;
 use App\Models\Invoice;
 use App\Models\Payback;
 use App\Models\Payback;
 use App\Models\Paylist;
 use App\Models\Paylist;
@@ -14,18 +13,17 @@ use Psr\Http\Message\ResponseInterface;
 use Ramsey\Uuid\Uuid;
 use Ramsey\Uuid\Uuid;
 use Slim\Http\Response;
 use Slim\Http\Response;
 use Slim\Http\ServerRequest;
 use Slim\Http\ServerRequest;
+use function get_called_class;
+use function in_array;
+use function json_decode;
+use function json_encode;
+use function time;
 
 
 abstract class AbstractPayment
 abstract class AbstractPayment
 {
 {
-    /**
-     * @param array     $args
-     */
-    abstract public function purchase(Request $request, Response $response, array $args): ResponseInterface;
+    abstract public function purchase(ServerRequest $request, Response $response, array $args): ResponseInterface;
 
 
-    /**
-     * @param array     $args
-     */
-    abstract public function notify(Request $request, Response $response, array $args): ResponseInterface;
+    abstract public function notify(ServerRequest $request, Response $response, array $args): ResponseInterface;
 
 
     /**
     /**
      * 支付网关的 codeName, 规则为 [0-9a-zA-Z_]*
      * 支付网关的 codeName, 规则为 [0-9a-zA-Z_]*
@@ -42,18 +40,12 @@ abstract class AbstractPayment
      */
      */
     abstract public static function _readableName(): string;
     abstract public static function _readableName(): string;
 
 
-    /**
-     * @param array     $args
-     */
-    public function getReturnHTML(Request $request, Response $response, array $args): ResponseInterface
+    public function getReturnHTML(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
     {
         return $response->write('ok');
         return $response->write('ok');
     }
     }
 
 
-    /**
-     * @param array     $args
-     */
-    public function getStatus(Request $request, Response $response, array $args): ResponseInterface
+    public function getStatus(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
     {
         $p = Paylist::where('tradeno', $_POST['pid'])->first();
         $p = Paylist::where('tradeno', $_POST['pid'])->first();
         return $response->withJson([
         return $response->withJson([
@@ -69,33 +61,20 @@ abstract class AbstractPayment
         $paylist = Paylist::where('tradeno', $tradeno)->first();
         $paylist = Paylist::where('tradeno', $tradeno)->first();
 
 
         if ($paylist->status === 1) {
         if ($paylist->status === 1) {
-            return \json_encode(['errcode' => 0]);
+            return json_encode(['errcode' => 0]);
         }
         }
 
 
-        $paylist->datetime = \time();
+        $paylist->datetime = time();
         $paylist->status = 1;
         $paylist->status = 1;
         $paylist->save();
         $paylist->save();
 
 
         $user = User::find($paylist->userid);
         $user = User::find($paylist->userid);
 
 
-        if ($paylist->invoice_id !== 0) {
-            $invoice = Invoice::where('id', $paylist->invoice_id)->first();
-            $invoice->status = 'paid_gateway';
-            $invoice->update_time = \time();
-            $invoice->pay_time = \time();
-            $invoice->save();
-        } else {
-            $user->money += $paylist->total;
-            $user->save();
-            $codeq = new Code();
-            $codeq->code = $method;
-            $codeq->isused = 1;
-            $codeq->type = -1;
-            $codeq->number = $paylist->total;
-            $codeq->usedatetime = date('Y-m-d H:i:s');
-            $codeq->userid = $user->id;
-            $codeq->save();
-        }
+        $invoice = Invoice::where('id', $paylist->invoice_id)->first();
+        $invoice->status = 'paid_gateway';
+        $invoice->update_time = time();
+        $invoice->pay_time = time();
+        $invoice->save();
 
 
         // 返利
         // 返利
         if ($user->ref_by > 0 && Setting::obtain('invitation_mode') === 'after_paid') {
         if ($user->ref_by > 0 && Setting::obtain('invitation_mode') === 'after_paid') {
@@ -136,8 +115,8 @@ abstract class AbstractPayment
     protected static function getActiveGateway($key): bool
     protected static function getActiveGateway($key): bool
     {
     {
         $payment_gateways = Setting::where('item', '=', 'payment_gateway')->first();
         $payment_gateways = Setting::where('item', '=', 'payment_gateway')->first();
-        $active_gateways = \json_decode($payment_gateways->value);
-        if (\in_array($key, $active_gateways)) {
+        $active_gateways = json_decode($payment_gateways->value);
+        if (in_array($key, $active_gateways)) {
             return true;
             return true;
         }
         }
         return false;
         return false;

+ 1 - 1
src/Services/Gateway/AopF2F.php

@@ -34,7 +34,7 @@ final class AopF2F extends AbstractPayment
         return 'Alipay F2F';
         return 'Alipay F2F';
     }
     }
 
 
-    public function purchase(Request $request, Response $response, array $args): ResponseInterface
+    public function purchase(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
     {
         $antiXss = new AntiXSS();
         $antiXss = new AntiXSS();
 
 

+ 1 - 1
src/Services/Gateway/Epay.php

@@ -51,7 +51,7 @@ final class Epay extends AbstractPayment
         return 'EPay';
         return 'EPay';
     }
     }
 
 
-    public function purchase(Request $request, Response $response, array $args): ResponseInterface
+    public function purchase(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
     {
         $antiXss = new AntiXSS();
         $antiXss = new AntiXSS();
 
 

+ 1 - 1
src/Services/Gateway/StripeCard.php

@@ -34,7 +34,7 @@ final class StripeCard extends AbstractPayment
         return 'Stripe';
         return 'Stripe';
     }
     }
 
 
-    public function purchase(Request $request, Response $response, array $args): ResponseInterface
+    public function purchase(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
     {
         $trade_no = uniqid();
         $trade_no = uniqid();
         $user = Auth::getUser();
         $user = Auth::getUser();