Files
qitongxue-api/api/user/v1/member.go
2026-09-29 15:48:13 +08:00

123 lines
5.2 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 v1
import "github.com/gogf/gf/v2/frame/g"
// ============================================================================
// 会员购买(微信小程序虚拟支付 · 道具直购)
// ============================================================================
// MemberPlanOut 可购买的会员套餐
type MemberPlanOut struct {
PlanKey string `json:"plan_key"`
Name string `json:"name"`
Subtitle string `json:"subtitle"`
LevelKey string `json:"level_key"`
DurationDays int `json:"duration_days"`
PriceCents int64 `json:"price_cents"` // 单位:分
ProductId string `json:"product_id"`
Badge string `json:"badge"`
}
// MemberLevelOut 等级权益(用于前端渲染权益对比)
type MemberLevelOut struct {
LevelKey string `json:"level_key"`
Name string `json:"name"`
Modules []string `json:"modules"`
ModuleNames []string `json:"module_names"`
IsCurrent bool `json:"is_current"`
}
// MemberStateOut 我的会员状态
type MemberStateOut struct {
IsMember bool `json:"is_member"`
LevelKey string `json:"level_key"`
LevelName string `json:"level_name"`
ExpireAt string `json:"expire_at"` // 空串表示永久或未开通
DaysLeft int `json:"days_left"`
Modules []string `json:"modules"`
}
// MemberCenterReq 会员中心
type MemberCenterReq struct {
g.Meta `path:"/member/center" method:"get" tags:"member" summary:"会员中心(套餐 + 会员状态 + 权益)"`
}
type MemberCenterRes struct {
Plans []MemberPlanOut `json:"plans"`
Levels []MemberLevelOut `json:"levels"`
State MemberStateOut `json:"state"`
Notices []string `json:"notices"`
XpayReady bool `json:"xpay_ready"` // 服务端虚拟支付参数是否已配置
Quotas []QuotaToolOut `json:"quotas"` // 各工具额度(会员权益页据此展示提升幅度)
Packs []QuotaPackOut `json:"packs"` // 次数包通用档位
PeriodDays int `json:"period_days"` // 当前生效的额度重置周期
}
// MemberOrderCreateReq 创建会员订单(**只建单**,N1-1/2)。
//
// Code 保留以兼容旧客户端但**非必传**:建单不再校验「支付人 = 登录人」(该校验前移到
// POST /member/order/pay)。两步式的第一步只负责落一条待支付订单。
type MemberOrderCreateReq struct {
g.Meta `path:"/member/order" method:"post" tags:"member" summary:"创建会员订单(待支付,不返回支付参数)"`
PlanKey string `v:"required#请选择会员套餐" json:"plan_key"`
Code string `json:"code"`
// Platform 客户端平台(uni.getSystemInfoSync().platform:ios/android/devtools/h5)。
// 缺省时服务端按 User-Agent 兜底推断;ios → pay_channel=apple(iOS 走 App Store IAP,
// 开发者无法主动退款,后台据此禁用 API 退款)。
Platform string `json:"platform"`
}
// MemberOrderCreateRes 创建会员订单响应(只建单,**不返回支付参数**;N1-1/2)。
//
// 支付参数由独立端点 POST /member/order/pay 构建(见 order.go 的 MemberOrderPayRes)。
// Reused=true 表示命中「同用户 + 同套餐 + 待支付」的既有单(N1-10),保证待支付单恒为 1 条。
type MemberOrderCreateRes struct {
OutTradeNo string `json:"out_trade_no"`
Reused bool `json:"reused"`
OriginPriceCents int64 `json:"origin_price_cents"`
PaidPriceCents int64 `json:"paid_price_cents"`
Status int `json:"status"`
}
// MemberOrderCheckReq 查询订单状态(前端支付成功回调后轮询;同时承担兜底发货)
type MemberOrderCheckReq struct {
g.Meta `path:"/member/order/check" method:"post" tags:"member" summary:"查询会员订单状态"`
OutTradeNo string `v:"required#订单号不能为空" json:"out_trade_no"`
}
type MemberOrderCheckRes struct {
Status int `json:"status"`
Delivered bool `json:"delivered"`
State MemberStateOut `json:"state"`
}
// MemberOrdersReq 我的会员订单
type MemberOrdersReq struct {
g.Meta `path:"/member/orders" method:"get" tags:"member" summary:"我的会员订单"`
Limit int `json:"limit"`
}
type MemberOrderOut struct {
OutTradeNo string `json:"out_trade_no"`
OrderType int `json:"order_type"` // 1=会员套餐 2=次数包
PlanKey string `json:"plan_key"`
PlanName string `json:"plan_name"`
PackKey string `json:"pack_key"`
Title string `json:"title"` // 统一展示标题(套餐名 / 次数包名)
ToolKey string `json:"tool_key"`
ToolName string `json:"tool_name"`
Times int `json:"times"`
PriceCents int64 `json:"price_cents"`
Status int `json:"status"`
StatusText string `json:"status_text"`
PayChannel string `json:"pay_channel"`
CreatedAt string `json:"created_at"`
DeliveredAt string `json:"delivered_at"`
// ===== T04.6 优惠凭证(响应 snake_case)=====
OriginPriceCents int64 `json:"origin_price_cents"`
PaidPriceCents int64 `json:"paid_price_cents"`
PromoCode string `json:"promo_code"`
DiscountCents int64 `json:"discount_cents"`
PromoKind int `json:"promo_kind"`
}
type MemberOrdersRes struct {
List []MemberOrderOut `json:"list"`
}