# 订单系统 - 支付网关集成 ## 功能说明 订单支付功能已升级为调用真实的支付网关,而不是直接标记为已支付。 支持的支付方式: - ✅ **支付宝支付** (Alipay) - ✅ **微信支付** (WeChat Pay) --- ## 前端实现 ### 支付API 在 `admin/src/api/order.ts` 中添加了两个支付网关API: ```typescript // 支付宝支付 export function alipayPay(params: any) { return request.post({ url: '/order.order/alipay', params }) } // 微信支付 export function wechatPay(params: any) { return request.post({ url: '/order.order/wechat', params }) } ``` ### 支付流程 在 `confirmPay()` 方法中实现了支付流程: ```typescript const confirmPay = async () => { // 1. 验证参数 if (payForm.value.payType === 'supplement' && !payForm.value.supplement_order_no) { feedback.msgWarning('请输入支付订单号') return } // 2. 准备支付参数 let payParams: any = {} if (payForm.value.payType === 'normal') { payParams = { id: payForm.value.order_id, order_no: payForm.value.order_no, amount: payForm.value.amount, payment_method: payForm.value.payment_method } } else { payParams = { order_no: payForm.value.supplement_order_no, payment_method: payForm.value.payment_method, is_supplement: 1 } } // 3. 调用对应的支付网关 let payResult: any if (payForm.value.payment_method === 'alipay') { payResult = await alipayPay(payParams) } else if (payForm.value.payment_method === 'wechat') { payResult = await wechatPay(payParams) } // 4. 处理支付结果 if (payResult && payResult.pay_url) { if (payForm.value.payment_method === 'alipay') { // 支付宝:跳转到支付页面 window.location.href = payResult.pay_url } else if (payForm.value.payment_method === 'wechat') { // 微信:显示二维码 feedback.msgSuccess('请扫描二维码进行支付') } } } ``` --- ## 后端实现 ### 控制器 在 `OrderController` 中添加了两个支付网关端点: #### 支付宝支付 ```php /** * @notes 支付宝支付 * @return \think\response\Json */ public function alipay() { $params = (new OrderValidate())->post()->goCheck('pay'); // 获取订单信息 $order = $this->getOrderByParams($params); if (!$order) { return $this->fail('订单不存在'); } // 调用支付宝支付接口 $payUrl = OrderLogic::alipayPay($order); if (!$payUrl) { return $this->fail(OrderLogic::getError()); } return $this->data(['pay_url' => $payUrl]); } ``` #### 微信支付 ```php /** * @notes 微信支付 * @return \think\response\Json */ public function wechat() { $params = (new OrderValidate())->post()->goCheck('pay'); // 获取订单信息 $order = $this->getOrderByParams($params); if (!$order) { return $this->fail('订单不存在'); } // 调用微信支付接口 $payData = OrderLogic::wechatPay($order); if (!$payData) { return $this->fail(OrderLogic::getError()); } return $this->data($payData); } ``` ### 业务逻辑 在 `OrderLogic` 中添加了支付网关方法: #### 支付宝支付 ```php /** * @notes 支付宝支付 * @param $order * @return string|false */ public static function alipayPay($order) { try { $payUrl = self::generateAlipayUrl($order); return $payUrl; } catch (\Exception $e) { self::setError($e->getMessage()); return false; } } /** * @notes 生成支付宝支付URL * @param $order * @return string */ private static function generateAlipayUrl($order): string { // TODO: 集成支付宝SDK $alipayConfig = [ 'app_id' => config('pay.alipay.app_id'), 'merchant_private_key' => config('pay.alipay.merchant_private_key'), 'alipay_public_key' => config('pay.alipay.alipay_public_key'), ]; // 生成支付URL $payUrl = 'https://openapi.alipay.com/gateway.do?' . http_build_query([ 'app_id' => $alipayConfig['app_id'], 'method' => 'alipay.trade.page.pay', 'charset' => 'UTF-8', 'sign_type' => 'RSA2', 'timestamp' => date('Y-m-d H:i:s'), 'version' => '1.0', 'notify_url' => config('app.url') . '/api/order/alipay-notify', 'return_url' => config('app.url') . '/order', 'biz_content' => json_encode([ 'out_trade_no' => $order->order_no, 'product_code' => 'FAST_INSTANT_TRADE_PAY', 'total_amount' => $order->amount, 'subject' => '订单支付', 'body' => '订单号:' . $order->order_no, ]), ]); return $payUrl; } ``` #### 微信支付 ```php /** * @notes 微信支付 * @param $order * @return array|false */ public static function wechatPay($order) { try { $payData = self::generateWechatPayData($order); return $payData; } catch (\Exception $e) { self::setError($e->getMessage()); return false; } } /** * @notes 生成微信支付数据 * @param $order * @return array */ private static function generateWechatPayData($order): array { // TODO: 集成微信SDK $wechatConfig = [ 'app_id' => config('pay.wechat.app_id'), 'mch_id' => config('pay.wechat.mch_id'), 'api_key' => config('pay.wechat.api_key'), ]; // 生成微信支付数据 $payData = [ 'appid' => $wechatConfig['app_id'], 'mch_id' => $wechatConfig['mch_id'], 'nonce_str' => uniqid(), 'body' => '订单支付', 'out_trade_no' => $order->order_no, 'total_fee' => (int)($order->amount * 100), 'spbill_create_ip' => request()->ip(), 'notify_url' => config('app.url') . '/api/order/wechat-notify', 'trade_type' => 'NATIVE', ]; return [ 'pay_url' => 'https://api.mch.weixin.qq.com/pay/unifiedorder', 'pay_data' => $payData, 'qrcode' => 'https://api.mch.weixin.qq.com/qrcode', ]; } ``` --- ## 配置说明 ### 支付宝配置 在 `config/pay.php` 中配置支付宝参数: ```php 'alipay' => [ 'app_id' => 'your_alipay_app_id', 'merchant_private_key' => 'your_merchant_private_key', 'alipay_public_key' => 'your_alipay_public_key', ], ``` ### 微信配置 在 `config/pay.php` 中配置微信参数: ```php 'wechat' => [ 'app_id' => 'your_wechat_app_id', 'mch_id' => 'your_mch_id', 'api_key' => 'your_api_key', ], ``` --- ## API 端点 ### 支付宝支付 ```bash POST /order.order/alipay { "id": 1, "payment_method": "alipay" } ``` **响应**: ```json { "code": 0, "msg": "success", "data": { "pay_url": "https://openapi.alipay.com/gateway.do?..." } } ``` ### 微信支付 ```bash POST /order.order/wechat { "id": 1, "payment_method": "wechat" } ``` **响应**: ```json { "code": 0, "msg": "success", "data": { "pay_url": "https://api.mch.weixin.qq.com/pay/unifiedorder", "pay_data": {...}, "qrcode": "https://api.mch.weixin.qq.com/qrcode" } } ``` --- ## 支付流程 ### 支付宝支付流程 1. 用户选择支付宝支付 2. 前端调用 `/order.order/alipay` 接口 3. 后端生成支付宝支付URL 4. 前端跳转到支付宝支付页面 5. 用户完成支付 6. 支付宝回调 `/api/order/alipay-notify` 接口 7. 后端更新订单状态为已支付 ### 微信支付流程 1. 用户选择微信支付 2. 前端调用 `/order.order/wechat` 接口 3. 后端生成微信支付数据 4. 前端显示二维码 5. 用户扫描二维码完成支付 6. 微信回调 `/api/order/wechat-notify` 接口 7. 后端更新订单状态为已支付 --- ## 待实现 以下功能需要根据实际的支付SDK进行实现: 1. **支付宝SDK集成** - 集成支付宝官方SDK - 实现签名和验证 - 处理支付回调 2. **微信SDK集成** - 集成微信官方SDK - 实现签名和验证 - 处理支付回调 3. **支付回调处理** - 创建 `/api/order/alipay-notify` 接口 - 创建 `/api/order/wechat-notify` 接口 - 验证回调签名 - 更新订单状态 4. **支付状态查询** - 创建支付状态查询接口 - 定期检查支付状态 --- ## 相关文件 ### 前端 - `admin/src/views/order/index.vue` - 订单列表页面 - `admin/src/api/order.ts` - 订单API接口 ### 后端 - `server/app/adminapi/controller/order/OrderController.php` - 订单控制器 - `server/app/adminapi/logic/order/OrderLogic.php` - 订单业务逻辑 --- ## 版本信息 - **功能版本**: 1.5.0 - **实现日期**: 2026-03-10 - **功能类型**: 支付网关集成 - **状态**: ✅ 框架完成(待SDK集成) --- **框架实现完成** ✅