# 支付与订单闭环实现指南 ## 📦 已完成的前端实现 ### 1. 支付 API 模块 (`app/api/payment/index.ts`) 提供统一的支付接口封装: ```typescript import { createWechatJsapiPay, // 微信 JSAPI 支付 createWechatH5Pay, // 微信 H5 支付 createWechatNativePay, // 微信 Native 扫码支付 createAlipayPay, // 支付宝网页支付 queryPayStatus, // 查询支付状态 detectPayEnvironment, // 检测支付环境 isWechatBrowser, // 检测微信浏览器 isAlipayBrowser // 检测支付宝浏览器 } from '@/api/payment' ``` ### 2. 支付组件 (`app/components/payment/PaymentModal.vue`) 开箱即用的支付弹窗组件,支持: - **微信 JSAPI** - 微信内置浏览器调起微信支付 - **微信 H5** - 非微信浏览器跳转微信H5支付页面 - **微信 Native** - 扫码支付,显示二维码 - **支付宝 WAP** - 跳转支付宝支付页面 - **余额支付** - 平台余额直接扣款 使用方式: ```vue ``` ### 3. 订单页面集成 (`app/pages/orders.vue`) 已完善 `goPay()`、`applyRefund()`、`cancelOrder()` 功能: - 点击"去支付"打开支付弹窗 - 点击"申请退款"弹出确认框 - 点击"取消订单"弹出确认框 --- ## 🔧 后端需要实现的接口 ### 1. 微信 JSAPI 支付 ``` POST /api/system/wx-jsapi-pay/unified-order ``` **请求参数:** ```json { "orderNo": "订单号", "openId": "用户 OpenId", "subject": "商品描述", "body": "商品详情", "totalAmount": 100, // 金额(分) "returnUrl": "支付完成跳转URL" } ``` **返回参数:** ```json { "code": 0, "data": { "prepayId": "预支付交易会话标识", "codeUrl": "公众号 AppId", "mwebUrl": "H5支付链接" } } ``` ### 2. 微信 H5 支付 ``` POST /api/system/wx-h5-pay/unified-order ``` **请求参数:** 同 JSAPI **返回参数:** ```json { "code": 0, "data": { "mwebUrl": "https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?..." } } ``` ### 3. 微信 Native 支付 ``` POST /api/system/wx-native-pay/unified-order ``` **返回参数:** ```json { "code": 0, "data": { "codeUrl": "weixin://wxpay/bizpayurl?..." } } ``` ### 4. 支付宝网页支付 ``` POST /api/system/alipay/unified-order ``` **请求参数:** ```json { "orderNo": "订单号", "subject": "商品标题", "body": "商品描述", "totalAmount": 100, // 金额(元) "returnUrl": "支付完成跳转URL" } ``` **返回参数:** ```json { "code": 0, "data": { "paymentUrl": "https://openapi.alipay.com/gateway.do?..." } } ``` ### 5. 查询支付状态 ``` GET /api/system/payment/query-status?orderNo=xxx ``` **返回参数:** ```json { "code": 0, "data": { "paid": true, "payStatus": 1, "orderStatus": 1, "payTime": "2024-01-01 12:00:00", "transactionId": "微信/支付宝交易号" } } ``` ### 6. 取消订单 ``` POST /api/system/order/cancel ``` **请求参数:** ```json { "orderId": 123 } ``` ### 7. 申请退款 ``` POST /api/system/order/refund ``` **请求参数:** ```json { "orderId": 123, "reason": "退款原因" } ``` --- ## 🔐 微信支付配置 ### 1. 微信商户平台配置 登录 [微信商户平台](https://pay.weixin.qq.com),获取以下信息: | 配置项 | 说明 | |--------|------| | AppID | 公众号应用ID | | MchID | 商户号 | | API Key | APIv2 密钥 | | APIv3 Key | APIv3 密钥 | | 证书 | 商户证书(用于退款等敏感操作) | | AppSecret | 公众号应用密钥 | ### 2. 后端配置示例 ```yaml # application.yml wechat: pay: app-id: wx1234567890abcdef mch-id: 1234567890 api-key: xxxxxxxx api-v3-key: xxxxxxxx notify-url: https://your-domain.com/api/payment/notify refund-url: https://your-domain.com/api/payment/refund-notify cert-path: /path/to/apiclient_cert.p12 ``` ### 3. JSAPI 支付配置 需要在微信公众平台配置: - **JS接口安全域名** - 发起支付的页面域名 - **网页授权域名** - 用于获取 OpenId --- ## 🔐 支付宝配置 ### 1. 支付宝开放平台配置 登录 [支付宝开放平台](https://open.alipay.com),创建应用并获取: | 配置项 | 说明 | |--------|------| | AppID | 应用ID | | PrivateKey | 应用私钥 | | AlipayPublicKey | 支付宝公钥 | ### 2. 后端配置示例 ```yaml # application.yml alipay: app-id: 2021000000000000 private-key: xxxxxxxx alipay-public-key: xxxxxxxx notify-url: https://your-domain.com/api/payment/alipay-notify return-url: https://your-domain.com/api/payment/alipay-return ``` --- ## 📋 支付流程 ### 微信 JSAPI 支付流程 ``` ┌─────────────┐ │ 用户下单 │ └──────┬──────┘ ▼ ┌─────────────┐ │ 后端创建订单 │ └──────┬──────┘ ▼ ┌─────────────────────────────────────┐ │ 前端调用 createWechatJsapiPay │ │ (传入 openId、订单信息) │ └──────┬────────────────────────────┘ ▼ ┌─────────────┐ │ 后端统一下单 │ │ 返回 prepayId │ └──────┬──────┘ ▼ ┌─────────────┐ │ 前端调起 │ │ WeixinJSBridge │ └──────┬──────┘ ▼ ┌─────────────┐ │ 用户输入密码 │ │ 完成支付 │ └──────┬──────┘ ▼ ┌─────────────────────────────────────┐ │ 微信回调后端 + 前端轮询 queryPayStatus │ └──────┬────────────────────────────┘ ▼ ┌─────────────┐ │ 显示支付成功 │ └─────────────┘ ``` ### 支付结果通知 后端需要实现支付结果回调: ``` POST /api/system/payment/notify (微信) POST /api/system/payment/alipay-notify (支付宝) ``` 收到回调后: 1. 验证签名 2. 更新订单状态 3. 返回 success 给支付方 --- ## 🎯 快速开始 ### 1. 完成后端接口 按照"后端需要实现的接口"章节实现各个支付接口。 ### 2. 配置密钥 在微信商户平台和支付宝开放平台完成配置,获取必要的密钥。 ### 3. 更新 API 路径 如果后端接口路径与设计不同,更新 `app/api/payment/index.ts` 中的接口路径。 ### 4. 测试支付 1. 启动前端:`pnpm dev` 2. 登录后进入订单页面 3. 点击"去支付"测试支付流程 --- ## 📝 注意事项 ### 1. 金额单位 - **前端传给后端**:元(保留2位小数)或 分(整数) - **微信/支付宝**:通常使用**分** - 建议前端统一传元,后端转为分 ### 2. 订单号 - 建议使用业务方生成的唯一订单号 - 避免重复支付 - 建议格式:`PAY + 时间戳 + 随机数` ### 3. 回调通知 - 必须实现支付结果回调 - 回调地址需要公网可访问 - 注意防止重复处理 ### 4. 安全建议 - 所有支付相关接口需要登录验证 - 金额计算在后端完成 - 签名验证在前端不做,后端完成 --- ## 🔗 相关资源 - [微信支付开发文档](https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml) - [支付宝支付文档](https://opendocs.alipay.com/open/270) - [JSSDK 使用说明](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html)