editMessageText($res); } $pattern = "/^withdraw@@qb_choose_.*$/"; if (preg_match($pattern, $data)) { $type = preg_replace('/^withdraw@@qb_choose_/', '', $data); $res = QianBaoWithdrawService::showBanks($chatId, $messageId, $type); $telegram->editMessageText($res); } if ($data === "withdraw@@qb_apply") { $res = QianBaoWithdrawService::qbApply($chatId, $messageId); $telegram->editMessageText($res); } //钱宝账单 $pattern = "/^withdraw@@bank_bill_\d+$/"; if (preg_match($pattern, $data)) { $page = preg_replace('/^withdraw@@bank_bill_/', '', $data); if (empty($page) || $page < 1) $page = 1; $page = intval($page); $res = QianBaoWithdrawService::bill($chatId, $firstName, $messageId, $page); $telegram->editMessageText($res); } //选择银行卡号 $pattern = "/^withdrawAddress@@choose_qb_\d+$/"; if (preg_match($pattern, $data)) { $id = preg_replace('/^withdrawAddress@@choose_qb_/', '', $data); $res = QianBaoWithdrawService::chooseBank($chatId, $id); $telegram->deleteMessage([ 'chat_id' => $chatId, 'message_id' => $messageId, ]); $telegram->sendMessage($res); } //银行卡管理 if ($data === 'withdraw@@banks') { $res = QianBaoWithdrawService::banks($chatId, $messageId); $telegram->editMessageText($res); } //银行卡详情 $pattern = "/^withdrawAddress@@bank_detail\d+$/"; if (preg_match($pattern, $data)) { $id = preg_replace('/^withdrawAddress@@bank_detail/', '', $data); $res = static::bankDetails($chatId, $messageId, $id); $telegram->editMessageText($res); } $pattern = "/^withdraw@@bank_del_\d+$/"; if (preg_match($pattern, $data)) { $id = preg_replace('/^withdraw@@bank_del_/', '', $data); $res = static::bankDelete($chatId, $messageId, $id); $telegram->editMessageText($res); } //添加银行卡 if ($data === "withdrawAddress@@bank_add") { $res = QianBaoWithdrawService::addBank($chatId, $messageId); $telegram->editMessageText($res); } $pattern = "/^withdrawAddress@@bank_choose_channel_.*$/"; if (preg_match($pattern, $data)) { $channel = preg_replace('/^withdrawAddress@@bank_choose_channel_/', '', $data); $res = static::chooseChannel($chatId, $messageId, $channel); $telegram->editMessageText($res); } } public static function onMessage($chatId, $text, $messageId, $stepStatus) { switch ($stepStatus) { case StepStatus::INPUT_WITHDRAW_QB_MONEY://输入提现金额 $res = QianBaoWithdrawService::inputQbAmount($chatId, $text, $messageId); return $res; break; case StepStatus::QB_INPUT_BANK_NAME://输入银行名称 $res = QianBaoWithdrawService::inputBankName($chatId, $text, $messageId); return $res; case StepStatus::QB_INPUT_CARD_NO://输入银行卡号/支付宝账号 $res = QianBaoWithdrawService::inputCardNo($chatId, $text, $messageId); return $res; break; case StepStatus::QB_INPUT_ACCOUNT://输入姓名 $res = QianBaoWithdrawService::inputAccount($chatId, $text, $messageId); return $res; break; } return null; } private static function chooseType($chatId, $messageId) { $keyboard = []; $keyboard[] = [ ['text' => "银行卡", 'callback_data' => "withdraw@@qb_choose_bank"], ['text' => "支付宝", 'callback_data' => "withdraw@@qb_choose_aliPay"], ]; $keyboard[] = [ ['text' => "数字人民币", 'callback_data' => "withdraw@@qb_choose_digital_RMB"], ]; $keyboard[] = [ ['text' => "提现账户管理", 'callback_data' => "withdraw@@banks"], ]; return [ 'chat_id' => $chatId, 'text' => "请选择提现方式", 'message_id' => $messageId, 'reply_markup' => json_encode(['inline_keyboard' => $keyboard]) ]; } private static function showBanks($chatId, $messageId, $type) { $channel = ''; $card = ""; switch ($type) { case "bank": $card = "银行卡"; $text = "请选择提现的银行卡"; $channel = 'DF001'; break; case "aliPay": $card = "支付宝"; $text = "请选择提现的支付宝"; $channel = "DF002"; break; case "digital_RMB": $text = "暂不支持数字人民币"; break; } $list = Bank::where('channel', $channel)->get(); $keyboard = []; foreach ($list as $item) { $keyboard[] = [['text' => $item->alias, 'callback_data' => "withdrawAddress@@choose_qb_{$item->id}"]]; } $keyboard[] = [ ['text' => "{$card}管理", 'callback_data' => "withdraw@@banks"], ['text' => "取消", 'callback_data' => "topUp@@home"]]; return [ 'chat_id' => $chatId, 'text' => $text, 'message_id' => $messageId, 'reply_markup' => json_encode(['inline_keyboard' => $keyboard]) ]; } //钱宝账单 private static function bill($chatId, $firstName, $messageId, $page = 1, $limit = 5) { $list = PaymentOrder::where('member_id', $chatId) ->where('type', 2) ->orderByDesc('created_at') ->forPage($page, $limit) ->get(); $count = PaymentOrder::where('member_id', $chatId) ->where('type', 2) ->count(); $text = "👤 {$firstName}({$chatId}) 钱宝提现记录\n\n"; foreach ($list as $item) { $amount = floatval($item->amount); $amount = $item->type == 2 ? "➖ {$amount}" : "➕ $amount"; $text .= "-------------------------------------\n"; $text .= "{$amount} \n"; $text .= "订单号:{$item->order_no}\n"; $text .= "银行:{$item->bank_name}\n"; $text .= "姓名:{$item->account}\n"; $text .= "卡号:{$item->card_no}\n"; $status = ['待处理', '处理中', '成功', '失败']; $text .= "状态:{$status[$item->status]}\n"; if ($item->remark) { $text .= "说明:{$item->remark}\n"; } $text .= "日期:{$item->created_at}\n"; } if ($page > 1) { $keyboard[] = [ ['text' => "👆上一页", 'callback_data' => "withdraw@@bank_bill_" . ($page - 1)] ]; } $allPage = ceil($count / $limit); if ($allPage > $page) { if ($page > 1) { $keyboard[count($keyboard) - 1][] = ['text' => "👇下一页", 'callback_data' => "withdraw@@bank_bill_" . ($page + 1)]; } else { $keyboard[] = [ ['text' => "👇下一页", 'callback_data' => "withdraw@@bank_bill_" . ($page + 1)] ]; } } $keyboard[] = [ ['text' => "返回", 'callback_data' => "topUp@@home"] ]; return [ 'chat_id' => $chatId, 'text' => $text, 'message_id' => $messageId, 'reply_markup' => json_encode(['inline_keyboard' => $keyboard]) ]; } //1.钱宝提现 private static function qbApply($chatId, $messageId) { $three_payment_switch = Config::where('field', 'three_payment_switch')->first()->val; if ($three_payment_switch != 1) { $res = WalletService::getBalance($chatId); $res['message_id'] = $messageId; return $res; } $wallet = Wallet::where('member_id', $chatId)->first(); $temp = floatval($wallet->available_balance); $text = "请发送提现金额\n"; $text .= "💰 当前余额{$temp} RMB\n"; Cache::put(get_step_key($chatId), StepStatus::INPUT_WITHDRAW_QB_MONEY); return [ 'chat_id' => $chatId, 'text' => $text, 'message_id' => $messageId, ]; } //2.输入钱宝提现金额 private static function inputQbAmount($chatId, $amount, $messageId) { if (!preg_match('/^\d+(\.\d{1,2})?$/', $amount)) { return [ 'chat_id' => $chatId, 'text' => "金额输入不正确,请发送提现数字", 'reply_to_message_id' => $messageId ]; } $amount = floatval($amount); $wallet = Wallet::where('member_id', $chatId)->first(); $temp = floatval($wallet->available_balance); if ($amount > $temp) { return [ 'chat_id' => $chatId, 'text' => "⚠️可用余额不足,请重试", 'reply_to_message_id' => $messageId ]; } if ($amount < 100) { return [ 'chat_id' => $chatId, 'text' => "⚠️提现不能少于100 RMB,请重试", 'reply_to_message_id' => $messageId ]; } if ($amount > 49999) { return [ 'chat_id' => $chatId, 'text' => "⚠️最多提现 49999 RMB,请重试", 'reply_to_message_id' => $messageId ]; } Cache::put("{$chatId}_WITHDRAW_MONEY", $amount); $list = Bank::where('member_id', $chatId)->get(); $keyboard = []; foreach ($list as $item) { $keyboard[] = [['text' => $item->alias, 'callback_data' => "withdrawAddress@@choose_qb_{$item->id}"]]; } $keyboard[] = [ ['text' => '🏠 银行卡管理', 'callback_data' => "withdraw@@banks"], ['text' => '❌取消', 'callback_data' => "message@@close"] ]; $text = "请直接选择下面的地址\n"; $text .= "⚠️提示:请务必确认提现地址正确无误,\n否则资金丢失将无法找回请自负!"; Cache::put("{$chatId}_WITHDRAW_QB_MONEY", $amount); Cache::put(get_step_key($chatId), StepStatus::CHOOSE_WITHDRAW_QB_ADDRESS); return [ 'chat_id' => $chatId, 'text' => $text, 'reply_to_message_id' => $messageId, 'reply_markup' => json_encode(['inline_keyboard' => $keyboard]) ]; } //3.选择银行卡号 private static function chooseBank($chatId, $id) { // $amount = Cache::get("{$chatId}_WITHDRAW_QB_MONEY", ''); // if (!$amount) return WalletService::getBalance($chatId); Cache::put("{$chatId}_QB_BANK_ID", $id); return [ 'chat_id' => $chatId, 'text' => "请输入提现的金额", ]; // $bank = Bank::where('id', $id)->first(); // $result = PaymentOrderService::createPayout($chatId, $amount, $bank->channel, $bank->bank_name, $bank->account, $bank->card_no); // return $result; // $text = "提交成功\n"; // $text .= "结果将在稍后通知您,请留意通知!!!"; } //银行卡管理 private static function banks($chatId, $messageId) { $text = "💳️ 银行卡管理\n"; $text .= "--------------------------\n"; $list = Bank::where('member_id', $chatId) ->get(); $keyboard = []; foreach ($list as $item) { $keyboard[] = [['text' => "{$item->bank_name}({$item->card_no})", 'callback_data' => "withdrawAddress@@bank_detail{$item->id}"]]; } if (count($list) < 5) { $keyboard[] = [['text' => "➕ 添加银行卡", 'callback_data' => "withdrawAddress@@bank_add"]]; } $keyboard[] = [['text' => "↩️返回", 'callback_data' => "topUp@@home"]]; return [ 'chat_id' => $chatId, 'text' => $text, 'message_id' => $messageId, 'reply_markup' => json_encode(['inline_keyboard' => $keyboard]) ]; } //银行卡详情 private static function bankDetails($chatId, $messageId, $id) { $text = "*银行卡管理*\n\n"; $bank = Bank::where('id', $id) ->where('member_id', $chatId)->first(); switch ($bank->channel) { case "DF001": $text .= "姓名:{$bank->account}\n"; $text .= "银行:{$bank->bank_name}\n"; $text .= "卡号:{$bank->card_no}\n"; break; case "DF002": $text .= "姓名:{$bank->account}\n"; $text .= "银行:{$bank->bank_name}\n"; $text .= "账号:{$bank->card_no}\n"; break; default: $text .= "姓名:{$bank->account}\n"; $text .= "银行:{$bank->bank_name}\n"; $text .= "卡号:{$bank->card_no}\n"; break; } $keyboard = [ [['text' => '❌删除该地址', 'callback_data' => "withdraw@@bank_del_{$id}"]], [['text' => '↩️返回列表', 'callback_data' => 'withdraw@@banks']] ]; return [ 'chat_id' => $chatId, 'parse_mode' => 'MarkdownV2', 'text' => $text, 'reply_markup' => json_encode(['inline_keyboard' => $keyboard]), 'message_id' => $messageId ]; } //删除银行卡 private static function bankDelete($chatId, $messageId, $id) { Bank::where('id', $id) ->where('member_id', $chatId)->delete(); return static::banks($chatId, $messageId); } //添加银行卡 private static function addBank($chatId, $messageId) { $text = "请选择 提现通道\n"; $keyboard = [ [ ['text' => '银行卡', 'callback_data' => "withdrawAddress@@bank_choose_channel_DF001"], ['text' => '支付宝', 'callback_data' => "withdrawAddress@@bank_choose_channel_DF002"] ], [ ['text' => '❌取消', 'callback_data' => "message@@close"] ] ]; return [ 'chat_id' => $chatId, 'text' => $text, 'message_id' => $messageId, 'reply_markup' => json_encode(['inline_keyboard' => $keyboard]) ]; } //选择通道 private static function chooseChannel($chatId, $messageId, $channel) { Cache::put("{$chatId}_QB_WITHDRAW_CHANNEL", $channel); switch ($channel) { case "DF002"://支付宝 Cache::put("{$chatId}_QB_WITHDRAW_BANK_NAME", '支付宝'); Cache::put(get_step_key($chatId), StepStatus::QB_INPUT_CARD_NO); return [ 'chat_id' => $chatId, 'text' => "请输入支付宝账号", 'message_id' => $messageId, ]; break; case "DF001"://银行卡 Cache::put(get_step_key($chatId), StepStatus::QB_INPUT_BANK_NAME); return [ 'chat_id' => $chatId, 'text' => "请输入银行名称", 'message_id' => $messageId, ]; break; default: return [ 'chat_id' => $chatId, 'text' => "选择通道错误", 'message_id' => $messageId, ]; break; } } //输入银行名称 private static function inputBankName($chatId, $bankName, $messageId) { Cache::put("{$chatId}_QB_WITHDRAW_BANK_NAME", $bankName); Cache::put(get_step_key($chatId), StepStatus::QB_INPUT_CARD_NO); return [ 'chat_id' => $chatId, 'text' => "请输入银行卡号", 'message_id' => $messageId, ]; } //输入卡号 private static function inputCardNo($chatId, $cardNo, $messageId) { $channel = Cache::get("{$chatId}_QB_WITHDRAW_CHANNEL"); if ($channel === 'DF001' && !preg_match('/^\d+$/', $cardNo)) { return [ 'chat_id' => $chatId, 'text' => "输入的银行卡号有误,请重新输入", 'reply_to_message_id' => $messageId, ]; } Cache::put("{$chatId}_QB_WITHDRAW_CARD_NO", $cardNo); Cache::put(get_step_key($chatId), StepStatus::QB_INPUT_ACCOUNT); return [ 'chat_id' => $chatId, 'text' => "请输入姓名", 'message_id' => $messageId, ]; } //输入姓名,并保存到数据库 private static function inputAccount($chatId, $account, $messageId) { $channel = Cache::get("{$chatId}_QB_WITHDRAW_CHANNEL"); $cardNo = Cache::get("{$chatId}_QB_WITHDRAW_CARD_NO"); $bankName = Cache::get("{$chatId}_QB_WITHDRAW_BANK_NAME"); Bank::create([ 'member_id' => $chatId, 'account' => $account, 'channel' => $channel, 'card_no' => $cardNo, 'bank_name' => $bankName ]); return static::banks($chatId, $messageId); } }