Ver código fonte

Merge branch 'dev'

lip 11 horas atrás
pai
commit
9ebbae1df0

+ 88 - 1
app/Http/Controllers/admin/PaymentOrder.php

@@ -9,16 +9,101 @@ use App\Services\PaymentOrderService;
 use Exception;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Validation\ValidationException;
+use App\Models\PaymentOrder as PaymentOrderModel;
+use App\Models\Wallet;
+use App\Services\BalanceLogService;
 
 class PaymentOrder extends Controller
 {
 
+    //人工充值,配置充值信息
+    public function setPayData()
+    {
+        DB::beginTransaction();
+        try {
+            $params = request()->validate([
+                'ids' => ['required', 'array', 'min:1'],
+                'ids.*' => ['required', 'integer', 'min:1'],
+                'payment_type' => ['required', 'integer'],
+                'pay_data' => ['required', 'string'],
+            ]);
+
+            $count = PaymentOrderModel::whereIn('id', $params['ids'])->where('payment_type', $params['payment_type'])->where('status', 0)->count();
+            if ($count != count($params['ids'])) throw new Exception('数据匹配异常,请刷新页面重试!', HttpStatus::CUSTOM_ERROR);
+            
+            PaymentOrderModel::whereIn('id', $params['ids'])
+                ->where('payment_type', $params['payment_type'])
+                ->where('status', 0)
+                ->update(['pay_data' => $params['pay_data'], 'status' => 1]);
+
+            DB::commit();
+        } catch (ValidationException $e) {
+            DB::rollBack();
+            return $this->error(HttpStatus::CUSTOM_ERROR, $e->validator->errors()->first());
+        } catch (Exception $e) {
+            DB::rollBack();
+            return $this->error(HttpStatus::CUSTOM_ERROR, $e->getMessage());
+        }
+        return $this->success();
+    }
+
+    //人工充值审核
+    public function manual‌Audit()
+    {
+        DB::beginTransaction();
+        try {
+            $params = request()->validate([
+                'id' => ['required', 'integer'],
+                'status' => ['required', 'integer', 'in:2,3'],
+                'remark' => ['nullable', 'string'],
+            ]);
+            $remark = $params['remark'] ?? '';
+            $info = PaymentOrderModel::find($params['id']);
+            if (!$info) throw new Exception('数据不存在', HttpStatus::CUSTOM_ERROR);
+            if ($info->status != 4) throw new Exception('用户未提交充值凭证', HttpStatus::CUSTOM_ERROR);
+            if ($info->payment_type == 0) throw new Exception('当前订单非人工充值,无法操作', HttpStatus::CUSTOM_ERROR);
+            if ($params['status'] == 3) {
+                if (empty($remark)) {
+                    throw new Exception('请填写原因', HttpStatus::CUSTOM_ERROR);
+                }
+                $info->status = $params['status'];
+                $info->remark = $remark;
+                $info->save();
+            } else {
+                //充值成功
+                $info->status = $params['status'];
+                $info->remark = $remark;
+                $info->state = 1;
+                $info->is_send = 0;//标记发送通知
+                $info->save();
+
+                $memberId = $info->member_id;
+                $amount = $info->amount;
+                $changeType = '人工充值';
+                $wallet = Wallet::where('member_id', $memberId)->first();
+                if (!$wallet) throw new Exception('用户不存在', HttpStatus::CUSTOM_ERROR);
+                $availableBalance = bcadd($wallet->available_balance, $amount, 10);
+                BalanceLogService::addLog($memberId, $amount, $wallet->available_balance, $availableBalance, $changeType, null, $remark);
+                $wallet->available_balance = $availableBalance;
+                $wallet->save();
+
+            }
+            DB::commit();
+        } catch (ValidationException $e) {
+            DB::rollBack();
+            return $this->error(HttpStatus::CUSTOM_ERROR, $e->validator->errors()->first());
+        } catch (Exception $e) {
+            DB::rollBack();
+            return $this->error(HttpStatus::CUSTOM_ERROR, $e->getMessage());
+        }
+        return $this->success();
+    }
+
     public function audit()
     {
         DB::beginTransaction();
         try {
             $validate = [
-//                'id' => ['required', 'integer', 'min:1'],
                 'ids' => ['required', 'array', 'min:1', 'max:20'],
                 'ids.*' => ['required', 'integer', 'min:1'],
                 'status' => ['required', 'integer', 'in:1,3'],
@@ -73,6 +158,8 @@ class PaymentOrder extends Controller
                 'status' => ['nullable', 'integer', 'in:0,1,2,3'],
                 'member_id' => ['nullable', 'integer'],
                 'first_name' => ['nullable'],
+                'payment_type' => ['nullable', 'integer'],
+                'channel' => ['nullable', 'string'],
             ]);
 
             $params['type'] = 1;

+ 65 - 2
app/Http/Controllers/api/Wallet.php

@@ -12,6 +12,7 @@ use App\Models\User;
 use App\Models\Bank;
 use App\Models\Address;
 use App\Models\RechargeChannel;
+use App\Models\PaymentOrder;
 use App\Services\BalanceLogService;
 use App\Services\PaymentOrderService;
 use App\Services\QianBaoWithdrawService;
@@ -46,7 +47,7 @@ class Wallet extends BaseController
     }
 
     /**
-     * 创建代收订单
+     * 创建代收订单(自动扫码充值)
      */
     public function createPay()
     {   
@@ -55,6 +56,9 @@ class Wallet extends BaseController
                 'amount' => ['required', 'numeric', 'min:0.01'],
                 'payment_type' => ['required', 'string'],
             ]);
