Files
junhong_cmp_fiber/internal/model/dto/client_order_dto.go
huang 56adc30409 task: 完成支付宝C端入口
新增支付宝支付方式支持:
- DTO:ClientPaymentLink、ClientPayOrderRequest/Response 增加 alipay;ClientCreateOrderRequest 增加 payment_method;ClientCreateOrderResponse 增加 payment_link;ClientCreateRechargeRequest 允许 alipay,app_type 改为微信必填;ClientRechargeResponse PayConfig 改为可选指针,增加 payment_link
- Service(client_order):PayOrder 新增 alipay 分支(不需要 app_type/OpenID,复用或新建 pending payment,生成 WAP URL);CreateOrder 强充路径按 payment_method 分支,alipay 不需要 app_type/OpenID;幂等命中时支付宝强充返回同一充值单对应的 payment_link;新增 getOrBuildAlipayPaymentLink(过期 payment 自动续建);新增 createAlipayForceRechargeOrder(事务创建充值单+支付单,WAP URL 生成失败则标记 failed)
- Handler(client_wallet):CreateRecharge 移除微信唯一限制,按 payment_method 分发到 createWechatRecharge / createAlipayRecharge;alipay 分支事务内创建充值单+支付单,然后生成 WAP URL,失败标记 payment failed
- 依赖 worker-1 共享 API:pkg/alipay.BuildWapPayURL/CalcExpireAt、Payment.ExpireAt、WechatConfig.AliReturnURL/AliPayExpireMinutes、PaymentStore.FindLatestPendingByOrderAndMethod;本 worktree 暂不能独立构建,待 leader 集成

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 14:07:20 +08:00

