package alipay import ( "context" "errors" "net/url" ) type ( // 预支付响应参数(返回给Flutter客户端) AppPayParams struct { AppID string `json:"appid"` // 应用ID PartnerID string `json:"partnerid"` // 商户号 PrepayID string `json:"prepayid"` // 预支付ID Package string `json:"package"` // 固定值 "Sign=WXPay" NonceStr string `json:"noncestr"` // 随机字符串 TimeStamp string `json:"timestamp"` // 时间戳(秒) Sign string `json:"sign"` // 支付签名 } ISys interface { GenerateOrderNo(prefix string) string CreateAppOrder(ctx context.Context, outTradeNo string, totalFee int64, description string, notifyurl string) (result string, err error) DecryptWxPayNotify(values url.Values) (bool, error) } ) var defsys ISys // ErrNotInited 支付宝未初始化。OnInit 失败时调用方可选择降级;此时包级函数返回本错误,而不是 panic。 var ErrNotInited = errors.New("alipay 未初始化:配置缺失或密钥加载失败") func OnInit(config map[string]interface{}, option ...Option) error { sys, err := newSys(newOptions(config, option...)) if err != nil { // 出错时不要给 defsys 赋值:newSys 出错时 sys 仍是非 nil 的 *Alipay(client 可能为 nil), // 装进接口后 defsys != nil,守卫失效、调用时在 client 上 nil 解引用。 return err } defsys = sys return nil } func NewSys(option ...Option) (ISys, error) { sys, err := newSys(newOptionsByOption(option...)) if err != nil { return nil, err } return sys, nil } func GenerateOrderNo(prefix string) string { if defsys == nil { return "" } return defsys.GenerateOrderNo(prefix) } func CreateAppOrder(ctx context.Context, outTradeNo string, totalFee int64, description string, notifyurl string) (result string, err error) { if defsys == nil { return "", ErrNotInited } return defsys.CreateAppOrder(ctx, outTradeNo, totalFee, description, notifyurl) } func DecryptWxPayNotify(values url.Values) (bool, error) { if defsys == nil { return false, ErrNotInited } return defsys.DecryptWxPayNotify(values) }