Browse Source

修改 bug

develop
王泽彦 5 months ago
parent
commit
71963feef3
  1. 28
      niucloud/app/api/controller/pay/Pay.php
  2. 8
      niucloud/app/api/route/pay.php
  3. 77
      niucloud/app/listener/pay/PayCreateListener.php
  4. 94
      niucloud/app/listener/pay/PaySuccessListener.php
  5. 122
      niucloud/app/service/api/pay/PayService.php

28
niucloud/app/api/controller/pay/Pay.php

@ -114,4 +114,32 @@ class Pay extends BaseApiController
return success('SUCCESS'); 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');
}
} }

8
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') Route::any('pay/qrcodenotify/order_id/:order_id', 'pay.Pay/qrcodeNotify')
->middleware(ApiChannel::class) ->middleware(ApiChannel::class)
->middleware(ApiLog::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'); Route::get('friendspay/info/:trade_type/:trade_id', 'pay.Pay/friendspayInfo');
})->middleware(ApiChannel::class) })->middleware(ApiChannel::class)
->middleware(ApiCheckToken::class) ->middleware(ApiCheckToken::class)
->middleware(ApiLog::class); ->middleware(ApiLog::class);
@ -44,5 +50,7 @@ Route::group('pay',function () {
//支付关闭 //支付关闭
Route::post('close', 'pay.Pay/close'); Route::post('close', 'pay.Pay/close');
Route::post('weappPay', 'pay.Pay/weappPay');
})->middleware(ApiChannel::class) })->middleware(ApiChannel::class)
->middleware(ApiLog::class); ->middleware(ApiLog::class);

77
niucloud/app/listener/pay/PayCreateListener.php

@ -1,77 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\listener\pay;
use app\model\order_table\OrderTable;
/**
* 支付单据创建事件
*/
class PayCreateListener
{
/**
* 处理支付创建事件
* @param array $params
* @return array|null
*/
public function handle(array $params)
{
$trade_type = $params['trade_type'] ?? '';
$trade_id = $params['trade_id'] ?? 0;
// 根据不同的业务类型处理支付创建
switch ($trade_type) {
case 'school_order_table':
return $this->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 ?? '课程')
];
}
}

94
niucloud/app/listener/pay/PaySuccessListener.php

@ -1,94 +0,0 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\listener\pay;
use app\service\core\pay\CoreAccountService;
use app\model\order_table\OrderTable;
use app\service\api\apiService\OrderTableService;
use think\facade\Log;
/**
* 支付异步回调事件
*/
class PaySuccessListener
{
public function handle(array $pay_info)
{
if (isset($pay_info['out_trade_no']) && !empty($pay_info['out_trade_no'])) {
//账单记录添加
(new CoreAccountService())->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());
}
}
}

122
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);
}
}
} }

Loading…
Cancel
Save