package captcha import ( "app.yhyue.com/moapp/jybase/go-xweb/httpsession" "app.yhyue.com/moapp/jybase/redis" "fmt" "log" "net/http" "strings" ) type CheckCaptcha struct { W http.ResponseWriter R *http.Request Sess *httpsession.Session Phone string Point string Key string Mold int } // CheckCaptchaData . func (c *CheckCaptcha) CheckCaptchaData() (err error) { if strings.TrimSpace(c.Phone) == "" || !PhoneCheck(c.Phone) { err = fmt.Errorf("phone param is empty or incorrect") return } if c.Point == "" || c.Key == "" { err = fmt.Errorf("point or key param is empty") return } var ( cacheDataByte *[]byte resCacheKey = fmt.Sprintf(ResCacheKey, c.Key, c.Phone) moldCacheKey = fmt.Sprintf(MoldCacheKey, c.Key, c.Phone) ) cacheDataByte, err = redis.GetBytes(RedisCode, resCacheKey) if cacheDataByte == nil || len(*cacheDataByte) == 0 { log.Println("resCacheKey:", resCacheKey) err = fmt.Errorf("get cache value false key") return } if c.Mold == 0 { c.Mold = redis.GetInt(RedisCode, moldCacheKey) } if c.Mold == 0 { err = fmt.Errorf("check captcha time out") return } //每次缓存数据只用一次 redis.Del(RedisCode, resCacheKey) redis.Del(RedisCode, moldCacheKey) switch c.Mold { case 1, 2: return c.CheckSlideCaptchaData(*cacheDataByte) case 3, 4: return c.CheckClickCaptchaData(*cacheDataByte) case 5: return c.CheckRotateCaptchaData(*cacheDataByte) } return }