240 lines
6.8 KiB
Markdown
240 lines
6.8 KiB
Markdown
# 支付网关集成实现总结
|
||
|
||
## 已完成的工作
|
||
|
||
### 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)
|