155 lines
9.4 KiB
Go
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.
package dto
// ========================================
// D1 客户端创建订单
// ========================================
// ClientCreateOrderRequest D1 客户端创建订单请求
type ClientCreateOrderRequest struct {
Identifier string `json:"identifier" validate:"required,min=1,max=50" required:"true" minLength:"1" maxLength:"50" description:"资产标识符SN/IMEI/虚拟号/ICCID/MSISDN"`
PackageIDs []uint `json:"package_ids" validate:"required,min=1,dive,gt=0" required:"true" description:"套餐ID列表"`
// PaymentMethod 指定支付方式强充场景必传。wechat 时 app_type 也必传alipay 时不需要 app_type
PaymentMethod string `json:"payment_method" validate:"omitempty,oneof=wechat alipay" description:"支付方式(强充必传)(wechat:微信, alipay:支付宝)"`
// AppType 仅强充 + 微信支付场景必传;支付宝强充无需传
AppType string `json:"app_type" validate:"omitempty,oneof=official_account miniapp" description:"应用类型(微信强充必传)(official_account:公众号, miniapp:小程序)"`
}
// ClientCreateOrderResponse D1 客户端创建订单响应
type ClientCreateOrderResponse struct {
OrderType string `json:"order_type" description:"订单类型 (package:套餐订单, recharge:充值订单)"`
Order *ClientOrderInfo `json:"order,omitempty" description:"套餐订单信息(普通下单时返回,无支付参数,需单独调支付接口)"`
Recharge *ClientRechargeInfo `json:"recharge,omitempty" description:"充值订单信息"`
PayConfig *ClientPayConfig `json:"pay_config,omitempty" description:"微信支付配置(强充微信支付时返回)"`
PaymentLink *ClientPaymentLink `json:"payment_link,omitempty" description:"支付宝支付链接(强充支付宝支付时返回)"`
LinkedPackageInfo *LinkedPackageInfo `json:"linked_package_info,omitempty" description:"关联套餐信息"`
Idempotent bool `json:"idempotent,omitempty" description:"幂等标志true 表示返回的是已存在的待支付充值订单)"`
}
// ClientOrderInfo D1 套餐订单信息
type ClientOrderInfo struct {
OrderID uint `json:"order_id" description:"订单ID"`
OrderNo string `json:"order_no" description:"订单号"`
TotalAmount int64 `json:"total_amount" description:"订单总金额(分)"`
PaymentStatus int `json:"payment_status" description:"支付状态 (1:待支付, 2:已支付, 3:已取消, 4:已退款)"`
PaymentStatusName string `json:"payment_status_name" description:"支付状态名称(中文)"`
CreatedAt string `json:"created_at" description:"创建时间"`
}
// ClientRechargeInfo D1 充值订单信息
type ClientRechargeInfo struct {
RechargeID uint `json:"recharge_id" description:"充值ID"`
RechargeNo string `json:"recharge_no" description:"充值单号"`
Amount int64 `json:"amount" description:"充值金额(分)"`
Status int `json:"status" description:"状态 (0:待支付, 1:已支付, 2:已关闭)"`
StatusName string `json:"status_name" description:"状态名称(中文)"`
AutoPurchaseStatus string `json:"auto_purchase_status" description:"自动购包状态"`
}
// ClientPayConfig 微信支付配置
type ClientPayConfig struct {
AppID string `json:"app_id" description:"应用ID"`
Timestamp string `json:"timestamp" description:"时间戳"`
NonceStr string `json:"nonce_str" description:"随机字符串"`
PackageVal string `json:"package" description:"预支付参数"`
SignType string `json:"sign_type" description:"签名类型"`
PaySign string `json:"pay_sign" description:"支付签名"`
}
// LinkedPackageInfo D1 关联套餐信息
type LinkedPackageInfo struct {
PackageNames []string `json:"package_names" description:"套餐名称列表"`
TotalPackageAmount int64 `json:"total_package_amount" description:"套餐总金额(分)"`
ForceRechargeAmount int64 `json:"force_recharge_amount" description:"强制充值金额(分)"`
WalletCredit int64 `json:"wallet_credit" description:"钱包抵扣金额(分)"`
}
// ========================================
// D2 客户端订单列表
// ========================================
// ClientOrderListRequest D2 客户端订单列表请求
type ClientOrderListRequest struct {
Identifier string `json:"identifier" query:"identifier" validate:"required,min=1,max=50" required:"true" minLength:"1" maxLength:"50" description:"资产标识符SN/IMEI/虚拟号/ICCID/MSISDN"`
PaymentStatus *int `json:"payment_status" query:"payment_status" validate:"omitempty,min=1,max=4" minimum:"1" maximum:"4" description:"支付状态 (1:待支付, 2:已支付, 3:已取消, 4:已退款)"`
Page int `json:"page" query:"page" validate:"required,min=1" required:"true" minimum:"1" description:"页码"`
PageSize int `json:"page_size" query:"page_size" validate:"required,min=1,max=100" required:"true" minimum:"1" maximum:"100" description:"每页数量"`
}
// ClientOrderListItem D2 客户端订单列表项
type ClientOrderListItem struct {
OrderID uint `json:"order_id" description:"订单ID"`
OrderNo string `json:"order_no" description:"订单号"`
TotalAmount int64 `json:"total_amount" description:"订单总金额(分)"`
PaymentStatus int `json:"payment_status" description:"支付状态 (1:待支付, 2:已支付, 3:已取消, 4:已退款)"`
PaymentStatusName string `json:"payment_status_name" description:"支付状态名称(中文)"`
CreatedAt string `json:"created_at" description:"创建时间"`
PackageNames []string `json:"package_names" description:"套餐名称列表"`
}
// ClientOrderListResponse D2 客户端订单列表响应
type ClientOrderListResponse struct {
List []ClientOrderListItem `json:"items" description:"订单列表"`
Total int64 `json:"total" description:"总数"`
Page int `json:"page" description:"页码"`
PageSize int `json:"size" description:"每页数量"`
}
// ========================================
// D3 客户端订单详情
// ========================================
// ClientOrderDetailResponse D3 客户端订单详情响应
type ClientOrderDetailResponse struct {
OrderID uint `json:"order_id" description:"订单ID"`
OrderNo string `json:"order_no" description:"订单号"`
TotalAmount int64 `json:"total_amount" description:"订单总金额(分)"`
PaymentStatus int `json:"payment_status" description:"支付状态 (1:待支付, 2:已支付, 3:已取消, 4:已退款)"`
PaymentStatusName string `json:"payment_status_name" description:"支付状态名称(中文)"`
PaymentMethod string `json:"payment_method" description:"支付方式"`
CreatedAt string `json:"created_at" description:"创建时间"`
PaidAt *string `json:"paid_at,omitempty" description:"支付时间"`
CompletedAt *string `json:"completed_at,omitempty" description:"完成时间"`
Packages []ClientOrderPackageItem `json:"packages" description:"订单套餐列表"`
}
// ClientOrderPackageItem D3 订单套餐项
type ClientOrderPackageItem struct {
PackageID uint `json:"package_id" description:"套餐ID"`
PackageName string `json:"package_name" description:"套餐名称"`
PackageType string `json:"package_type" description:"套餐类型 (formal:正式套餐, addon:加油包)"`
Price int64 `json:"price" description:"单价(分)"`
Quantity int `json:"quantity" description:"数量"`
}
// ========================================
// D4 订单支付
// ========================================
// ClientPaymentLink C 端支付宝支付链接
type ClientPaymentLink struct {
PaymentNo string `json:"payment_no" description:"支付单号"`
QRLink string `json:"qr_link" description:"二维码内容链接,前端用该链接生成二维码"`
CopyLink string `json:"copy_link" description:"复制到普通浏览器打开的支付链接(与 qr_link 相同)"`
PayExpireAt string `json:"pay_expire_at" description:"支付链接过期时间RFC3339 格式)"`
}
// ClientPayOrderRequest D4 订单支付请求
type ClientPayOrderRequest struct {
PaymentMethod string `json:"payment_method" validate:"required,oneof=wallet wechat alipay" required:"true" description:"支付方式 (wallet:钱包, wechat:微信, alipay:支付宝)"`
// AppType 仅 payment_method=wechat 时必填alipay 无需传
AppType string `json:"app_type" validate:"omitempty,oneof=official_account miniapp" description:"应用类型(微信支付必传)(official_account:公众号, miniapp:小程序)"`
}
// ClientPayOrderResponse D4 订单支付响应
type ClientPayOrderResponse struct {
PaymentMethod string `json:"payment_method" description:"支付方式"`
PayConfig *ClientPayConfig `json:"pay_config,omitempty" description:"微信支付配置payment_method=wechat 时返回)"`
PaymentLink *ClientPaymentLink `json:"payment_link,omitempty" description:"支付宝支付链接payment_method=alipay 时返回)"`
}
// ClientPayOrderParams D4 订单支付文档参数(路径参数 + 请求体,仅供文档生成器使用)
type ClientPayOrderParams struct {
IDReq
ClientPayOrderRequest
}