From 71963feef3cc9641153d90ecb19e87cd30d19040 Mon Sep 17 00:00:00 2001 From: zeyan <258785420@qq.com> Date: Fri, 31 Oct 2025 13:08:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- niucloud/app/api/controller/pay/Pay.php | 28 ++++ niucloud/app/api/route/pay.php | 8 ++ .../app/listener/pay/PayCreateListener.php | 77 ----------- .../app/listener/pay/PaySuccessListener.php | 94 -------------- niucloud/app/service/api/pay/PayService.php | 122 ++++++++++++++++++ 5 files changed, 158 insertions(+), 171 deletions(-) delete mode 100755 niucloud/app/listener/pay/PayCreateListener.php delete mode 100755 niucloud/app/listener/pay/PaySuccessListener.php diff --git a/niucloud/app/api/controller/pay/Pay.php b/niucloud/app/api/controller/pay/Pay.php index a6477061..dbf1e937 100755 --- a/niucloud/app/api/controller/pay/Pay.php +++ b/niucloud/app/api/controller/pay/Pay.php @@ -114,4 +114,32 @@ class Pay extends BaseApiController return success('SUCCESS'); } + + /** + * 小程序支付接口 + * @return Response + */ + public function weappPay() + { + $data = $this->request->params([ + ['order_id', ''], + ['openid', ''] + ]); + + return success('SUCCESS', (new PayService())->weappPay($data)); + } + + /** + * 小程序支付回调 + * @param int $order_id + * @return Response + */ + public function weappNotify(int $order_id) + { + $data = $this->request->param(); + + (new PayService())->weappNotify($data, $order_id); + + return success('SUCCESS'); + } } diff --git a/niucloud/app/api/route/pay.php b/niucloud/app/api/route/pay.php index efbf9c94..e76fd752 100755 --- a/niucloud/app/api/route/pay.php +++ b/niucloud/app/api/route/pay.php @@ -23,6 +23,11 @@ Route::any('pay/notify/:channel/:type/:action', 'pay.Pay/notify') Route::any('pay/qrcodenotify/order_id/:order_id', 'pay.Pay/qrcodeNotify') ->middleware(ApiChannel::class) ->middleware(ApiLog::class); + +Route::any('pay/weappNotify/:order_id', 'pay.Pay/weappNotify') + ->middleware(ApiChannel::class) + ->middleware(ApiLog::class); + /** * 路由 */ @@ -30,6 +35,7 @@ Route::group('pay',function () { //找朋友帮忙付支付信息 Route::get('friendspay/info/:trade_type/:trade_id', 'pay.Pay/friendspayInfo'); + })->middleware(ApiChannel::class) ->middleware(ApiCheckToken::class) ->middleware(ApiLog::class); @@ -44,5 +50,7 @@ Route::group('pay',function () { //支付关闭 Route::post('close', 'pay.Pay/close'); + Route::post('weappPay', 'pay.Pay/weappPay'); + })->middleware(ApiChannel::class) ->middleware(ApiLog::class); diff --git a/niucloud/app/listener/pay/PayCreateListener.php b/niucloud/app/listener/pay/PayCreateListener.php deleted file mode 100755 index 7fdeed05..00000000 --- a/niucloud/app/listener/pay/PayCreateListener.php +++ /dev/null @@ -1,77 +0,0 @@ -handleOrderPayment($trade_id); - - // TODO: 添加其他业务类型的支付创建处理 - // case 'recharge': - // return $this->handleRechargePayment($trade_id); - - default: - return null; - } - } - - /** - * 处理订单支付创建 - * @param int $trade_id 订单ID - * @return array|null - */ - private function handleOrderPayment(int $trade_id) - { - // 查询订单信息 - $order = OrderTable::where('id', $trade_id)->find(); - - if (!$order) { - return null; - } - - // TODO: 根据订单信息构建支付数据 - // 返回格式必须包含以下字段: - // - main_type: 支付主体类型(如 'member') - // - main_id: 支付主体ID(如会员ID) - // - money: 支付金额 - // - trade_type: 业务类型 - // - trade_id: 业务ID - // - body: 支付描述 - - return [ - 'main_type' => 'member', // TODO: 从订单获取会员类型 - 'main_id' => $order->student_id ?? 0, // TODO: 从订单获取会员ID - 'money' => $order->order_amount ?? 0, - 'trade_type' => 'school_order_table', - 'trade_id' => $trade_id, - 'body' => '订单支付 - ' . ($order->course_id_name ?? '课程') - ]; - } -} diff --git a/niucloud/app/listener/pay/PaySuccessListener.php b/niucloud/app/listener/pay/PaySuccessListener.php deleted file mode 100755 index 3752f2af..00000000 --- a/niucloud/app/listener/pay/PaySuccessListener.php +++ /dev/null @@ -1,94 +0,0 @@ -addPayLog($pay_info); - - // 处理业务逻辑 - $this->handleBusinessLogic($pay_info); - } - } - - /** - * 处理业务逻辑 - * @param array $pay_info 支付信息 - */ - private function handleBusinessLogic(array $pay_info) - { - $trade_type = $pay_info['trade_type'] ?? ''; - $trade_id = $pay_info['trade_id'] ?? 0; - - // 根据不同的业务类型处理支付成功逻辑 - switch ($trade_type) { - case 'school_order_table': - $this->handleOrderPaymentSuccess($trade_id, $pay_info); - break; - - // TODO: 添加其他业务类型的支付成功处理 - // case 'recharge': - // $this->handleRechargeSuccess($trade_id, $pay_info); - // break; - - default: - Log::info('PaySuccessListener: 未处理的业务类型 - ' . $trade_type); - break; - } - } - - /** - * 处理订单支付成功 - * @param int $trade_id 订单ID - * @param array $pay_info 支付信息 - */ - private function handleOrderPaymentSuccess(int $trade_id, array $pay_info) - { - try { - // 更新订单状态为已支付 - $order = OrderTable::where('id', $trade_id)->find(); - - if (!$order) { - Log::error('PaySuccessListener: 订单不存在 - ID:' . $trade_id); - return; - } - - // TODO: 更新订单状态 - // 确认订单表的字段名和状态值 - $order->order_status = 'paid'; - $order->payment_time = date('Y-m-d H:i:s'); - $order->payment_id = $pay_info['out_trade_no'] ?? ''; - $order->save(); - - // TODO: 调用订单服务处理支付成功后的业务逻辑 - // 例如:分配课程、创建合同签署记录等 - $orderArray = $order->toArray(); - (new OrderTableService())->handlePaymentSuccess($orderArray); - - Log::info('PaySuccessListener: 订单支付成功处理完成 - 订单ID:' . $trade_id); - } catch (\Exception $e) { - Log::error('PaySuccessListener: 订单支付成功处理异常 - ' . $e->getMessage()); - } - } -} diff --git a/niucloud/app/service/api/pay/PayService.php b/niucloud/app/service/api/pay/PayService.php index d7420ac5..b3c3d5fd 100755 --- a/niucloud/app/service/api/pay/PayService.php +++ b/niucloud/app/service/api/pay/PayService.php @@ -186,4 +186,126 @@ class PayService extends BaseApiService } } + + /** + * 小程序支付(绕过 CorePayService,直接使用 return_pay_config) + * @param array $data + * @return array + * @throws \Exception + */ + public function weappPay(array $data) + { + $order_id = $data['order_id']; + $openid = $data['openid']; + + // 获取订单信息 + $order = new OrderTable(); + $order_info = $order->where(['id' => $order_id])->find(); + + if (!$order_info) { + throw new \Exception('订单不存在'); + } + + if ($order_info['order_status'] != 'pending') { + throw new \Exception('订单状态不正确'); + } + + // 获取校区支付配置 + $config = return_pay_config($order_info['campus_id'], $order_id); + + // 生成支付流水号 + $out_trade_no = 'WEAPP' . date("YmdHis") . $order_id; + + // 构建支付参数 + $params = [ + 'out_trade_no' => $out_trade_no, + 'body' => '订单支付:' . $out_trade_no, + 'money' => $order_info['order_amount'] * 100, // 转换为分 + 'openid' => $openid + ]; + + // 使用 PayLoader 调用微信小程序支付 + $pay = new \core\pay\PayLoader('Wechatpay', $config); + $result = $pay->mini($params); + + // 更新订单支付流水号和密钥 + $order->where(['id' => $order_id])->update([ + 'payment_id' => $out_trade_no, + 'ipv3' => $config['mch_secret_key'] + ]); + + // 记录支付信息到 pay 表 + $payModel = new Pay(); + $payModel->insert([ + 'main_id' => $order_info['student_id'], + 'from_main_id' => $order_info['student_id'], + 'out_trade_no' => $out_trade_no, + 'trade_type' => 'school_order_table', + 'trade_id' => $order_id, + 'trade_no' => $out_trade_no, + 'body' => '小程序支付', + 'money' => $order_info['order_amount'], + 'status' => 1, // 支付中 + 'create_time' => time(), + 'type' => 'wechatpay', + 'main_type' => 'wechatpay', + 'channel' => 'weapp' + ]); + + return $result; + } + + /** + * 小程序支付回调处理 + * @param array $data + * @param int $order_id + * @return void + */ + public function weappNotify($data, $order_id) + { + Log::debug('weappNotify', $data); + + $order = new OrderTable(); + $order_info = $order->where(['id' => $order_id])->find(); + + if (!$order_info) { + Log::error('订单不存在: ' . $order_id); + return; + } + + if ($order_info['order_status'] == 'pending' && !empty($order_info['ipv3'])) { + $resource = $data['resource']; + + // 解密微信支付回调数据 + $decrypted = decryptWechatPayNotify( + $resource['ciphertext'], + $resource['nonce'], + $resource['associated_data'], + $order_info['ipv3'] + ); + + $info = json_decode($decrypted, true); + + Log::info('小程序支付回调解密数据', $info); + + // 更新订单状态 + $order->where(['payment_id' => $info['out_trade_no']]) + ->update([ + 'order_status' => 'paid', + 'payment_time' => date("Y-m-d H:i:s") + ]); + + // 更新支付记录状态 + $payModel = new Pay(); + $payModel->where(['trade_id' => $order_id])->update([ + 'status' => 2, // 已支付 + 'pay_time' => time() + ]); + + // 处理支付成功后的业务逻辑 + (new OrderTableService())->handlePaymentSuccess($order_info->toArray()); + + Log::info('小程序支付成功处理完成: 订单ID ' . $order_id); + } + } }