You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.1 KiB
71 lines
2.1 KiB
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)
|
|
}
|
|
|