PC 网页支付(alipay.trade.page.pay)· 固定套餐 · Go(Gin)+GORM · 沙箱联调阶段。本文说清楚一笔支付的完整时序、「独立服务」与「集成进 jiu」的区别,以及独立服务要不要建库、存哪些数据。
alipay.trade.query 主动查单兜底。订单状态以「⑥验签通过 / ⑧查单成功」为准。
三个角色、五个核心接口,全程不需要客户登录:
out_trade_no、订单落库(待支付)、调 alipay.trade.page.pay 加签、返回跳转链接。alipay.trade.query 对待支付订单轮询,防回调丢失。两种落地方式,差别核心就一句话:要不要复用 jiu 已有的数据库和 JWT 鉴权后台。
| 独立服务(ai 下新建) | 集成进 jiu(jiu/backend 加模块) | |
|---|---|---|
| 代码位置 | /Users/wangjia/code/ai 下新建 pay/,独立 Go 进程 | jiu/backend 里加 handler/service/model/router |
| 数据库 | 自建一套(SQLite 单文件起步即可,或 MySQL) | 直接复用 jiu 的 GORM/MySQL,订单表加进去 |
| 鉴权后台 | 要自己做登录鉴权(或第一版不做后台) | 白送——复用 jiu 的 JWT 中间件 |
| 部署 | 单独一个二进制 + systemd,独立上线 | 跟 jiu 一起构建/部署,绑在一条流水线 |
| 耦合度 | 与 jiu 完全解耦,可给任意业务(如 yanmei)用 | 与 jiu 强耦合,jiu 是进销存系统,收款无关会让它变臃肿 |
| 适合 | 收款是独立业务、或要给多个项目复用 | 收款本就是 jiu 业务的一环(订单/客户都在 jiu 里) |
| 开发量 | 核心一致,多了「建库 + 鉴权(若要后台)」 | 核心一致,省掉建库和鉴权 |
不能「只下单不落库」,原因是支付的钱和安全全靠订单记录兜底:
| 为什么必须存 | 不存会怎样 |
|---|---|
| 回调核对金额防篡改 | ⑥ 收到通知时要拿订单原始金额比对,没存就无法判断金额是否被改 → 可被刷单 |
| 幂等防重复入账 | 支付宝会重发通知,没有订单状态记录就会重复发货/重复确认 |
| 查单对账兜底 | ⑧ 主动查单需要 out_trade_no,没存就无单可查,回调一丢就丢钱 |
| 给客户/商家看结果 | 结果页、订单列表、退款都要读订单,无库无从谈起 |
orders(核心,必建)| 字段 | 类型 | 说明 |
|---|---|---|
id | uint PK | 自增主键 |
out_trade_no | varchar · 唯一 | 商户订单号(我们生成,全局唯一),贯穿下单/回调/查单 |
subject | varchar | 套餐/商品名称(展示在收银台) |
amount | decimal(10,2) | 订单金额(元),回调时用它核对防篡改 |
status | varchar / enum | 待支付 / 已支付 / 已关闭 / 已退款 |
trade_no | varchar | 支付宝交易号(回调/查单回填) |
buyer_logon_id | varchar | 买家支付宝账号(可选,回调带回,脱敏存) |
paid_at | datetime | 支付完成时间(回调回填) |
product_id | uint | 指向套餐表(固定套餐场景) |
client_ip / remark | varchar | 下单来源 IP、备注(可选) |
created_at / updated_at | datetime | GORM 自动维护 |
products(固定套餐场景,建议建)固定商品/套餐就是从这张表来,避免金额写死在前端被篡改 —— 下单时金额一律以服务端这张表为准,不信任前端传来的价格。
| 字段 | 类型 | 说明 |
|---|---|---|
id | uint PK | 套餐 ID(前端只传这个) |
name | varchar | 套餐名(如「基础版 / 年付」) |
price | decimal(10,2) | 价格(元),服务端权威价格 |
description | varchar | 套餐说明 |
active | bool | 是否上架 |
sort | int | 展示排序 |
notify_logs(可选,建议)把每条异步通知的原始报文、验签结果、处理结果存一份,方便排查对账纠纷与审计。非必须,但出问题时极其有用。
out_trade_no 与 total_amount;trade_no 只处理一次;success,否则支付宝会按策略重发。
orders(+ 固定套餐再加 products),SQLite 起步零运维。定了「独立 / 集成」后,我就把它写成正式设计文档 + 实现计划,照 jiu 的 Go(Gin)+GORM 约定搭骨架,用支付宝沙箱跑通全链路。