Files
zyt/admin/PAYMENT_IMPLEMENTATION_SUMMARY.md
T
2026-03-11 14:33:49 +08:00

240 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 支付网关集成实现总结
## 已完成的工作
### 1. 后端实现
#### 配置文件
- ✅ 创建 `server/config/pay.php` - 支付配置文件
- 支付宝配置(app_id, 商户私钥, 支付宝公钥等)
- 微信支付配置(app_id, 商户号, API密钥等)
#### 业务逻辑(OrderLogic.php
-`alipayPay()` - 调用支付宝支付
-`wechatPay()` - 调用微信支付
-`generateAlipayUrl()` - 生成支付宝支付URL
- 使用 RSA2 签名算法
- 支持配置化的网关地址
- 支持补单支付(无需校验订单)
-`generateWechatPayData()` - 生成微信支付数据
- 使用 MD5 签名算法
- 支持二维码支付(NATIVE
- 支持补单支付(无需校验订单)
-`generateAlipaySign()` - 生成支付宝签名
-`generateWechatSign()` - 生成微信签名
-`generateNonceStr()` - 生成随机字符串
#### 回调处理
- ✅ 创建 `server/app/adminapi/controller/order/AlipayNotifyController.php`
- 处理支付宝异步通知
- 验证签名
- 验证金额
- 更新订单状态
- ✅ 创建 `server/app/adminapi/controller/order/WechatNotifyController.php`
- 处理微信异步通知
- 验证签名
- 验证金额
- 更新订单状态
#### 控制器(OrderController.php
-`alipay()` - 支付宝支付接口
- 支持正常支付和补单支付
- 返回支付URL
-`wechat()` - 微信支付接口
- 支持正常支付和补单支付
- 返回支付数据
#### 数据库
- ✅ 更新 `admin/order.sql`
- 添加 `trade_no` 字段用于存储第三方交易号
- 移除 `bank` 支付方式注释
#### 模型(Order.php
- ✅ 修复 `patient()` 关系
- 正确指向 `Diagnosis` 模型
- 使用正确的外键关系
### 2. 前端实现
#### API 定义(admin/src/api/order.ts
-`alipayPay()` - 调用支付宝支付API
-`wechatPay()` - 调用微信支付API
#### 支付流程(admin/src/views/order/index.vue
- ✅ 支付类型选择(正常支付/补单支付)
- ✅ 支付方式选择(支付宝/微信)
- ✅ 补单支付订单号输入
- ✅ 支付确认逻辑
- 调用对应的支付网关
- 支付宝:跳转到支付页面
- 微信:显示二维码或其他处理
- 支付完成后刷新订单列表
### 3. 文档
-`admin/PAYMENT_GATEWAY_INTEGRATION.md` - 支付网关集成指南
- 环境配置说明
- 支付流程说明
- 支付宝集成步骤
- 微信支付集成步骤
- 后端实现说明
- 前端实现说明
- 常见问题解答
- 安全建议
- 测试清单
-`admin/PAYMENT_MIGRATION.md` - 数据库迁移指南
- SQL迁移脚本
- 执行步骤
- 验证方法
- 回滚方法
## 支付流程说明
### 正常支付流程
```
用户点击支付 → 选择支付方式 → 确认支付
前端调用 /order.order/alipay 或 /order.order/wechat
后端生成支付链接/数据
前端跳转到支付页面或显示二维码
用户完成支付
支付网关回调 /api/order/alipay-notify 或 /api/order/wechat-notify
后端验证签名并更新订单状态为"已支付"
```
### 补单支付流程
```
用户选择补单支付 → 输入支付订单号 → 选择支付方式 → 确认支付
前端调用支付接口,参数中 is_supplement=1
后端不校验订单是否存在,直接生成支付链接/数据
前端跳转到支付页面或显示二维码
用户完成支付
支付网关回调更新订单状态
```
## 需要配置的环境变量
`.env` 文件中添加:
```env
# 支付宝配置
ALIPAY_APP_ID=your_app_id
ALIPAY_MERCHANT_PRIVATE_KEY=your_merchant_private_key
ALIPAY_PUBLIC_KEY=your_alipay_public_key
ALIPAY_NOTIFY_URL=https://yourdomain.com/api/order/alipay-notify
ALIPAY_RETURN_URL=https://yourdomain.com/order
ALIPAY_GATEWAY_URL=https://openapi.alipay.com/gateway.do
# 微信支付配置
WECHAT_APP_ID=your_app_id
WECHAT_MCH_ID=your_mch_id
WECHAT_API_KEY=your_api_key
WECHAT_NOTIFY_URL=https://yourdomain.com/api/order/wechat-notify
WECHAT_GATEWAY_URL=https://api.mch.weixin.qq.com
```
## 需要执行的数据库迁移
```sql
ALTER TABLE `la_order` ADD COLUMN `trade_no` varchar(100) DEFAULT NULL COMMENT '第三方交易号' AFTER `payment_time`;
```
## 文件清单
### 新增文件
- `server/config/pay.php` - 支付配置
- `server/app/adminapi/controller/order/AlipayNotifyController.php` - 支付宝回调处理
- `server/app/adminapi/controller/order/WechatNotifyController.php` - 微信回调处理
- `admin/PAYMENT_GATEWAY_INTEGRATION.md` - 集成指南
- `admin/PAYMENT_MIGRATION.md` - 迁移指南
- `admin/PAYMENT_IMPLEMENTATION_SUMMARY.md` - 实现总结
### 修改文件
- `server/app/adminapi/logic/order/OrderLogic.php` - 添加支付逻辑
- `server/app/adminapi/controller/order/OrderController.php` - 已有支付接口
- `server/app/common/model/Order.php` - 修复关系
- `admin/order.sql` - 添加 trade_no 字段
- `admin/src/api/order.ts` - 已有支付API
- `admin/src/views/order/index.vue` - 已有支付UI
## 下一步工作
### 1. 配置环境变量
- 获取支付宝和微信的密钥
-`.env` 文件中配置
### 2. 执行数据库迁移
- 运行SQL添加 `trade_no` 字段
### 3. 测试支付流程
- 在沙箱环境测试支付宝支付
- 在沙箱环境测试微信支付
- 测试补单支付功能
- 测试回调处理
### 4. 部署到生产环境
- 更新生产环境的环境变量
- 执行数据库迁移
- 测试生产环境的支付流程
## 安全检查清单
- [ ] 密钥已正确配置在环境变量中
- [ ] 回调地址已在支付网关中配置
- [ ] 签名验证已正确实现
- [ ] 金额验证已正确实现
- [ ] 异常处理已正确实现
- [ ] 日志记录已正确实现
- [ ] HTTPS已启用
- [ ] 防火墙已允许回调
## 常见问题
### Q: 如何测试支付功能?
A: 使用支付宝和微信提供的沙箱环境进行测试。在 `.env` 中配置沙箱网关地址。
### Q: 如何处理支付失败?
A: 前端会显示错误提示,用户可以重新尝试支付。后端会记录错误日志。
### Q: 如何处理重复支付?
A: 通过订单号的唯一性约束和支付状态检查来防止重复支付。
### Q: 如何处理回调超时?
A: 支付网关会重试回调。后端应实现幂等性处理。
## 技术细节
### 支付宝签名算法
- 使用 RSA2 算法
- 参数按字母顺序排序
- 使用商户私钥签名
- 使用支付宝公钥验证
### 微信签名算法
- 使用 MD5 算法
- 参数按字母顺序排序
- 添加 API Key
- 计算 MD5 哈希值
### 金额处理
- 支付宝:使用元为单位
- 微信:使用分为单位(需要乘以100)
## 参考资源
- [支付宝开放平台](https://open.alipay.com/)
- [微信商户平台](https://pay.weixin.qq.com/)
- [支付宝支付接口文档](https://opendocs.alipay.com/)
- [微信支付接口文档](https://pay.weixin.qq.com/wiki)