优化结构
This commit is contained in:
+8
-6
@@ -78,7 +78,7 @@ PayPal `AUTHORIZE` 意图后的授权捕获,以及账单、分账、转账等
|
||||
|
||||
| Provider | 实现方式 |
|
||||
| --- | --- |
|
||||
| `alipay`、`alipay-v3`、`wechat-v2`、`wechat-v3`、`apple-iap`、`paypal`、`douyin`、`qq`、`allinpay`、`lakala`、`saobei` | 统一走上面的 GoPay v1.5.122 adapter;业务层只接收 `biz.PaymentResult` |
|
||||
| `alipay`、`alipay-v3`、`wechat-v2`、`wechat-v3`、`apple-iap`、`paypal`、`douyin`、`qq`、`allinpay`、`lakala`、`saobei` | 统一走上面的 GoPay v1.5.122 adapter;业务层只接收 `paymentbiz.PaymentResult` |
|
||||
| `chinaums` | 配置驱动的银联商务 JSON 签名适配器 |
|
||||
| `sft` | 配置驱动的商福通 JSON/MD5 适配器 |
|
||||
| `supper-pay` | 配置驱动的 Supper Pay HMAC 适配器 |
|
||||
@@ -131,18 +131,20 @@ PayPal `AUTHORIZE` 意图后的授权捕获,以及账单、分账、转账等
|
||||
每个业务模块先实现可信订单来源:
|
||||
|
||||
```go
|
||||
import paymentbiz "kra/internal/biz/payment"
|
||||
|
||||
type GameItemPayment struct {
|
||||
orders GameItemOrderRepo
|
||||
}
|
||||
|
||||
func (GameItemPayment) Type() string { return "game_item" }
|
||||
|
||||
func (p GameItemPayment) PreparePayment(ctx context.Context, provider, tradeNo, businessID string) (*biz.PaymentIntent, error) {
|
||||
func (p GameItemPayment) PreparePayment(ctx context.Context, provider, tradeNo, businessID string) (*paymentbiz.PaymentIntent, error) {
|
||||
order, err := p.orders.FindPayable(ctx, businessID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &biz.PaymentIntent{
|
||||
return &paymentbiz.PaymentIntent{
|
||||
Provider: provider, TradeNo: tradeNo,
|
||||
BusinessType: "game_item", BusinessID: businessID,
|
||||
Subject: order.Title, Amount: order.PayableAmount, Currency: order.Currency,
|
||||
@@ -153,7 +155,7 @@ func (p GameItemPayment) PreparePayment(ctx context.Context, provider, tradeNo,
|
||||
然后注册按业务类型分发的发货处理器:
|
||||
|
||||
```go
|
||||
func (p GameItemPayment) Fulfill(ctx context.Context, c *biz.PaymentConfirmation) error {
|
||||
func (p GameItemPayment) Fulfill(ctx context.Context, c *paymentbiz.PaymentConfirmation) error {
|
||||
return p.orders.Transaction(ctx, func(tx GameItemOrderTx) error {
|
||||
// confirmation_id 必须有唯一约束。已处理时直接返回 nil。
|
||||
if tx.HasPaymentConfirmation(c.ID) {
|
||||
@@ -166,7 +168,7 @@ func (p GameItemPayment) Fulfill(ctx context.Context, c *biz.PaymentConfirmation
|
||||
})
|
||||
}
|
||||
|
||||
func (p GameItemPayment) AuthorizeRefund(ctx context.Context, order *biz.PaymentOrder, amount int64) error {
|
||||
func (p GameItemPayment) AuthorizeRefund(ctx context.Context, order *paymentbiz.PaymentOrder, amount int64) error {
|
||||
return p.orders.CheckRefundable(ctx, order.BusinessID, amount)
|
||||
}
|
||||
```
|
||||
@@ -405,4 +407,4 @@ Chinaums、SFT、Supper Pay、微信小游戏和抖音小游戏没有在代码
|
||||
|
||||
## 日志
|
||||
|
||||
支付日志在 `internal/biz/payment_log.go` 通过 `PaymentLogger` 独立抽象,包含下单、查单失败、回调查单、金额校验、重复回调和发货结果等结构化事件。日志只记录渠道、商户订单号、业务类型、业务 ID、确认 ID 等审计字段,不记录私钥、密钥、证书内容或完整敏感回调原文。
|
||||
支付日志在 `internal/biz/payment/payment_log.go` 通过 `PaymentLogger` 独立抽象,包含下单、查单失败、回调查单、金额校验、重复回调和发货结果等结构化事件。日志只记录渠道、商户订单号、业务类型、业务 ID、确认 ID 等审计字段,不记录私钥、密钥、证书内容或完整敏感回调原文。
|
||||
|
||||
@@ -10,10 +10,10 @@
|
||||
| --- | --- | --- |
|
||||
| HTTP JSON 响应契约 | `pkg/httpx` | `Response`、`PageResult`、状态码和 Gin 响应助手;`server/httpx/response.go` 仅保留 system 适配。 |
|
||||
| protobuf JSON 局部合并 | `pkg/protoutil` | 与业务无关的字段归一化和局部反序列化;初始化直接使用公共包。 |
|
||||
| 支付 provider/mode 标识 | `pkg/paymentkit` | provider 常量、支持列表、金额/签名/JSON 等跨模块协议;system `biz` 只保留兼容别名。 |
|
||||
| 支付回调 ACK | `pkg/paymentkit` | 回调应答、失败包装和默认 provider 应答;具体渠道 SDK 仍留在 system integration。 |
|
||||
| WebSocket 通用收发 | `pkg/websocket` | Melody 的连接、事件、点对点发送、广播和会话查询封装;system integration 管理配置与生命周期。 |
|
||||
| 消息队列 | `pkg/mq` | Broker 无关的发布、订阅、JSON 和 QoS 接口;EMQX/Paho 与 RabbitMQ/AMQP 客户端由 system integration 管理。 |
|
||||
| 支付 provider/mode 标识 | `pkg/paymentkit` | provider 常量、支持列表、金额/签名/JSON 等跨模块协议;`biz/payment` 与 `biz/integration` 直接复用。 |
|
||||
| 支付回调 ACK | `pkg/paymentkit` | 回调应答、失败包装和默认 provider 应答;具体渠道 SDK 留在 `internal/integration/payment`。 |
|
||||
| WebSocket 通用收发 | `pkg/websocket` | Melody 的连接、事件、点对点发送、广播和会话查询封装;`internal/integration` 管理配置与生命周期。 |
|
||||
| 消息队列 | `pkg/mq` | Broker 无关的发布、订阅、JSON 和 QoS 接口;EMQX/Paho 与 RabbitMQ/AMQP 客户端由 `internal/integration` 管理。 |
|
||||
| 模块、任务和迁移协议 | `pkg/module`、`pkg/task`、`pkg/database/migration` | 供不同业务模块注册贡献,不带 system 业务语义。 |
|
||||
|
||||
## system 内部保留边界
|
||||
@@ -21,7 +21,10 @@
|
||||
- `app`:组合根,汇总各模块的迁移、菜单、路由和任务贡献。
|
||||
- `modules/system`:system 模块的 Definition,声明迁移、管理面和默认任务。
|
||||
- `modules/payment`:payment 模块的 Definition,声明支付迁移和支付管理面。
|
||||
- `biz`:用户、权限、菜单、审计、任务、支付订单和系统配置等领域模型与用例。
|
||||
- `biz/system`:用户、权限、菜单、审计、媒体和系统配置等系统领域模型与用例。
|
||||
- `biz/payment`:支付订单、支付流程、支付接口和支付日志。
|
||||
- `biz/integration`:支付/消息队列/WebSocket 集成配置定义与校验。
|
||||
- `biz/task`:定时任务模型、任务用例和任务注册协议。
|
||||
- `conf`:system 配置 proto、运行时快照和生成代码。
|
||||
- `data`:数据库连接、PO、仓储、system 表、支付持久化和配置 watcher。
|
||||
- `initialize`:首次安装、配置迁移、种子编排和运行时重载。
|
||||
@@ -40,7 +43,11 @@
|
||||
internal/
|
||||
app/ # 组合根和 catalog
|
||||
modules/ # 业务模块定义及其模块级贡献
|
||||
biz/ # DO、usecase、repo interface
|
||||
biz/
|
||||
system/ # 系统领域
|
||||
payment/ # 支付领域
|
||||
integration/# 集成配置领域
|
||||
task/ # 定时任务领域
|
||||
conf/ # 配置 proto/runtime
|
||||
data/ # PO、repo、数据库和迁移
|
||||
initialize/ # 首次安装和配置编排
|
||||
|
||||
Reference in New Issue
Block a user