+            if ($params['payment_type'] == 'rgcz') {
+                return $this->error('参数有误');
+            }
             $member_id = request()->user->member_id;
             $res = PaymentOrderService::createPay($member_id, $params['amount'], $params['payment_type']);
             if ($res['code'] == 0) { 
@@ -113,7 +117,7 @@ class Wallet extends BaseController
     }
 
     /**
-     * 提交充值凭证
+     * 提交充值凭证(USDT手动充值)
      */
     public function recharge()
     {
@@ -144,6 +148,65 @@ class Wallet extends BaseController
         }
     }
 
+    //支付宝、微信、银行卡手动充值
+    public function paymentOrder()
+    {
+        try {
+            $member_id = request()->user->member_id;
+            $params = request()->validate([
+                'amount' => ['required', 'numeric', 'min:0.01'],
+                'payment_type' => ['required', 'integer'],
+            ]);
+
+            $data = [];
+            $data['type'] = PaymentOrderService::TYPE_SELF_PAY;
+            $data['order_no'] = PaymentOrderService::createOrderNo('rgcz_', $member_id);
+            $data['member_id'] = $member_id;
+            $data['fee'] = 0;
+            $data['amount'] = number_format($params['amount'], 2, '.', '');
+            $data['payment_type'] = $params['payment_type'];
+            $data['channel'] = 'rgcz';
+            $data['status'] = PaymentOrderService::STATUS_STAY;
+            $data['remark'] = '';
+            // 创建待处理状态的提现记录
+            $info = PaymentOrder::create($data);
+            return $this->success($info,'提交成功,请等待人工回复');
+        } catch (ValidationException $e) {
+            return $this->error($e->validator->errors()->first());
+        } catch (Exception $e) {
+            return $this->error($e->getMessage());
+        }
+    }
+
+    //支付宝、微信、银行卡手动充值提交图片
+    public function submitImage()
+    {
+        try {
+            $member_id = request()->user->member_id;
+            $params = request()->validate([
+                'id' => ['required', 'integer'],
+                'image' => ['required', 'url'],
+            ]);
+            
+            // 创建待处理状态的提现记录
+            $info = PaymentOrder::where('id', $params['id'])->where('member_id', $member_id)->first();
+            if (!$info) {
+                return $this->error(lang('找不到此记录'));
+            }
+            if ($info->status != PaymentOrderService::STATUS_PROCESS) {
+                return $this->error(lang('待处理中,请稍后'));
+            }
+            $info->image = $params['image'];
+            $info->status = PaymentOrderService::STATUS_USER;
+            $info->save();
+            return $this->success($info,'提交成功,请等待人工审核');
+        } catch (ValidationException $e) {
+            return $this->error($e->validator->errors()->first());
+        } catch (Exception $e) {
+            return $this->error($e->getMessage());
+        }
+    }
+
     /**
      * 获取提现通道
      */

+ 1 - 1
app/Models/PaymentOrder.php

@@ -16,7 +16,7 @@ class PaymentOrder extends BaseModel
 {
 
     protected $table = 'payment_orders';
-    protected $fillable = ['type', 'order_no', 'member_id', 'amount', 'channel', 'admin_note','bank_name', 'account', 'card_no', 'status', 'callback_url', 'callback_data', 'remark', 'pay_no', 'pay_url', 'pay_data', 'fee'];
+    protected $fillable = ['type', 'order_no', 'member_id', 'amount', 'channel', 'admin_note','bank_name', 'account', 'card_no', 'status', 'callback_url', 'callback_data', 'remark', 'pay_no', 'pay_url', 'pay_data', 'fee', 'payment_type', 'is_send'];
     protected $hidden = [];
     // // 添加这个
     // protected $visible = [

+ 27 - 0
app/Models/User.php

@@ -92,4 +92,31 @@ class User extends BaseModel
     {
         return $this->first_name;
     }
+
+    /**
+     * 生成8位数字+大写字母混合邀请码
+     * @return string 生成的邀请码
+     */
+    public static function generateUserCode($num_len = 6, $letter_len = 2) {
+        // 生成num_len位安全随机数字
+        $numbers = '';
+        for ($i = 0; $i < $num_len; $i++) {
+            $numbers .= random_int(0, 9);
+        }
+        
+        // 生成letter_len位安全随机字母
+        $letters = '';
+        $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+        $charLength = strlen($chars);
+        for ($i = 0; $i < $letter_len; $i++) {
+            $letters .= $chars[random_int(0, $charLength - 1)];
+        }
+        
+        // 打乱顺序
+        $user_code = str_shuffle($numbers . $letters);
+        if (User::where('user_code', $user_code)->value('id')) {
+            return self::generateUserCode();
+        }
+        return $user_code;
+    }
 }

