You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
244 lines
8.7 KiB
PHTML
244 lines
8.7 KiB
PHTML
2 years ago
|
<?php
|
||
|
|
||
|
declare(strict_types=1);
|
||
|
|
||
|
namespace App\Controller\Recharge;
|
||
|
|
||
|
use App\Exception\BusinessException;
|
||
|
use App\Exception\UnauthorizedException;
|
||
|
use App\Helper\Redis;
|
||
|
use App\Helper\StringHelper;
|
||
|
use App\Model\App;
|
||
|
use App\Model\BankCard;
|
||
|
use App\Model\Order;
|
||
|
use App\Model\User;
|
||
|
use App\Service\PaymentService;
|
||
|
use Hyperf\HttpServer\Contract\RequestInterface;
|
||
|
|
||
|
class RechargeController extends AbstractController
|
||
|
{
|
||
|
private PaymentService $paymentService;
|
||
|
|
||
|
public function __construct(PaymentService $paymentService)
|
||
|
{
|
||
|
$this->paymentService = $paymentService;
|
||
|
}
|
||
|
|
||
|
public function recharge(RequestInterface $request) {
|
||
|
$app = App::query()->orderBy('id', 'asc')->first();
|
||
|
$name = $request->input('name');
|
||
|
if (empty($name)) {
|
||
|
throw new BusinessException('请输入姓名');
|
||
|
}
|
||
|
$amount = $request->input('amount');
|
||
|
if (empty($amount)) {
|
||
|
throw new BusinessException('请输入金额');
|
||
|
}
|
||
|
if (!is_numeric($amount)) {
|
||
|
throw new BusinessException('请输入金额');
|
||
|
}
|
||
|
if ($amount <= 0) {
|
||
|
throw new BusinessException('金额需大于0');
|
||
|
}
|
||
|
$cardNo = $request->input('cardNo');
|
||
|
if (empty($cardNo)) {
|
||
|
throw new BusinessException('请输入身份证号');
|
||
|
}
|
||
|
$mobile = $request->input('mobile');
|
||
|
if (empty($mobile)) {
|
||
|
throw new BusinessException('请输入手机号');
|
||
|
}
|
||
|
$bankCardNo = $request->input('bankCardNo');
|
||
|
if (empty($bankCardNo)) {
|
||
|
throw new BusinessException('请输入银行卡号');
|
||
|
}
|
||
|
$memberId = $this->paymentService->generateMemberId($app->app_key, $cardNo);
|
||
|
$user = User::where('member_id', $memberId)->first();
|
||
|
$bankCard = null;
|
||
|
if ($user) {
|
||
|
$bankCard = BankCard::where('member_id', $user->member_id)->where('bank_card_no', $bankCardNo)->where('status', BankCard::STATUS_ACTIVE)->first();
|
||
|
}
|
||
|
|
||
|
if ($bankCard) {
|
||
|
$outTradeNo = StringHelper::generateOrderNo();
|
||
|
$nextStep = 'confirm-pay';
|
||
|
$bizData = $this->paymentService->protocolPayPreRequest($this->buildPrepayParams($user->member_id, $outTradeNo, $bankCard->protocol, intval($amount * 100), $app));
|
||
|
} else {
|
||
|
$mchOrderNo = StringHelper::generateBankCardOrderNo();
|
||
|
$nextStep = 'confirm-bind';
|
||
|
$bizData = $this->paymentService->bindCard($this->buildBindCardParams($mchOrderNo, $memberId, $name, $cardNo, $mobile, $bankCardNo, $app));
|
||
|
}
|
||
|
return $this->success([
|
||
|
'nextStep' => $nextStep,
|
||
|
'memberId' => $memberId,
|
||
|
'bizData' => $bizData
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
public function confirmBindCard(RequestInterface $request) {
|
||
|
$app = App::query()->orderBy('id', 'asc')->first();
|
||
|
$memberId = $request->input('memberId');
|
||
|
$smsNo = $request->input('smsNo');
|
||
|
$smsCode = $request->input('smsCode');
|
||
|
$bizData = $this->paymentService->bindCardConfirm($this->buildComfirmBindCardParams($memberId, $smsNo, $smsCode, $app));
|
||
|
return $this->success([
|
||
|
'memberId' => $memberId,
|
||
|
'bizData' => $bizData
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
public function confirmPay(RequestInterface $request) {
|
||
|
$app = App::query()->orderBy('id', 'asc')->first();
|
||
|
$memberId = $request->input('memberId');
|
||
|
$token = $request->input('token');
|
||
|
$protocol = $request->input('protocol');
|
||
|
$smsCode = $request->input('smsCode');
|
||
|
$bizData = $this->paymentService->protocolPayConfirm($this->buildConfirmPayParams($token, $protocol, $smsCode, $app));
|
||
|
return $this->success([
|
||
|
'memberId' => $memberId,
|
||
|
'bizData' => ['outTradeNo' => $bizData['outTradeNo']]
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
private function buildBindCardParams($mchOrderNo, $memberId, $name, $cardNo, $mobile, $bankCardNo, $app)
|
||
|
{
|
||
|
$params = [
|
||
|
'app_id' => $app->app_id,
|
||
|
'timestamp' => time(),
|
||
|
'nonce_str' => StringHelper::getRandomString(32),
|
||
|
'data' => json_encode([
|
||
|
'mchtOrderNo' => $mchOrderNo,
|
||
|
'memberId' => $memberId,
|
||
|
'userName' => $name,
|
||
|
'phoneNum' => $mobile,
|
||
|
'bankCardNo' => $bankCardNo,
|
||
|
'bankCardType' => 'debit',
|
||
|
'certificatesNo' => $cardNo,
|
||
|
]),
|
||
|
];
|
||
|
$sign = \App\Helper\Platform\Signer::sign($params, $app->app_key);
|
||
|
$params['sign'] = $sign;
|
||
|
return $params;
|
||
|
}
|
||
|
|
||
|
private function buildPrepayParams($memberId, $outTradeNo, $protocol, $amount, $app)
|
||
|
{
|
||
|
$params = [
|
||
|
'app_id' => $app->app_id,
|
||
|
'timestamp' => time(),
|
||
|
'nonce_str' => StringHelper::getRandomString(32),
|
||
|
'data' => json_encode([
|
||
|
'memberId' => $memberId,
|
||
|
'outTradeNo' => $outTradeNo,
|
||
|
'protocol' => $protocol,
|
||
|
'payAmount' => $amount,
|
||
|
]),
|
||
|
];
|
||
|
$sign = \App\Helper\Platform\Signer::sign($params, $app->app_key);
|
||
|
$params['sign'] = $sign;
|
||
|
return $params;
|
||
|
}
|
||
|
|
||
|
private function buildConfirmPayParams($token, $protocol, $smsCode, $app)
|
||
|
{
|
||
|
$params = [
|
||
|
'app_id' => $app->app_id,
|
||
|
'timestamp' => time(),
|
||
|
'nonce_str' => StringHelper::getRandomString(32),
|
||
|
'data' => json_encode([
|
||
|
'token' => $token,
|
||
|
'protocol' => $protocol,
|
||
|
'smsCode' => $smsCode,
|
||
|
]),
|
||
|
];
|
||
|
$sign = \App\Helper\Platform\Signer::sign($params, $app->app_key);
|
||
|
$params['sign'] = $sign;
|
||
|
return $params;
|
||
|
}
|
||
|
|
||
|
private function buildComfirmBindCardParams($memberId, $smsNo, $smsCode, $app)
|
||
|
{
|
||
|
$params = [
|
||
|
'app_id' => $app->app_id,
|
||
|
'timestamp' => time(),
|
||
|
'nonce_str' => StringHelper::getRandomString(32),
|
||
|
'data' => json_encode([
|
||
|
'memberId' => $memberId,
|
||
|
'smsNo' => $smsNo,
|
||
|
'smsCode' => $smsCode,
|
||
|
]),
|
||
|
];
|
||
|
$sign = \App\Helper\Platform\Signer::sign($params, $app->app_key);
|
||
|
$params['sign'] = $sign;
|
||
|
return $params;
|
||
|
}
|
||
|
|
||
|
public function orders(RequestInterface $request)
|
||
|
{
|
||
|
$page = $request->input('page', 1);
|
||
|
$pageSize = $request->input('pageSize', 20);
|
||
|
$token = $request->input('token');
|
||
|
|
||
|
$value = Redis::get('token:' . $token);
|
||
|
$users = $this->getUsers();
|
||
|
if (empty($value) || !isset($users[$value])) {
|
||
|
throw new UnauthorizedException();
|
||
|
}
|
||
|
|
||
|
$offset = ($page - 1) * $pageSize;
|
||
|
$orders = Order::query()->orderBy('id', 'desc')->offset($offset)->limit($pageSize)->get();
|
||
|
$protocols = $orders->pluck('protocol');
|
||
|
$bankCards = BankCard::whereIn('protocol', $protocols)->get();
|
||
|
$bankCards = $bankCards->keyBy('protocol');
|
||
|
|
||
|
$records = [];
|
||
|
foreach ($orders as $order) {
|
||
|
$bankCard = $bankCards[$order->protocol] ?? null;
|
||
|
$records[] = [
|
||
|
'out_order_no' => $order->out_order_no,
|
||
|
'payed_at' => $order->payed_at,
|
||
|
'status' => $order->status,
|
||
|
'amount' => number_format($order->amount / 100, 2, '.', ''),
|
||
|
'real_name' => $bankCard ? $bankCard->real_name : '',
|
||
|
'bank_card_no' => $bankCard ? $bankCard->bank_card_no : '',
|
||
|
'mobile' => $bankCard ? $bankCard->mobile : '',
|
||
|
'card_no' => $bankCard ? $bankCard->card_no : '',
|
||
|
'status_text' => $order->getStatusText(),
|
||
|
];
|
||
|
}
|
||
|
|
||
|
$total = Order::query()->count();
|
||
|
return $this->success([
|
||
|
'records' => $records,
|
||
|
'total' => $total,
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
public function login(RequestInterface $request)
|
||
|
{
|
||
|
$username = $request->input('username');
|
||
|
$password = $request->input('password');
|
||
|
|
||
|
if (empty($username) || empty($password)) {
|
||
|
throw new BusinessException('账号或密码错误');
|
||
|
}
|
||
|
|
||
|
$users = $this->getUsers();
|
||
|
|
||
|
if (isset($users[$username]) && $users[$username] === $password) {
|
||
|
$token = md5(microtime() . $username . $password);
|
||
|
Redis::set('token:' . $token, $username);
|
||
|
Redis::expire('token:' . $token, 60*60);
|
||
|
return $this->success(['token' => $token]);
|
||
|
}
|
||
|
throw new BusinessException('账号或密码错误');
|
||
|
}
|
||
|
|
||
|
private function getUsers() {
|
||
|
return [
|
||
|
'owx0tlx' => 'lSoLW28NxtMlxUazC8p',
|
||
|
'ioexlp2' => 'wwU8Ir3Xp0rxXssA9NV'
|
||
|
];
|
||
|
}
|
||
|
}
|