package payment import ( "context" "net/http" ) // Channel 是一个「真渠道」充值适配器(设计见 PAYMENT_DESIGN.md §3)。 // 兑换码不走这里(无「待支付」态,核销即入账);本接口面向需要下单-回调/查单确认的渠道。 // 接新渠道(支付宝/Stripe)= 实现这四个方法 + 在 Manager 注册,不动上层充值/入账骨架。 // // 刻意用基本类型入参(orderID/amountFen)而非 *store.PaymentOrder:让 payment 包不反向依赖 // store,渠道适配层保持纯粹。金额一律以「分」为单位、服务端锁定值,绝不信任客户端。 type Channel interface { // Name 渠道名,与 store.Channel*("wechat"/"alipay"/"stripe")一致,用于按订单渠道路由。 Name() string // CreatePay 依据订单生成支付凭据(微信 Native 出 code_url;支付宝/Stripe 可出跳转 URL)。 CreatePay(ctx context.Context, orderID, description string, amountFen int64) (PayIntent, error) // QueryOrder 主动查单(前端轮询确认 + 掉单补偿共用)。 QueryOrder(ctx context.Context, orderID string) (PayResult, error) // VerifyCallback 验签并解析渠道回调 → 统一结果。验签失败必须返回 error(回调路由公开,签名是唯一门)。 VerifyCallback(req *http.Request) (PayResult, error) } // 渠道名常量(与 store.Channel* 取值一致;此处独立定义以免 payment 反依赖 store)。 const ( ChannelWechat = "wechat" ChannelAlipay = "alipay" // 预留:未实现 ChannelStripe = "stripe" // 预留:未实现 ) // PayIntent 是下单后给前端的支付凭据(不同渠道形态不同,按需取用)。 type PayIntent struct { CodeURL string // 微信 Native:二维码内容。其它渠道可放跳转 URL / client_secret。 } // PayResult 是查单/回调验签解析后的统一结果(各渠道适配器把自家响应归一到这里)。 type PayResult struct { OrderID string // 商户订单号(out_trade_no) ChannelTxn string // 渠道流水号(transaction_id),入账时落库备查 Paid bool // 支付成功 Closed bool // 关单/撤销/支付失败等终态 AmountFen int64 // 用户实付(分);供与订单金额核对,防金额被篡改 }