+ 11 - 3
app/Services/PaymentOrderService.php

@@ -18,11 +18,13 @@ class PaymentOrderService extends BaseService
 {
     const TYPE_PAY = 1; // 代收
     const TYPE_PAYOUT = 2; // 代付
+    const TYPE_SELF_PAY = 3; // 手动充值
 
     const STATUS_STAY = 0;  // 待处理
     const STATUS_PROCESS = 1; // 处理中
     const STATUS_SUCCESS = 2; // 成功
     const STATUS_FAIL = 3; // 失败
+    const STATUS_USER = 4; // 待用户提交凭证
 
     public static string $MODEL = PaymentOrder::class;
 
@@ -55,11 +57,14 @@ class PaymentOrderService extends BaseService
         if (isset($search['member_id']) && !empty($search['member_id'])) {
             $where[] = ['payment_orders.member_id', '=', $search['member_id']];
         }
-        if (isset($search['type']) && !empty($search['type'])) {
-            $where[] = ['payment_orders.type', '=', $search['type']];
-        }
         if (isset($search['channel']) && !empty($search['channel'])) {
             $where[] = ['payment_orders.channel', '=', $search['channel']];
+            if ($search['channel'] == 'rgcz') {
+                $search['type'] = 3;
+            }
+        }
+        if (isset($search['type']) && !empty($search['type'])) {
+            $where[] = ['payment_orders.type', '=', $search['type']];
         }
         if (isset($search['order_no']) && !empty($search['order_no'])) {
             $where[] = ['payment_orders.order_no', '=', $search['order_no']];
@@ -73,6 +78,9 @@ class PaymentOrderService extends BaseService
         if (isset($search['first_name']) && !empty($search['first_name'])) {
             $where[] = ['users.first_name', 'like', "%" . $search['first_name'] . "%"];
         }
+        if (isset($search['payment_type']) && $search['payment_type'] != '') {
+            $where[] = ['payment_orders.payment_type', '=', $search['payment_type']];
+        }
         return $where;
     }
 

+ 8 - 1
app/Services/PublicService.php

@@ -48,10 +48,17 @@ class PublicService extends BaseService
     {
 
         $user = User::where('member_id', $chatId)->first();
-        if (!$user) $user = new User();
+        if (!$user) {
+            $user = new User();
+            $user->from = -1;
+            $user->user_code = User::generateUserCode();
+        }
         $user->member_id = $chatId;
         $user->first_name = $firstName;
         if ($username) $user->username = $username;
+        if (empty($user->user_id)) {
+            $user->user_id = $chatId;
+        }
         $user->save();
 
         //给每个用户生成一个专属的钱包

+ 3 - 0
lang/zh/messages.php

@@ -459,4 +459,7 @@ return [
     '提现不能少于' => '提现不能少于',
     '余额不足' => '余额不足',
     '充值类型错误' => '充值类型错误',
+    '待处理中,请稍后' => '待处理中,请稍后',
+    '提交成功,请等待人工审核' => '提交成功,请等待人工审核',
+    '提交成功,请等待人工回复' => '提交成功,请等待人工回复',
 ];

+ 4 - 0
routes/admin.php

@@ -97,6 +97,9 @@ Route::middleware(['admin.jwt'])->group(function () {
             Route::get('/', [PaymentOrder::class, 'index']);
             Route::get('/check', [PaymentOrder::class, 'check']);
             Route::post('/audit', [PaymentOrder::class, 'audit']);
+            Route::post('/setPayData', [PaymentOrder::class, 'setPayData']);
+            Route::post('/manual‌Audit', [PaymentOrder::class, 'manual‌Audit']);
+            
         });
 
 
@@ -199,6 +202,7 @@ Route::middleware(['admin.jwt'])->group(function () {
             Route::get("/address", [Wallet::class, 'address']);
             Route::get("/withdrawChannel", [Wallet::class, 'withdrawChannel']);
             Route::get("/getChannel", [Wallet::class, 'getChannel']);
+            
 
         });
 

+ 3 - 0
routes/api.php

@@ -96,6 +96,9 @@ Route::middleware('check.token')->group(function () {
         Route::post("/addAddress", [Wallet::class, 'addAddress']);
         Route::get("/delAddress", [Wallet::class, 'delAddress']);
         Route::get("/address", [Wallet::class, 'address']);
+        
+        Route::post('/paymentOrder', [Wallet::class, 'paymentOrder']);
+        Route::post('/submitImage', [Wallet::class, 'submitImage']);
     });
 });