2025-02-16 22:40:30 +08:00
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace app\controller\api;
|
|
|
|
|
|
|
|
|
|
use app\model\Withdraw;
|
|
|
|
|
use app\model\User;
|
|
|
|
|
use app\model\ExchangeRate;
|
|
|
|
|
use app\model\Userbank;
|
|
|
|
|
|
|
|
|
|
use support\Request;
|
|
|
|
|
use App\Utils\API\Payment;
|
2025-02-18 17:22:37 +08:00
|
|
|
|
use App\Utils\API\PaymentNew;
|
2025-02-20 15:53:01 +08:00
|
|
|
|
use App\Utils\ApiResponse;
|
2025-02-16 22:40:30 +08:00
|
|
|
|
use App\Utils\ApiResponseApp;
|
|
|
|
|
|
|
|
|
|
use App\dao\UserRewardDao;
|
|
|
|
|
use hg\apidoc\annotation as Apidoc;
|
|
|
|
|
use Carbon\Carbon;
|
|
|
|
|
|
2025-02-21 08:49:49 +08:00
|
|
|
|
use support\Log;
|
|
|
|
|
|
2025-02-16 22:40:30 +08:00
|
|
|
|
/**
|
|
|
|
|
* @Apidoc\Title("提现订单")
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
class WithdrawController
|
|
|
|
|
{
|
2025-02-21 22:38:17 +08:00
|
|
|
|
protected $noNeedLogin = ['callback'];
|
2025-02-18 12:36:42 +08:00
|
|
|
|
|
2025-02-16 22:40:30 +08:00
|
|
|
|
/**
|
|
|
|
|
* @Apidoc\Title("1.0 查询当前用户提现订单")
|
|
|
|
|
* @Apidoc\Url("api/withdraw/withdrawCashList")
|
|
|
|
|
* @Apidoc\Method("POST")
|
|
|
|
|
*/
|
|
|
|
|
public function withdrawCashList(Request $request)
|
|
|
|
|
{
|
2025-02-18 12:36:42 +08:00
|
|
|
|
$page = $request->post('page', 1); // 默认第一页
|
|
|
|
|
$size = $request->post('size', 15); // 默认每页15条
|
|
|
|
|
$status = $request->post('status', 0); // 默认状态为0(全部)
|
|
|
|
|
$time = $request->post('time', null); // 默认时间不做过滤
|
|
|
|
|
|
2025-02-16 22:40:30 +08:00
|
|
|
|
$userId = $request->data['id'];
|
|
|
|
|
|
2025-02-18 12:36:42 +08:00
|
|
|
|
// 初始化查询构建器
|
|
|
|
|
$query = Withdraw::query();
|
2025-02-16 22:40:30 +08:00
|
|
|
|
|
2025-02-18 12:36:42 +08:00
|
|
|
|
// 根据状态过滤
|
|
|
|
|
if ($status != 0) {
|
|
|
|
|
$query->where('status', $status);
|
2025-02-16 22:40:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-02-18 12:36:42 +08:00
|
|
|
|
// 根据时间过滤
|
|
|
|
|
if (!is_null($time)) {
|
|
|
|
|
$todayStart = Carbon::now()->startOfDay(); // 今天的开始时间 (00:00:00)
|
|
|
|
|
$todayEnd = Carbon::now()->endOfDay(); // 今天的结束时间 (23:59:59)
|
|
|
|
|
$yesterdayStart = Carbon::now()->subDay()->startOfDay(); // 昨天的开始时间
|
|
|
|
|
$sevenDaysAgoStart = Carbon::now()->subDays(7)->startOfDay(); // 七天前的开始时间
|
2025-02-16 22:40:30 +08:00
|
|
|
|
|
2025-02-18 12:36:42 +08:00
|
|
|
|
switch ($time) {
|
|
|
|
|
case 1:
|
|
|
|
|
$query->whereBetween('createtime2', [$todayStart, $todayEnd]);
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
$query->whereBetween('createtime2', [$yesterdayStart, $todayEnd]);
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
$query->whereBetween('createtime2', [$sevenDaysAgoStart, $todayEnd]);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 添加用户ID过滤条件
|
|
|
|
|
$query->where('user_id', $userId);
|
|
|
|
|
|
|
|
|
|
// 查询结果
|
|
|
|
|
$withdrawOrders = $query->orderBy('createtime2', 'desc')
|
|
|
|
|
->skip(($page - 1) * $size)
|
|
|
|
|
->take($size)
|
|
|
|
|
->get();
|
|
|
|
|
|
|
|
|
|
// 手动映射字段
|
2025-02-20 22:44:09 +08:00
|
|
|
|
// $withdrawOrders = $withdrawOrders->map(function ($item) {
|
|
|
|
|
// // 将 money 字段映射为 amount
|
|
|
|
|
// $item->amount = $item->money;
|
2025-02-21 22:38:17 +08:00
|
|
|
|
|
2025-02-20 22:44:09 +08:00
|
|
|
|
// unset($item->money); // 删除原始的 money 字段
|
|
|
|
|
// return $item;
|
|
|
|
|
// });
|
|
|
|
|
// $withdrawOrders->money = 100;
|
|
|
|
|
// var_dump($withdrawOrders);
|
2025-02-18 12:36:42 +08:00
|
|
|
|
|
|
|
|
|
// 返回成功响应
|
|
|
|
|
return ApiResponseApp::success($withdrawOrders);
|
|
|
|
|
}
|
2025-02-16 22:40:30 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Apidoc\Title("小于1000直接转账,大于1000生成审批")
|
|
|
|
|
* @Apidoc\Url("api/withdraw/submit")
|
|
|
|
|
* @Apidoc\Method("POST")
|
|
|
|
|
*/
|
|
|
|
|
public function submit(Request $request)
|
|
|
|
|
{
|
|
|
|
|
$money_no = $request->post('money');
|
2025-02-18 13:12:23 +08:00
|
|
|
|
//用户存了一个 转账信息 这里是用户转账信息的id
|
2025-02-16 22:40:30 +08:00
|
|
|
|
$bank_id = $request->post('bank_id');
|
2025-02-18 12:36:42 +08:00
|
|
|
|
$user_id = $request->data['id'];
|
2025-02-22 13:49:00 +08:00
|
|
|
|
$today = date('Y-m-d');
|
|
|
|
|
//判断用户今天提现几次
|
2025-02-22 13:49:15 +08:00
|
|
|
|
if (Withdraw::where('user_id', $user_id)->where('created_at', '>=', $today . " 00:00:00")->count() >= 3) {
|
2025-02-22 13:49:00 +08:00
|
|
|
|
return ApiResponseApp::error(null, '每天只能提现三次');
|
|
|
|
|
}
|
2025-02-18 12:36:42 +08:00
|
|
|
|
$user = User::find($user_id);
|
2025-02-16 22:40:30 +08:00
|
|
|
|
//提现金额
|
2025-02-18 12:36:42 +08:00
|
|
|
|
$rate = ExchangeRate::where('type', 'BDT')->get();
|
|
|
|
|
$money = $money_no / 100 * $rate[0]['points'];
|
2025-02-21 22:38:17 +08:00
|
|
|
|
|
2025-02-21 08:49:49 +08:00
|
|
|
|
$withdraw = Withdraw::create([
|
|
|
|
|
'user_id' => $user_id,
|
|
|
|
|
'amount' => $money,
|
|
|
|
|
'status' => 1,
|
|
|
|
|
'createtime2' => date('Y-m-d H:i:s'),
|
|
|
|
|
'username' => $user->username,
|
|
|
|
|
'status_text' => '申请中',
|
|
|
|
|
]);
|
2025-02-16 22:40:30 +08:00
|
|
|
|
//大于1000等待管理员审核
|
2025-02-22 20:30:54 +08:00
|
|
|
|
if ($money >= 100000) {
|
2025-02-18 12:36:42 +08:00
|
|
|
|
return ApiResponseApp::success(null, '等待管理员审核');
|
2025-02-16 22:40:30 +08:00
|
|
|
|
}
|
2025-02-18 17:22:37 +08:00
|
|
|
|
//用户积分减少$money
|
2025-02-18 17:50:13 +08:00
|
|
|
|
UserRewardDao::base($user_id, 1, - ($money_no + 300), '提现');
|
2025-02-18 19:44:57 +08:00
|
|
|
|
$userbank = Userbank::where('id', $bank_id)->first();
|
2025-02-21 08:49:49 +08:00
|
|
|
|
|
2025-02-18 17:50:13 +08:00
|
|
|
|
//获取刚刚存入数据库的id(订单号)
|
|
|
|
|
$orderId = $withdraw->id;
|
2025-02-21 22:38:17 +08:00
|
|
|
|
$res = PaymentNew::pushMoney($money, $userbank->bank_username, $userbank->account, $userbank->bank_name, $orderId);
|
2025-02-22 13:49:15 +08:00
|
|
|
|
|
2025-02-18 17:22:37 +08:00
|
|
|
|
// //逻辑错误需要修改
|
2025-02-22 13:49:15 +08:00
|
|
|
|
if ($res->Success) {
|
2025-02-20 23:45:28 +08:00
|
|
|
|
$withdraw->update([
|
2025-02-21 08:49:49 +08:00
|
|
|
|
'status' => 4, //
|
|
|
|
|
'status_text' => '等待银行打款',
|
2025-02-22 13:49:15 +08:00
|
|
|
|
'order_number' => $res->TrackingNumber ?? null,
|
2025-02-20 23:45:28 +08:00
|
|
|
|
]);
|
|
|
|
|
return ApiResponseApp::success(null, '转账成功');
|
|
|
|
|
} else {
|
2025-02-22 15:26:30 +08:00
|
|
|
|
UserRewardDao::base($user_id, 1, $money_no + 300, '提现失败返还');
|
2025-02-22 13:49:15 +08:00
|
|
|
|
if ($res->ErrorMessage == "PayeeAccountNumberFormatError") {
|
|
|
|
|
return ApiResponseApp::error(null, '收款人帐号格式错误');
|
|
|
|
|
}
|
|
|
|
|
return ApiResponseApp::error(null, '未知错误请联系客服');
|
2025-02-20 23:45:28 +08:00
|
|
|
|
}
|
2025-02-16 22:40:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-02-18 17:22:37 +08:00
|
|
|
|
|
2025-02-21 22:38:17 +08:00
|
|
|
|
/**
|
2025-02-18 17:22:37 +08:00
|
|
|
|
* @Apidoc\Title("请求回调")
|
|
|
|
|
* @Apidoc\Url("api/withdraw/callback")
|
2025-02-20 23:45:28 +08:00
|
|
|
|
* @Apidoc\Method("POST")
|
2025-02-18 17:22:37 +08:00
|
|
|
|
*/
|
|
|
|
|
public function callback(Request $request)
|
|
|
|
|
{
|
2025-02-20 23:45:28 +08:00
|
|
|
|
$callbackData = $request->all();
|
2025-02-21 22:38:17 +08:00
|
|
|
|
// 记录回调数据以便调试
|
2025-02-21 08:49:49 +08:00
|
|
|
|
Log::info('Payment Callback Received:', $callbackData);
|
2025-02-20 23:45:28 +08:00
|
|
|
|
$orderId = $callbackData['TrackingNumber'] ?? null;
|
|
|
|
|
$failedMessage = $callbackData['FailedMessage'] ?? null;
|
2025-02-22 20:41:08 +08:00
|
|
|
|
$amount = $callbackData['Amount'] ?? null;
|
|
|
|
|
|
2025-02-20 23:45:28 +08:00
|
|
|
|
$withdraw = Withdraw::where('order_number', $orderId)->first();
|
|
|
|
|
//$failedMessage为null就是成功
|
|
|
|
|
if ($failedMessage != null) {
|
2025-02-22 20:41:08 +08:00
|
|
|
|
$rate = ExchangeRate::where('type', 'BDT')->get();
|
|
|
|
|
$money = $amount * 100 / $rate[0]['points'] + 300;
|
|
|
|
|
UserRewardDao::base($withdraw->user_id, 1, $money, '提现失败返还');
|
2025-02-20 23:45:28 +08:00
|
|
|
|
$withdraw->update([
|
2025-02-21 22:38:17 +08:00
|
|
|
|
'status' => 5,
|
2025-02-20 23:45:28 +08:00
|
|
|
|
'status_text' => '支付失败: ' . $failedMessage,
|
|
|
|
|
]);
|
2025-02-22 15:26:30 +08:00
|
|
|
|
}else{
|
|
|
|
|
$withdraw->update([
|
|
|
|
|
'status' => 2,
|
|
|
|
|
'status_text' => '已到账',
|
|
|
|
|
]);
|
2025-02-20 23:45:28 +08:00
|
|
|
|
}
|
2025-02-18 17:22:37 +08:00
|
|
|
|
}
|
2025-02-16 22:40:30 +08:00
|
|
|
|
}
|