package payment import ( "encoding/json" "eta/eta_mini_ht_api/common/component/cache" logger "eta/eta_mini_ht_api/common/component/log" "eta/eta_mini_ht_api/common/utils/redis" "fmt" "github.com/google/uuid" "github.com/mitchellh/mapstructure" "strings" "time" ) const ( PENDING = "pending" READY = "ready" USED = "used" EXPIRED = "expired" ) var ( rdb = cache.GetInstance() ) // PaymentToken Redis存储结构 type PaymentToken struct { PaymentParams *PaymentParam `json:"payment_params"` ExpireTime int64 `json:"expire_time"` } // PaymentParam 支付参数结构 type PaymentParam struct { ProductOrderNo string `json:"product_order_no" mapStruct:"ProductOrderNo"` PayOrderNo string `json:"pay_order_no" mapStruct:"PayOrderNo"` Package string `json:"package" mapStruct:"Package"` Timestamp string `json:"timestamp" mapStruct:"Timestamp"` NonceStr string `json:"nonce_str" mapStruct:"NonceStr"` PaySign string `json:"pay_sign" mapStruct:"PaySign"` SignType string `json:"sign_type" mapStruct:"SignType"` Status string `json:"status" mapStruct:"Status"` } // SavePaymentToken Redis操作辅助函数 func SavePaymentToken(pt *PaymentToken) (token string, err error) { //需要过期所有的对应产品订单的历史支付订单 keys, _ := rdb.Keys("payment:token:*") for _, key := range keys { payParam, _ := GetPaymentParam(strings.TrimPrefix(key, "payment:token:")) if payParam.PayOrderNo != "" && payParam.ProductOrderNo != "" && payParam.Status != "" { payParam.Status = EXPIRED jsonData, _ := json.Marshal(pt) _ = rdb.UpdateHSetNoExpire(key, jsonData) } } token = generateWechatOrderToken() paramMap, err := StructToMap(pt.PaymentParams) if err != nil { return } err = rdb.SetHSet(redis.GenerateWechatOrderToken(token), time.Until(time.Unix(pt.ExpireTime, 0)), paramMap) return } func StructToMap(v interface{}) (mapResult map[string]string, err error) { mapResult = make(map[string]string) decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ Result: &mapResult, TagName: "mapStruct", }) if err != nil { return nil, err } err = decoder.Decode(v) if err != nil { return nil, err } return } func MapToStruct(mapResult map[string]string, v interface{}) (err error) { decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ Result: v, TagName: "mapStruct", }) if err != nil { return } err = decoder.Decode(mapResult) if err != nil { return } return } func GetPaymentParam(token string) (paymentParam PaymentParam, err error) { val := rdb.GetHSet("payment:token:" + token) err = MapToStruct(val, &paymentParam) if err != nil { logger.Error("生成微信订单token失败,%v", err) return } if paymentParam.ProductOrderNo == "" || paymentParam.PayOrderNo == "" { err = fmt.Errorf("订单信息不存在:" + token) } return } // GenerateWechatOrderToken 生成token func generateWechatOrderToken() (token string) { return strings.ReplaceAll(uuid.New().String(), "-", "") }