From ddc3e855d4b8229f851ff7338d0c2c2d818548c4 Mon Sep 17 00:00:00 2001 From: wong <106998207@qq.com> Date: Tue, 30 Sep 2025 14:47:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=9B=9E=E8=B0=83=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/controller/PaymentService.php | 187 +++++++++++------- Server/application/cunkebao/config/route.php | 1 + .../cunkebao/controller/TokensController.php | 40 ++-- 3 files changed, 143 insertions(+), 85 deletions(-) diff --git a/Server/application/common/controller/PaymentService.php b/Server/application/common/controller/PaymentService.php index e6fead6b..3d4f31eb 100644 --- a/Server/application/common/controller/PaymentService.php +++ b/Server/application/common/controller/PaymentService.php @@ -3,11 +3,10 @@ namespace app\common\controller; use app\chukebao\model\TokensCompany; +use app\chukebao\model\TokensRecord; use think\Db; use app\common\util\PaymentUtil; -use think\facade\Config; use think\facade\Env; -use think\facade\Log; use think\facade\Request; use app\common\model\Order; @@ -63,12 +62,12 @@ class PaymentService 'mchId' => $params['mch_id'], 'companyId' => isset($order['companyId']) ? $order['companyId'] : 0, 'userId' => isset($order['userId']) ? $order['userId'] : 0, - 'orderType' => isset($order['orderType']) ? $order['orderType'] : 1, + 'orderType' => isset($order['orderType']) ? $order['orderType'] : 1, 'status' => 0, 'goodsId' => isset($order['goodsId']) ? $order['goodsId'] : 0, 'goodsName' => isset($order['goodsName']) ? $order['goodsName'] : '', 'money' => isset($order['money']) ? $order['money'] : 0, - 'goodsSpecs' => isset($order['goodsSpecs']) ? json_encode($order['goodsSpecs'],256) : json_encode([]), + 'goodsSpecs' => isset($order['goodsSpecs']) ? json_encode($order['goodsSpecs'], 256) : json_encode([]), 'orderNo' => isset($order['orderNo']) ? $order['orderNo'] : '', 'ip' => Request::ip(), 'nonceStr' => isset($order['nonceStr']) ? $order['nonceStr'] : '', @@ -237,26 +236,7 @@ class PaymentService $order->payTime = $this->parsePayTime($time_end); $order->save(); //订单处理 - switch ($order['orderType']){ - case 1: - // 处理购买算力 - $token = TokensCompany::where(['companyId' => $order->companyId])->find(); - $goodsSpecs = json_decode($order->goodsSpecs,true); - if (!empty($token)){ - $token->tokens = $token->tokens + $goodsSpecs['tokens']; - $token->updateTime = time(); - $token->save(); - }else{ - $tokensCompany = new TokensCompany(); - $tokensCompany->companyId = $order->companyId; - $tokensCompany->tokens = $goodsSpecs['tokens']; - $tokensCompany->createTime = time(); - $tokensCompany->updateTime = time(); - $tokensCompany-> save(); - } - break; - } - + $this->processOrder($order); Db::commit(); return json_encode(['code' => 200, 'msg' => '付款成功']); } catch (\Exception $e) { @@ -290,19 +270,16 @@ class PaymentService * - transaction_id: string 平台交易号(与 out_trade_no 二选一) * @return \think\response\Json */ - public function queryOrder(array $query) + public function queryOrder($orderNo = '') { - $outTradeNo = $query['out_trade_no'] ?? ($query['orderNo'] ?? ''); - $transactionId = $query['transaction_id'] ?? ''; - - if ($outTradeNo === '' && $transactionId === '') { - return json(['code' => 422, 'msg' => '缺少查询参数:out_trade_no 或 transaction_id']); + if (empty($orderNo)) { + return json(['code' => 422, 'msg' => '订单号缺失']); } $params = [ 'service' => 'unified.trade.query', 'mch_id' => Env::get('payment.mchId'), - 'out_trade_no' => $outTradeNo ?: null, + 'out_trade_no' => $orderNo ?: null, 'nonce_str' => PaymentUtil::generateNonceStr(), 'sign_type' => 'MD5', ]; @@ -310,7 +287,7 @@ class PaymentService // 过滤空值后签名 $secret = Env::get('payment.key'); if (empty($secret)) { - return json(['code' => 500, 'msg' => '支付密钥未配置']); + return json_encode(['code' => 500, 'msg' => '支付密钥未配置']); } $filtered = []; @@ -322,7 +299,7 @@ class PaymentService $url = Env::get('payment.url'); if (empty($url)) { - return json(['code' => 500, 'msg' => '支付网关地址未配置']); + return json_encode(['code' => 500, 'msg' => '支付网关地址未配置']); } // 请求网关 @@ -331,57 +308,119 @@ class PaymentService $parsed = $this->parseXmlOrRaw($response); if (!is_array($parsed)) { - return json(['code' => 500, 'msg' => '响应解析失败', 'data' => $response]); + return json_encode(['code' => 500, 'msg' => '响应解析失败', 'data' => $response]); } - if (($parsed['status'] ?? '') !== '0') { - return json(['code' => 500, 'msg' => '通信失败:' . ($parsed['message'] ?? 'unknown')]); + if ($parsed['status'] != 0) { + return json_encode(['code' => 500, 'msg' => '通信失败']); } - if (($parsed['result_code'] ?? '') !== '0') { - return json(['code' => 200, 'msg' => '业务失败', 'data' => [ - 'err_code' => $parsed['err_code'] ?? '', - 'err_msg' => $parsed['err_msg'] ?? '', - ]]); - } - $tradeState = $parsed['trade_state'] ?? ''; - $resp = [ - 'trade_state' => $tradeState, - 'trade_state_desc' => $parsed['trade_state_desc'] ?? '', - 'transaction_id' => $parsed['transaction_id'] ?? '', - 'out_trade_no' => $parsed['out_trade_no'] ?? $outTradeNo, - 'total_fee' => isset($parsed['total_fee']) ? (int)$parsed['total_fee'] : null, - 'time_end' => $parsed['time_end'] ?? '', - 'buyer_logon_id' => $parsed['buyer_logon_id'] ?? '', - 'bank_type' => $parsed['bank_type'] ?? '', - ]; + if ($parsed['result_code'] == 0) { + $order = Order::where('orderNo', $orderNo)->lock(true)->find(); + if (empty($order)) { + return json_encode(['code' => 500, 'msg' => '订单不存在']); + } - // 若已支付,同步本地订单 - if ($tradeState === 'SUCCESS' && ($resp['out_trade_no'] ?? '') !== '') { - Db::startTrans(); - try { - /** @var Order|null $order */ + if ($order['status'] == 1) { + return json_encode(['code' => 200, 'msg' => '支付成功']); + } + + + $tradeState = $parsed['trade_state'] ?? ''; + $resp = [ + 'trade_state' => $tradeState, + 'trade_state_desc' => $parsed['trade_state_desc'] ?? '', + 'transaction_id' => $parsed['transaction_id'] ?? '', + 'out_trade_no' => $parsed['out_trade_no'] ?? $orderNo, + 'total_fee' => isset($parsed['total_fee']) ? (int)$parsed['total_fee'] : null, + 'time_end' => $parsed['time_end'] ?? '', + 'buyer_logon_id' => $parsed['buyer_logon_id'] ?? '', + 'bank_type' => $parsed['bank_type'] ?? '', + ]; + + // 若已支付,同步本地订单 + if ($tradeState == 'SUCCESS') { + Db::startTrans(); + try { + /** @var Order|null $order */ + $order = Order::where('orderNo', $resp['out_trade_no'])->lock(true)->find(); + if ($order) { + $paidAt = $this->parsePayTime($resp['time_end'] ?? '') ?: time(); + if ($order['status'] != 1) { + $order->save([ + 'status' => 1, + 'transactionId' => $resp['transaction_id'] ?? '', + 'payTime' => $paidAt, + 'updateTime' => time(), + ]); + } + } + //订单处理 + $this->processOrder($order); + Db::commit(); + return json_encode(['code' => 200, 'msg' => '支付成功'] ); + } catch (\Exception $e) { + Db::rollback(); + return json_encode(['code' => 500, 'msg' => '付款失败' . $e->getMessage()]); + } + }else{ $order = Order::where('orderNo', $resp['out_trade_no'])->lock(true)->find(); if ($order) { - $paidAt = $this->parsePayTime($resp['time_end'] ?? '') ?: time(); - if ((int)$order['status'] !== 1) { - $order->save([ - 'status' => 1, - 'transactionId' => $resp['transaction_id'] ?? '', - 'payTime' => $paidAt, - 'updateTime' => time(), - ]); - } + $order->status = 3; + $order->payInfo = $resp['trade_state_desc'] ?? ''; + $order->save(); } - Db::commit(); - } catch (\Throwable $e) { - Db::rollback(); - Log::error('[SwiftPass][query] update order exception: ' . $e->getMessage()); + return json_encode(['code' => 500, 'msg' => '支付失败', 'data' => $resp]); } + + }else{ + return json_encode(['code' => 500, 'msg' => '通信失败']); + } + } + + + public function processOrder($order = []) + { + if (empty($order)) { + return false; } - return json(['code' => 200, 'msg' => '查询成功', 'data' => $resp]); - } -} + switch ($order['orderType']) { + case 1: + // 处理购买算力 + $token = TokensCompany::where(['companyId' => $order->companyId])->find(); + $goodsSpecs = json_decode($order->goodsSpecs, true); + if (!empty($token)) { + $token->tokens = $token->tokens + $goodsSpecs['tokens']; + $token->updateTime = time(); + $token->save(); + $newTokens = $token->tokens; + } else { + $tokensCompany = new TokensCompany(); + $tokensCompany->companyId = $order->companyId; + $tokensCompany->tokens = $goodsSpecs['tokens']; + $tokensCompany->createTime = time(); + $tokensCompany->updateTime = time(); + $tokensCompany->save(); + $newTokens = $tokensCompany->tokens; + } + //添加记录 + $record = new TokensRecord(); + $record->companyId = $order->companyId; + $record->userId = $order->userId; + $record->type = 1; + $record->form = 5; + $record->wechatAccountId = 0; + $record->friendIdOrGroupId = 0; + $record->remarks = '购买算力【'.$goodsSpecs['name'].'】'; + $record->tokens = $goodsSpecs['tokens']; + $record->balanceTokens = $newTokens; + $record->createTime = time(); + $record->save(); + break; + } + return true; + } +} \ No newline at end of file diff --git a/Server/application/cunkebao/config/route.php b/Server/application/cunkebao/config/route.php index 860e3e2b..22e08ca9 100644 --- a/Server/application/cunkebao/config/route.php +++ b/Server/application/cunkebao/config/route.php @@ -147,6 +147,7 @@ Route::group('v1/', function () { Route::group('tokens', function () { Route::get('list', 'app\cunkebao\controller\TokensController@getList'); Route::post('pay', 'app\cunkebao\controller\TokensController@pay'); + Route::get('queryOrder', 'app\cunkebao\controller\TokensController@queryOrder'); }); diff --git a/Server/application/cunkebao/controller/TokensController.php b/Server/application/cunkebao/controller/TokensController.php index a3e482fb..9c4ace64 100644 --- a/Server/application/cunkebao/controller/TokensController.php +++ b/Server/application/cunkebao/controller/TokensController.php @@ -3,6 +3,7 @@ namespace app\cunkebao\controller; use app\common\controller\PaymentService; +use app\common\model\Order; use app\cunkebao\model\TokensPackage; use library\ResponseHelper; use think\facade\Env; @@ -41,13 +42,13 @@ class TokensController extends BaseController return ResponseHelper::error('套餐和自定义购买金额必须选一个'); } - if (!empty($id)){ + if (!empty($id)) { $package = TokensPackage::where(['id' => $id, 'status' => 1, 'isDel' => 0])->find(); if (empty($package)) { return ResponseHelper::error('套餐不存在或者已禁用'); } - if ($package['price'] <= 0){ + if ($package['price'] <= 0) { return ResponseHelper::error('套餐金额异常'); } @@ -58,9 +59,9 @@ class TokensController extends BaseController 'tokens' => $package['tokens'], ]; - }else{ + } else { //获取配置的tokens比例 - $tokens_multiple = Env::get('payment.tokens_multiple',28); + $tokens_multiple = Env::get('payment.tokens_multiple', 28); $specs = [ 'id' => 0, 'name' => '自定义购买算力', @@ -83,15 +84,32 @@ class TokensController extends BaseController $paymentService = new PaymentService(); $res = $paymentService->createOrder($order); $res = json_decode($res, true); - if ($res['code'] == 200){ - return ResponseHelper::success(['orderNo' => $orderNo,'code_url' => $res['data']],'订单创建成功'); - }else{ + if ($res['code'] == 200) { + return ResponseHelper::success(['orderNo' => $orderNo, 'code_url' => $res['data']], '订单创建成功'); + } else { return ResponseHelper::error($res['msg']); } - - - } - + public function queryOrder() + { + $orderNo = $this->request->param('orderNo', ''); + $order = Order::where('orderNo', $orderNo)->find(); + if (!$order) { + return ResponseHelper::error('该订单不存在'); + } + if ($order->status != 1) { + $paymentService = new PaymentService(); + $res = $paymentService->queryOrder($orderNo); + $res = json_decode($res, true); + if ($res['code'] == 200) { + return ResponseHelper::success('','订单已支付'); + } else { + $errorMsg = !empty($order['payInfo']) ? $order['payInfo'] : '订单未支付'; + return ResponseHelper::error($errorMsg); + } + } else { + return ResponseHelper::success('','订单已支付'); + } + } } \ No newline at end of file