initializeMobile($request); if ($response !== null) { return $response; } $payAmountFiat = (string) $request->post('pay_amount_fiat', ''); $fiatCurrency = trim((string) $request->post('fiat_currency', '')); $channel = trim((string) $request->post('channel', '')); $idempotencyKey = trim((string) $request->post('idempotency_key', '')); if ($payAmountFiat === '' || $fiatCurrency === '' || $channel === '' || $idempotencyKey === '') { return $this->mobileError(1001, 'Missing parameters'); } $orderNo = 'DP' . date('YmdHis') . substr(str_replace('.', '', uniqid('', true)), -6); $coinAmount = $payAmountFiat; DepositOrder::create([ 'order_no' => $orderNo, 'user_id' => $this->auth->id, 'fiat_currency' => $fiatCurrency, 'fiat_amount' => $payAmountFiat, 'fx_rate' => '1.00000000', 'coin_amount' => $coinAmount, 'gateway' => $channel, 'status' => 0, 'create_time' => time(), 'update_time' => time(), ]); return $this->mobileSuccess([ 'order_no' => $orderNo, 'coin_amount' => $coinAmount, 'pay_url' => '', 'status' => 'pending', ]); } public function depositDetail(Request $request): Response { $response = $this->initializeMobile($request); if ($response !== null) { return $response; } $orderNo = trim((string) $request->get('order_no', '')); if ($orderNo === '') { return $this->mobileError(1001, 'Missing parameters'); } $order = DepositOrder::where('order_no', $orderNo)->where('user_id', $this->auth->id)->find(); if (!$order) { return $this->mobileError(2003, 'Order does not exist'); } return $this->mobileSuccess([ 'order_no' => $order->order_no, 'status' => $this->mapDepositStatus($order->status), 'coin_amount' => $order->coin_amount, 'create_time' => $order->create_time, 'finish_time' => $order->paid_at, ]); } public function withdrawCreate(Request $request): Response { $response = $this->initializeMobile($request); if ($response !== null) { return $response; } $withdrawCoin = (string) $request->post('withdraw_coin', ''); $receiveAccount = trim((string) $request->post('receive_account', '')); $receiveType = trim((string) $request->post('receive_type', '')); $idempotencyKey = trim((string) $request->post('idempotency_key', '')); if ($withdrawCoin === '' || $receiveAccount === '' || $receiveType === '' || $idempotencyKey === '') { return $this->mobileError(1001, 'Missing parameters'); } $user = $this->auth->getUser(); if (bccomp((string) $user->coin, $withdrawCoin, 4) < 0) { return $this->mobileError(2001, 'Insufficient balance'); } $orderNo = 'WD' . date('YmdHis') . substr(str_replace('.', '', uniqid('', true)), -6); $feeCoin = bcmul($withdrawCoin, '0.005', 4); $actualArrivalCoin = bcsub($withdrawCoin, $feeCoin, 4); WithdrawOrder::create([ 'order_no' => $orderNo, 'user_id' => $user->id, 'apply_amount' => $withdrawCoin, 'fee_amount' => $feeCoin, 'actual_amount' => $actualArrivalCoin, 'fiat_currency' => '', 'need_audit' => 1, 'audit_status' => 0, 'reject_reason' => '', 'create_time' => time(), 'update_time' => time(), ]); return $this->mobileSuccess([ 'order_no' => $orderNo, 'status' => 'pending_review', 'fee_coin' => $feeCoin, 'actual_arrival_coin' => $actualArrivalCoin, 'risk_review_required' => true, ]); } public function withdrawDetail(Request $request): Response { $response = $this->initializeMobile($request); if ($response !== null) { return $response; } $orderNo = trim((string) $request->get('order_no', '')); if ($orderNo === '') { return $this->mobileError(1001, 'Missing parameters'); } $order = WithdrawOrder::where('order_no', $orderNo)->where('user_id', $this->auth->id)->find(); if (!$order) { return $this->mobileError(2003, 'Order does not exist'); } return $this->mobileSuccess([ 'order_no' => $order->order_no, 'status' => $this->mapWithdrawStatus($order->audit_status), 'withdraw_coin' => $order->apply_amount, 'fee_coin' => $order->fee_amount, 'reject_reason' => $order->reject_reason === '' ? null : $order->reject_reason, 'create_time' => $order->create_time, ]); } private function mapDepositStatus($status): string { if ($this->intValue($status) === 1) { return 'paid'; } if ($this->intValue($status) === 2 || $this->intValue($status) === 3) { return 'failed'; } return 'pending'; } private function mapWithdrawStatus($auditStatus): string { if ($this->intValue($auditStatus) === 1) { return 'approved'; } if ($this->intValue($auditStatus) === 2) { return 'rejected'; } return 'pending_review'; } private function intValue($value): int { $result = filter_var($value, FILTER_VALIDATE_INT); if ($result === false) { return 0; } return $result; } }