174 lines
6.0 KiB
PHP
174 lines
6.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace app\api\controller;
|
|
|
|
use app\common\model\DepositOrder;
|
|
use app\common\model\WithdrawOrder;
|
|
use Webman\Http\Request;
|
|
use support\Response;
|
|
|
|
class Finance extends MobileBase
|
|
{
|
|
public function depositCreate(Request $request): Response
|
|
{
|
|
$response = $this->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;
|
|
}
|
|
}
|
|
|