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

6.8 KiB
Raw Blame History

支付网关集成实现总结

已完成的工作

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 文件中添加:

# 支付宝配置
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

需要执行的数据库迁移

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

参考资源