Selaa lähdekoodia

feat: add invoice_id & adapt epay for new shop

M1Screw 2 vuotta sitten
vanhempi
sitoutus
dfbd0fe88a

+ 1 - 0
db/migrations/2023020100-init.php

@@ -244,6 +244,7 @@ return new class() implements MigrationInterface {
                 `userid` bigint(20) unsigned DEFAULT NULL,
                 `total` decimal(12,2) DEFAULT NULL,
                 `status` int(11) DEFAULT 0,
+                `invoice_id` int(11) DEFAULT 0,
                 `tradeno` varchar(255) DEFAULT NULL,
                 `datetime` bigint(20) DEFAULT 0,
                 PRIMARY KEY (`id`),

+ 22 - 0
db/migrations/2023030500-add_paylist_invoice_id.php

@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec('ALTER TABLE paylist ADD COLUMN IF NOT EXISTS `invoice_id` int(11) DEFAULT 0;');
+
+        return 2023030500;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec('ALTER TABLE paylist DROP COLUMN IF EXISTS `invoice_id`;');
+
+        return 2023021600;
+    }
+};

+ 6 - 1
resources/views/tabler/gateway/epay.tpl

@@ -1,12 +1,17 @@
 <div class="card-inner">
     <h4>
-        epay在线充值
+        EPay 在线充值
     <h4>
     <p class="card-heading"></p>
     <form class="epay" name="epay" action="/user/payment/purchase/epay" method="post">
+        {if $user->use_new_shop}
+        <input hidden id="price" name="price" value="{$invoice->price}">
+        <input hidden id="invoice_id" name="invoice_id" value="{$invoice->id}">
+        {else}
         <input class="form-control maxwidth-edit" id="price" name="price" placeholder="输入金额,选择以下要付款的渠道"
             autofocus="autofocus" type="number" min="0.01" max="1000" step="0.01" required="required">
         <br />
+        {/if}
         {if $public_setting['epay_alipay'] == true}
         <button class="btn btn-flat waves-attach" id="btnSubmit" type="submit" name="type" value="alipay">
             <img src="/images/alipay.png" height="50px" />

+ 9 - 2
resources/views/tabler/user/invoice/view.tpl

@@ -22,7 +22,11 @@
     <div class="page-body">
         <div class="container-xl">
             <div class="row row-cards">
+                {if $invoice->status !== 'unpaid' && $invoice->status !== 'cancelled'}
                 <div class="col-sm-12 col-md-6 col-lg-9">
+                {else}
+                <div class="col-sm-12 col-md-12 col-lg-12">
+                {/if}
                     <div class="card">
                         <div class="card-header">
                             <h3 class="card-title">基本信息</h3>
@@ -82,6 +86,7 @@
                         </div>
                     </div>
                 </div>
+                {if $invoice->status !== 'unpaid' && $invoice->status !== 'cancelled'}
                 <div class="col-sm-12 col-md-6 col-lg-3">
                     <div class="card">
                         <div class="card-header">
@@ -94,7 +99,7 @@
                         </div>
                         <div class="card-footer">
                           <div class="d-flex">
-                          <button id="pay-balance" class="btn" type="button">支付</button>
+                          <button id="pay-balance" class="btn btn-blue" type="button">支付</button>
                           </div>
                         </div>
                     </div>
@@ -106,13 +111,15 @@
                             {if count($payments) > 0}
                                 {foreach from=$payments item=payment}
                                 <div class="mb-3">
-                                    {$payment::getPurchaseHTML()}
+                                    {$payment_name = $payment::_name()}
+                                    {include file="../../gateway/$payment_name.tpl"}
                                 </div>
                                 {/foreach}
                             {/if}
                         </div>
                     </div>
                 </div>
+                {/if}
             </div>
         </div>
     </div>

+ 4 - 2
src/Controllers/User/OrderController.php

@@ -101,7 +101,7 @@ final class OrderController extends BaseController
         $coupon_raw = $antiXss->xss_clean($request->getParam('coupon'));
         $product_id = $antiXss->xss_clean($request->getParam('product_id'));
 
