Lae/app/Http/Controllers/User/BalanceController.php

201 lines
5.3 KiB
PHP
Raw Normal View History

2022-08-30 09:20:45 +00:00
<?php
namespace App\Http\Controllers\User;
2022-09-01 09:48:29 +00:00
use Exception;
use App\Models\User\Balance;
2022-08-30 09:20:45 +00:00
use Illuminate\Http\Request;
2022-09-01 09:48:29 +00:00
use Illuminate\Support\Facades\DB;
2022-09-09 13:42:12 +00:00
use Illuminate\Support\Facades\Log;
2022-09-01 09:48:29 +00:00
use App\Http\Controllers\Controller;
2022-09-09 13:42:12 +00:00
use Illuminate\Support\Facades\Cache;
2022-09-01 09:48:29 +00:00
use Alipay\EasySDK\Kernel\Util\ResponseChecker;
use Alipay\EasySDK\Kernel\Factory as AlipayFactory;
2022-08-30 09:20:45 +00:00
class BalanceController extends Controller
{
//
public function index(Request $request)
{
2022-09-01 13:15:13 +00:00
$balances = Balance::thisUser()->simplePaginate(30);
return $this->success($balances);
2022-08-30 09:20:45 +00:00
}
public function store(Request $request)
{
// 充值
2022-09-08 16:12:02 +00:00
$this->validate($request, [
2022-09-01 10:28:23 +00:00
'amount' => 'required|integer|min:1|max:10000',
2022-08-30 09:20:45 +00:00
]);
2022-09-01 09:48:29 +00:00
$user = $request->user();
$balance = new Balance();
2022-09-01 13:15:13 +00:00
$data = [
2022-09-01 09:48:29 +00:00
'user_id' => $user->id,
'amount' => $request->amount,
'payment' => 'alipay',
2022-09-01 13:15:13 +00:00
];
2022-09-08 16:12:02 +00:00
// // if local
// if (env('APP_ENV') == 'local') {
// $data['payment'] = null;
// $data['paid_at'] = now();
// }
2022-09-01 13:15:13 +00:00
$balance = $balance->create($data);
2022-09-08 16:12:02 +00:00
// if (env('APP_ENV') == 'local') {
// $user->increment('balance', $request->amount);
// return $this->success($balance);
// }
2022-09-01 13:15:13 +00:00
2022-09-01 09:48:29 +00:00
// 生成 18 位订单号
$order_id = date('YmdHis') . $balance->id . rand(1000, 9999);
$balance->order_id = $order_id;
$balance->save();
$balance = $balance->toArray();
$balance['pay_url'] = route('balances.pay.show', ['balance' => $balance['order_id']]);
return $this->success($balance);
}
public function show(Request $request, Balance $balance)
{
// dd(AlipayFactory::payment()->common()->query('20220901070430102316'));
// dd(route(''));
if ($balance->paid_at !== null) {
return $this->error('订单已支付');
}
2022-08-30 09:20:45 +00:00
try {
2022-09-06 06:51:48 +00:00
$result = AlipayFactory::payment()->page()->pay("支付", $balance->order_id, $balance->amount, route('balances.return'));
2022-09-01 09:48:29 +00:00
$responseChecker = new ResponseChecker();
// dd($result);
if ($responseChecker->success($result)) {
$html = $result->body;
return view('pay', compact('html'));
}
} catch (Exception $e) {
2022-09-09 13:17:31 +00:00
Log::error($e);
2022-09-01 09:48:29 +00:00
echo "调用失败," . $e->getMessage() . PHP_EOL;;
2022-08-30 09:20:45 +00:00
}
2022-09-01 09:48:29 +00:00
2022-08-30 09:20:45 +00:00
return $this->success($balance);
}
2022-09-06 06:51:48 +00:00
public function return(Request $request)
{
2022-09-09 15:17:59 +00:00
$this->validate($request, [
'out_trade_no' => 'required',
]);
2022-09-06 06:51:48 +00:00
// 检测订单是否存在
$balance = Balance::where('order_id', $request->out_trade_no)->with('user')->first();
if (!$balance) {
return $this->notFound('balance not found');
}
// 检测订单是否已支付
if ($balance->paid_at !== null) {
return $this->success('订单已支付');
}
if ($this->checkAndCharge($request->out_trade_no, $balance)) {
2022-09-06 07:12:30 +00:00
return view('pay_success');
2022-09-06 06:51:48 +00:00
} else {
2022-09-06 07:12:30 +00:00
return view('pay_error');
2022-09-06 06:51:48 +00:00
}
}
2022-09-01 09:48:29 +00:00
public function notify(Request $request)
{
2022-09-09 15:17:59 +00:00
$this->validate($request, [
'out_trade_no' => 'required',
]);
2022-09-01 09:48:29 +00:00
// 检测订单是否存在
$balance = Balance::where('order_id', $request->out_trade_no)->with('user')->first();
if (!$balance) {
return $this->notFound('balance not found');
}
// 检测订单是否已支付
if ($balance->paid_at !== null) {
return $this->success('订单已支付');
}
2022-09-06 06:51:48 +00:00
if ($this->checkAndCharge($request->out_trade_no, $balance)) {
return $this->success();
} else {
return $this->error();
}
}
public function checkAndCharge($out_trade_no, Balance $balance)
{
$trade = AlipayFactory::payment()->common()->query($out_trade_no);
2022-09-01 09:48:29 +00:00
if ($trade->code == "10000" && $trade->tradeStatus == "TRADE_SUCCESS") {
$balance->paid_at = now();
$balance->save();
DB::beginTransaction();
try {
$balance->user->increment('balance', $trade->totalAmount);
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
2022-09-06 06:51:48 +00:00
AlipayFactory::payment()->common()->refund($out_trade_no, $trade->totalAmount);
2022-09-01 09:48:29 +00:00
return $this->error($e->getMessage());
}
2022-09-06 06:51:48 +00:00
return true;
2022-09-01 09:48:29 +00:00
} else {
2022-09-06 06:51:48 +00:00
return false;
2022-09-01 09:48:29 +00:00
}
}
2022-08-30 09:20:45 +00:00
// // 转换为 drops
// public function transfer($amount = 1)
// {
2022-09-08 16:12:02 +00:00
// $balance = auth('api')->user();
2022-08-30 09:20:45 +00:00
// $balance->decrement('amount', $request->amount);
// return $this->success($balance);
// }
2022-09-09 13:42:12 +00:00
public function drops()
{
$month = now()->month;
$user_id = auth()->id();
$cache_key = 'user_' . $user_id . '_month_' . $month . '_drops';
$resp = [
2022-09-10 05:42:55 +00:00
'drops' => getDrops($user_id),
'monthly_usages' => (float) Cache::get($cache_key, 0),
2022-09-09 13:53:30 +00:00
'rate' => config('drops.rate'),
'decimal' => config('drops.decimal'),
2022-09-09 13:42:12 +00:00
];
return $this->success($resp);
}
2022-08-30 09:20:45 +00:00
}