package service import ( "fmt" "reflect" "strconv" "strings" "time" "sandc/pkg/utils" "github.com/google/wire" "github.com/shopspring/decimal" ) // ProviderSet is service providers. var ProviderSet = wire.NewSet(NewEonlineService) // 定义加密key Secretkey const Secretkey = "eonline~#*^%$@!~0702" // validateSignRequest 验证参数请求 // Ts, Sign 参数必备 // signFixedParameters 签名固定参数 func (c *EonlineService) validateSignRequest(in any, signFixedParameters []string) error { var ( // ts int64 sign string // err error ) defer func() { if err := recover(); err != nil { fmt.Println("validateRequest panic: ", err) } }() v := reflect.ValueOf(in) // 获取签名 if signValue, ok := v.FieldByName("Sign").Interface().(string); ok { sign = signValue } if sign == "" { return fmt.Errorf("Sign不能为空") } // // 获取时间戳,ts 字符串转换为int64 // if tsValue, ok := v.FieldByName("Ts").Interface().(string); ok { // ts, err = strconv.ParseInt(tsValue, 10, 64) // if err != nil { // return fmt.Errorf("Ts转换失败") // } // } // if ts == 0 { // return fmt.Errorf("Ts不能为空") // } // // currentTime := time.Now().Unix() // // 比较时间戳是否超过60秒, QA环境不判断次时间 // if currentTime-ts > 60 || currentTime-ts < -60 { // fmt.Println("ts invalid: ", ts, currentTime, currentTime-ts) // if c.conf.Server.Env != "qa" { // return fmt.Errorf("ts invalid") // } // } secretStr := Secretkey for _, sfp := range signFixedParameters { fieldName := strings.ToLower(sfp) tmpValue := "" switch vtype := v.FieldByName(sfp).Interface().(type) { case string: tmpValue = vtype case float32: tmpValue = decimal.NewFromFloat32(vtype).String() case float64: tmpValue = decimal.NewFromFloat(vtype).String() case int64: tmpValue = decimal.NewFromInt(vtype).String() case bool: tmpValue = strconv.FormatBool(vtype) case int32: tmpValue = decimal.NewFromInt32(vtype).String() default: return fmt.Errorf("参数错误: %s", sfp) } secretStr += fmt.Sprintf("%s=%s", fieldName, tmpValue) } secretSignStr := utils.MD5Hex([]byte(secretStr)) if secretSignStr != sign { fmt.Println("---------签名错误---------", time.Now().Format("2006-01-02 15:04:05")) fmt.Println("加密前: ", secretStr) fmt.Println("加密后: ", secretSignStr) fmt.Println("sign: ", sign) return fmt.Errorf("签名错误") } return nil }