-        $product = Product::find($product_id);        
+        $product = Product::find($product_id);
 
         if ($product === null) {
             return $response->withJson([
@@ -222,6 +222,8 @@ final class OrderController extends BaseController
         $order->update_time = time();
         $order->save();
 
+        $invoice_content = [];
+
         $invoice_content[] = [
             'content_id' => 0,
             'name' => $product->price,
@@ -238,7 +240,7 @@ final class OrderController extends BaseController
 
         $invoice = new Invoice();
         $invoice->user_id = $user->id;
-        $invoice->order_id = $order->id; 
+        $invoice->order_id = $order->id;
         $invoice->content = \json_encode($invoice_content);
         $invoice->price = $buy_price;
         $invoice->status = 'unpaid';

+ 28 - 16
src/Services/Gateway/AbstractPayment.php

@@ -5,6 +5,7 @@ declare(strict_types=1);
 namespace App\Services\Gateway;
 
 use App\Models\Code;
+use App\Models\Invoice;
 use App\Models\Payback;
 use App\Models\Paylist;
 use App\Models\Setting;
@@ -65,29 +66,40 @@ abstract class AbstractPayment
 
     public function postPayment($pid, $method)
     {
-        $p = Paylist::where('tradeno', $pid)->first();
+        $paylist = Paylist::where('tradeno', $pid)->first();
 
-        if ($p->status === 1) {
+        if ($paylist->status === 1) {
             return \json_encode(['errcode' => 0]);
         }
 
-        $p->status = 1;
-        $p->save();
-        $user = User::find($p->userid);
-        $user->money += $p->total;
-        $user->save();
-        $codeq = new Code();
-        $codeq->code = $method;
-        $codeq->isused = 1;
-        $codeq->type = -1;
-        $codeq->number = $p->total;
-        $codeq->usedatetime = date('Y-m-d H:i:s');
-        $codeq->userid = $user->id;
-        $codeq->save();
+        $paylist->datetime = \time();
+        $paylist->status = 1;
+        $paylist->save();
+
+        $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();
+        }
 
         // 返利
         if ($user->ref_by > 0 && Setting::obtain('invitation_mode') === 'after_recharge') {
-            Payback::rebate($user->id, $p->total);
+            Payback::rebate($user->id, $paylist->total);
         }
 
         return 0;

+ 38 - 10
src/Services/Gateway/Epay.php

@@ -46,25 +46,34 @@ final class Epay extends AbstractPayment
 
     public static function _readableName(): string
     {
-        return 'epay在线充值';
+        return 'EPay 在线充值';
     }
 
     public function purchase(Request $request, Response $response, array $args): ResponseInterface
     {
         $type = $request->getParam('type');
         $price = $request->getParam('price');
+        $invoice_id = $request->getParam('invoice_id') ?? 0;
+
         if ($price <= 0) {
             return $response->withJson(['errcode' => -1, 'errmsg' => '非法的金额.']);
         }
+
         $user = Auth::getUser();
+
         $pl = new Paylist();
 
+        if ($user->use_new_shop) {
+            $pl->invoice_id = $invoice_id;
+        } else {
+            $pl->invoice_id = 0;
+        }
+
         $pl->userid = $user->id;
         $pl->total = $price;
         //订单号
         $pl->tradeno = self::generateGuid();
         $pl->save();
-
         //请求参数
         $data = [
             'pid' => trim($this->epay['partner']),
@@ -77,8 +86,10 @@ final class Epay extends AbstractPayment
             'money' => $price,
             'sitename' => $_ENV['appName'],
         ];
+
         $alipaySubmit = new EpaySubmit($this->epay);
         $html_text = $alipaySubmit->buildRequestForm($data);
+
         return $response->write($html_text);
     }
 
@@ -86,6 +97,7 @@ final class Epay extends AbstractPayment
     {
         $alipayNotify = new EpayNotify($this->epay);
         $verify_result = $alipayNotify->verifyNotify();
+
         if ($verify_result) {
             $out_trade_no = $_GET['out_trade_no'];
             $type = $_GET['type'];
@@ -110,6 +122,7 @@ final class Epay extends AbstractPayment
             }
             return $response->withJson(['state' => 'fail', 'msg' => '支付失败']);
         }
+
         return $response->write('非法请求');
     }
     public static function getPurchaseHTML(): string
@@ -119,15 +132,30 @@ final class Epay extends AbstractPayment
 
     public function getReturnHTML($request, $response, $args): ResponseInterface
     {
+        $user = Auth::getUser();
+
         $money = $_GET['money'];
-        $html = <<<HTML
-        您已成功充值 ${money} 元,正在跳转..
-        <script>
-            setTimeout(function() {
-                location.href="/user/code";
-            },500)
-        </script>
-        HTML;
+
+        if ($user->use_new_shop) {
+            $html = <<<HTML
+            您已成功充值 ${money} 元,正在跳转..
+            <script>
+                setTimeout(function() {
+                    location.href="/user/invoice";
+                },500)
+            </script>
+            HTML;
+        } else {
+            $html = <<<HTML
+            您已成功充值 ${money} 元,正在跳转..
+            <script>
+                setTimeout(function() {
+                    location.href="/user/code";
+                },500)
+            </script>
+            HTML;
+        }
+
         return $response->write($html);
     }
 }