wangshan 5 місяців тому
батько
коміт
2f6419d0d9
6 змінених файлів з 476 додано та 166 видалено
  1. 15 138
      captcha/captcha.go
  2. 24 28
      captcha/check.go
  3. 184 0
      captcha/click.go
  4. 26 0
      captcha/entity.go
  5. 98 0
      captcha/rotate.go
  6. 129 0
      captcha/slide.go

+ 15 - 138
captcha/captcha.go

@@ -1,16 +1,8 @@
 package captcha
 
 import (
-	"app.yhyue.com/moapp/jybase/captcha/helper"
 	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
-	"app.yhyue.com/moapp/jybase/redis"
-	"encoding/json"
 	"fmt"
-	"github.com/wenlng/go-captcha-assets/resources/images"
-	"github.com/wenlng/go-captcha-assets/resources/tiles"
-	"github.com/wenlng/go-captcha/v2/slide"
-	"image"
-	"log"
 	"net/http"
 	"strings"
 )
@@ -27,150 +19,35 @@ type (
 		CaptchaKey  interface{} `json:"captcha_key"`
 		ImageBase64 interface{} `json:"image_base64"`
 		TileBase64  interface{} `json:"tile_base64"`
+		ThumbBase64 interface{} `json:"thumb_base64"`
 		TileWidth   interface{} `json:"tile_width"`
 		TileHeight  interface{} `json:"tile_height"`
 		TileX       interface{} `json:"tile_x"`
 		TileY       interface{} `json:"tile_y"`
+		ThumbSize   int         `json:"thumb_size"`
 	}
 )
 
-var (
-	captFuncS          []slide.Captcha
-	rd                       = RandomNumberGenerator()
-	redisTtl                 = 10 * 60
-	redisKey                 = "captcha_slide_%s_%s"
-	padding            int64 = 4
-	RedisCode                = "other"
-	SendCodeKey              = "send_phone_check_%s_%s"
-	MobileCacheKey           = "mobile_captcha_%s"
-	SendCodeTtl              = 20 * 60
-	SendCodeCacheValue       = "send_phone_check_%s_%sValue"
-	SendCodeCacheKey         = "send_phone_check_%s_%sKey"
-	SendCodeCacheTime        = "send_phone_check_%s_%sTime"
-)
-
-func InitCaptcha(n int) {
-	for i := 1; i <= n; i++ {
-		if captcha := slideCaptcha(i); captcha != nil {
-			captFuncS = append(captFuncS, captcha)
-		}
-	}
-	if len(captFuncS) == 0 {
-		fmt.Println("InitCaptcha False")
-	}
-	//cache.RunTimedTask()
-}
-
-// 滑动 Basic=1 || 拖拽 Region=2
-func slideCaptcha(n int) slide.Captcha {
-	var builder slide.Builder
-	switch n {
-	case 2:
-		builder = slide.NewBuilder(
-			slide.WithGenGraphNumber(2),
-			slide.WithEnableGraphVerticalRandom(true),
-		)
-	default:
-		builder = slide.NewBuilder(
-			slide.WithGenGraphNumber(2),
-		)
-	}
-	// background images
-	var (
-		imgS []image.Image
-		err  error
-	)
-	imgS, err = images.GetImages()
-	if err != nil {
-		log.Fatalln(err)
-		return nil
-	}
-	var graphs []*tiles.GraphImage
-	graphs, err = tiles.GetTiles()
-	if err != nil {
-		log.Fatalln(err)
-		return nil
-	}
-	var newGraphs = make([]*slide.GraphImage, 0, len(graphs))
-	for i := 0; i < len(graphs); i++ {
-		graph := graphs[i]
-		newGraphs = append(newGraphs, &slide.GraphImage{
-			OverlayImage: graph.OverlayImage,
-			MaskImage:    graph.MaskImage,
-			ShadowImage:  graph.ShadowImage,
-		})
-	}
-	// set resources
-	builder.SetResources(
-		slide.WithGraphImages(newGraphs),
-		slide.WithBackgrounds(imgS),
-	)
-	switch n {
-	case 2:
-		return builder.MakeWithRegion()
-	default:
-		return builder.Make()
-	}
+func InitCaptcha() {
+	SlideCaptcha()
+	ClickCaptcha()
+	RotateCaptcha()
 }
 
-// GetCaptchaData .
 func (c *GetCaptcha) GetCaptchaData() (cd CaptRes, err error) {
 	if strings.TrimSpace(c.Phone) == "" || !PhoneCheck(c.Phone) {
 		err = fmt.Errorf("phone param is empty or incorrect")
 		return
 	}
-	if len(captFuncS) == 0 {
-		err = fmt.Errorf("get generate failed")
-		return
-	}
-	var (
-		randomIndex int
-		captData    slide.CaptchaData
-	)
-	if cf := len(captFuncS); cf > 1 {
-		randomIndex = rd.Intn(cf)
-	}
-	captData, err = captFuncS[randomIndex].Generate()
-	if err != nil {
-		log.Fatalln(err)
-		return
-	}
-	blockData := captData.GetData()
-	if blockData == nil {
-		err = fmt.Errorf("gen captcha data failed")
-		return
-	}
-	var masterImageBase64, tileImageBase64 string
-	masterImageBase64, err = captData.GetMasterImage().ToBase64()
-	if err != nil {
-		err = fmt.Errorf("masterImage base64 data failed")
-		return
-	}
-	tileImageBase64, err = captData.GetTileImage().ToBase64()
-	if err != nil {
-		err = fmt.Errorf("tileImage base64 data failed")
-		return
-	}
-	dotsByte, _ := json.Marshal(blockData)
-	//key := helper.GenUniqueId()
-	captchaKey := helper.StringToMD5(string(dotsByte))
-	cacheKey := fmt.Sprintf(redisKey, captchaKey, c.Phone)
-	//cache.WriteCache(fmt.Sprintf("%s#%s", captchaKey, c.Phone), dotsByte)
-	err = redis.PutBytes(RedisCode, cacheKey, &dotsByte, redisTtl)
-	if err != nil {
-		err = fmt.Errorf("cache save value failed")
-		return
-	}
-	randomIndex++
-	cd = CaptRes{
-		Code:        randomIndex,
-		CaptchaKey:  captchaKey,
-		ImageBase64: masterImageBase64,
-		TileBase64:  tileImageBase64,
-		TileWidth:   blockData.Width,
-		TileHeight:  blockData.Height,
-		TileX:       blockData.TileX,
-		TileY:       blockData.TileY,
+	rn := 1 // rd.Intn(num) + 1
+	switch rn {
+	case 1, 2:
+		return c.GetSlideCaptchaData(rn)
+	case 3, 4:
+		return c.GetClickCaptchaData(rn)
+	case 5:
+		return c.GetRotateCaptchaData()
 	}
+	err = fmt.Errorf("get captcha data false")
 	return
 }

+ 24 - 28
captcha/check.go

@@ -3,11 +3,9 @@ package captcha
 import (
 	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
 	"app.yhyue.com/moapp/jybase/redis"
-	"encoding/json"
 	"fmt"
-	"github.com/wenlng/go-captcha/v2/slide"
+	"log"
 	"net/http"
-	"strconv"
 	"strings"
 )
 
@@ -18,6 +16,7 @@ type CheckCaptcha struct {
 	Phone string
 	Point string
 	Key   string
+	Mold  int
 }
 
 // CheckCaptchaData .
@@ -26,41 +25,38 @@ func (c *CheckCaptcha) CheckCaptchaData() (err error) {
 		err = fmt.Errorf("phone param is empty or incorrect")
 		return
 	}
-	point := c.Point
-	key := c.Key
-	if point == "" || key == "" {
+	if c.Point == "" || c.Key == "" {
 		err = fmt.Errorf("point or key param is empty")
 		return
 	}
 	var (
 		cacheDataByte *[]byte
-		cacheKey      = fmt.Sprintf(redisKey, key, c.Phone)
+		resCacheKey   = fmt.Sprintf(ResCacheKey, c.Key, c.Phone)
+		moldCacheKey  = fmt.Sprintf(MoldCacheKey, c.Key, c.Phone)
 	)
-	//cacheDataByte := cache.ReadCache(fmt.Sprintf("%s#%s", key, c.Phone))
-	cacheDataByte, err = redis.GetBytes(RedisCode, cacheKey)
+	cacheDataByte, err = redis.GetBytes(RedisCode, resCacheKey)
 	if cacheDataByte == nil || len(*cacheDataByte) == 0 {
-		err = fmt.Errorf("get cache value false")
+		log.Println("resCacheKey:", resCacheKey)
+		err = fmt.Errorf("get cache value false key")
 		return
 	}
-	//每次缓存数据只用一次
-	redis.Del(RedisCode, cacheKey)
-	src := strings.Split(point, ",")
-	var dct *slide.Block
-	if err = json.Unmarshal(*cacheDataByte, &dct); err != nil {
-		return
-	}
-	chkRet := false
-	if 2 == len(src) {
-		sx, _ := strconv.ParseFloat(fmt.Sprintf("%v", src[0]), 64)
-		sy, _ := strconv.ParseFloat(fmt.Sprintf("%v", src[1]), 64)
-		chkRet = slide.CheckPoint(int64(sx), int64(sy), int64(dct.X), int64(dct.Y), padding)
+	if c.Mold == 0 {
+		c.Mold = redis.GetInt(RedisCode, moldCacheKey)
 	}
-	if !chkRet {
-		err = fmt.Errorf("check result false")
+	if c.Mold == 0 {
+		err = fmt.Errorf("check captcha time out")
 		return
 	}
-	//发送短信等验证缓存
-	//redis.Put(RedisCode, fmt.Sprintf(SendCodeKey, key, c.Phone), c.Phone, SendCodeTtl)
-	//c.Sess.Set(fmt.Sprintf(SendCodeKey, key, c.Phone), c.Phone)
-	return nil
+	//每次缓存数据只用一次
+	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
 }

+ 184 - 0
captcha/click.go

@@ -0,0 +1,184 @@
+package captcha
+
+import (
+	"app.yhyue.com/moapp/jybase/captcha/helper"
+	"app.yhyue.com/moapp/jybase/redis"
+	"encoding/json"
+	"fmt"
+	"github.com/golang/freetype/truetype"
+	"github.com/wenlng/go-captcha-assets/bindata/chars"
+	"github.com/wenlng/go-captcha-assets/resources/fonts/fzshengsksjw"
+	"github.com/wenlng/go-captcha-assets/resources/images"
+	"github.com/wenlng/go-captcha/v2/base/option"
+	"github.com/wenlng/go-captcha/v2/click"
+	"image"
+	"log"
+	"strconv"
+	"strings"
+)
+
+// ClickCaptcha click 文本 Basic=1 || 图形 Shape=2
+func ClickCaptcha() {
+	builder := click.NewBuilder(
+		click.WithRangeLen(option.RangeVal{Min: 4, Max: 6}),
+		click.WithRangeVerifyLen(option.RangeVal{Min: 2, Max: 4}),
+		click.WithDisabledRangeVerifyLen(true),
+		click.WithRangeThumbColors([]string{
+			"#1f55c4",
+			"#780592",
+			"#2f6b00",
+			"#910000",
+			"#864401",
+			"#675901",
+			"#016e5c",
+		}),
+		click.WithRangeColors([]string{
+			"#fde98e",
+			"#60c1ff",
+			"#fcb08e",
+			"#fb88ff",
+			"#b4fed4",
+			"#cbfaa9",
+			"#78d6f8",
+		}),
+	)
+	var (
+		fonts *truetype.Font
+		imgS  []image.Image
+		err   error
+	)
+	// fonts
+	fonts, err = fzshengsksjw.GetFont()
+	if err != nil {
+		log.Fatalln(err)
+	}
+	// background images
+	imgS, err = images.GetImages()
+	if err != nil {
+		log.Fatalln(err)
+	}
+	// set resources
+	builder.SetResources(
+		click.WithChars(chars.GetChineseChars()),
+		//click.WithChars([]string{
+		//	"1A",
+		//	"5E",
+		//	"3d",
+		//	"0p",
+		//	"78",
+		//	"DL",
+		//	"CB",
+		//	"9M",
+		//}),
+		//click.WithChars(chars.GetAlphaChars()),
+		click.WithFonts([]*truetype.Font{fonts}),
+		click.WithBackgrounds(imgS),
+		//click.WithThumbBackgrounds(thumbImages),
+	)
+	clickFuncS = append(clickFuncS, builder.Make())
+	// ============================
+	builder.Clear()
+	builder.SetOptions(
+		click.WithRangeLen(option.RangeVal{Min: 4, Max: 6}),
+		click.WithRangeVerifyLen(option.RangeVal{Min: 2, Max: 4}),
+		click.WithRangeThumbColors([]string{
+			"#4a85fb",
+			"#d93ffb",
+			"#56be01",
+			"#ee2b2b",
+			"#cd6904",
+			"#b49b03",
+			"#01ad90",
+		}),
+	)
+	builder.SetResources(
+		click.WithChars(chars.GetChineseChars()),
+		click.WithFonts([]*truetype.Font{fonts}),
+		click.WithBackgrounds(imgS),
+	)
+	clickFuncS = append(clickFuncS, builder.Make())
+}
+
+// GetClickCaptchaData .
+func (c *GetCaptcha) GetClickCaptchaData(rn int) (cd CaptRes, err error) {
+	if len(clickFuncS) == 0 {
+		err = fmt.Errorf("get clickFuncS generate failed")
+		return
+	}
+	if rn < 3 || rn > 4 {
+		rn = 3
+	}
+	var (
+		captData click.CaptchaData
+	)
+	captData, err = clickFuncS[rn-3].Generate()
+	if err != nil {
+		log.Fatalln(err)
+		return
+	}
+
+	dotData := captData.GetData()
+	if dotData == nil {
+		err = fmt.Errorf("gen captcha data failed")
+		return
+	}
+
+	var masterImageBase64, thumbImageBase64 string
+	masterImageBase64, err = captData.GetMasterImage().ToBase64()
+	if err != nil {
+		err = fmt.Errorf("masterImage base64 data failed")
+		return
+	}
+
+	thumbImageBase64, err = captData.GetThumbImage().ToBase64()
+	if err != nil {
+		err = fmt.Errorf("tileImage base64 data failed")
+		return
+	}
+
+	dotsByte, _ := json.Marshal(dotData)
+	captchaKey := helper.StringToMD5(string(dotsByte))
+	cacheKey := fmt.Sprintf(ResCacheKey, captchaKey, c.Phone)
+	err = redis.PutBytes(RedisCode, cacheKey, &dotsByte, redisTtl)
+	if err != nil {
+		err = fmt.Errorf("cache save value failed")
+		return
+	}
+	fmt.Println("click  >>>>>", string(dotsByte))
+	cd = CaptRes{
+		Code:        rn,
+		CaptchaKey:  captchaKey,
+		ImageBase64: masterImageBase64,
+		ThumbBase64: thumbImageBase64,
+	}
+	redis.Put(RedisCode, fmt.Sprintf(MoldCacheKey, captchaKey, c.Phone), cd.Code, SendCodeTtl)
+	return
+}
+
+// CheckClickCaptchaData .
+func (c *CheckCaptcha) CheckClickCaptchaData(cacheDataByte []byte) (err error) {
+	var dct map[int]*click.Dot
+	if err = json.Unmarshal(cacheDataByte, &dct); err != nil {
+		return
+	}
+	src := strings.Split(c.Point, ",")
+	chkRet := false
+	if (len(dct) * 2) == len(src) {
+		for i := 0; i < len(dct); i++ {
+			dot := dct[i]
+			j := i * 2
+			k := i*2 + 1
+			sx, _ := strconv.ParseFloat(fmt.Sprintf("%v", src[j]), 64)
+			sy, _ := strconv.ParseFloat(fmt.Sprintf("%v", src[k]), 64)
+			chkRet = click.CheckPoint(int64(sx), int64(sy), int64(dot.X), int64(dot.Y), int64(dot.Width), int64(dot.Height), 0)
+			if !chkRet {
+				break
+			}
+		}
+	}
+	if !chkRet {
+		err = fmt.Errorf("check result false")
+		return
+	}
+	return
+}

+ 26 - 0
captcha/entity.go

@@ -0,0 +1,26 @@
+package captcha
+
+import (
+	"github.com/wenlng/go-captcha/v2/click"
+	"github.com/wenlng/go-captcha/v2/rotate"
+	"github.com/wenlng/go-captcha/v2/slide"
+)
+
+var (
+	num                = 5
+	slideFuncS         []slide.Captcha
+	clickFuncS         []click.Captcha
+	rotateFuncS        []rotate.Captcha
+	rd                       = RandomNumberGenerator()
+	redisTtl                 = 10 * 60
+	padding            int64 = 4
+	RedisCode                = "other"
+	SendCodeKey              = "send_phone_check_%s_%s"
+	MobileCacheKey           = "mobile_captcha_%s"
+	SendCodeTtl              = 30 * 60
+	SendCodeCacheValue       = "send_phone_check_%s_%sValue"
+	SendCodeCacheKey         = "send_phone_check_%s_%sKey"
+	SendCodeCacheTime        = "send_phone_check_%s_%sTime"
+	MoldCacheKey             = "captcha_mold_%s_%s"
+	ResCacheKey              = "captcha_res_%s_%s"
+)

+ 98 - 0
captcha/rotate.go

@@ -0,0 +1,98 @@
+package captcha
+
+import (
+	"app.yhyue.com/moapp/jybase/captcha/helper"
+	"app.yhyue.com/moapp/jybase/redis"
+	"encoding/json"
+	"fmt"
+	"github.com/wenlng/go-captcha-assets/resources/images"
+	"github.com/wenlng/go-captcha/v2/base/option"
+	"github.com/wenlng/go-captcha/v2/rotate"
+	"log"
+	"strconv"
+)
+
+func RotateCaptcha() {
+	builder := rotate.NewBuilder(rotate.WithRangeAnglePos([]option.RangeVal{
+		{Min: 20, Max: 330},
+	}))
+	// background images
+	imgs, err := images.GetImages()
+	if err != nil {
+		log.Fatalln(err)
+	}
+	// set resources
+	builder.SetResources(
+		rotate.WithImages(imgs),
+	)
+	rotateFuncS = append(rotateFuncS, builder.Make())
+}
+
+// GetRotateCaptchaData .
+func (c *GetCaptcha) GetRotateCaptchaData() (cd CaptRes, err error) {
+	if len(rotateFuncS) == 0 {
+		err = fmt.Errorf("get rotateFuncS generate failed")
+		return
+	}
+	var (
+		captData rotate.CaptchaData
+	)
+	captData, err = rotateFuncS[0].Generate()
+	if err != nil {
+		log.Fatalln(err)
+		return
+	}
+
+	blockData := captData.GetData()
+	if blockData == nil {
+		err = fmt.Errorf("gen captcha data failed")
+		return
+	}
+
+	var masterImageBase64, thumbImageBase64 string
+	masterImageBase64, err = captData.GetMasterImage().ToBase64()
+	if err != nil {
+		err = fmt.Errorf("masterImage base64 data failed")
+		return
+	}
+
+	thumbImageBase64, err = captData.GetThumbImage().ToBase64()
+	if err != nil {
+		err = fmt.Errorf("tileImage base64 data failed")
+		return
+	}
+
+	blockByte, _ := json.Marshal(blockData)
+	captchaKey := helper.StringToMD5(string(blockByte))
+	cacheKey := fmt.Sprintf(ResCacheKey, captchaKey, c.Phone)
+	err = redis.PutBytes(RedisCode, cacheKey, &blockByte, redisTtl)
+	if err != nil {
+		err = fmt.Errorf("cache save value failed")
+		return
+	}
+	fmt.Println("rotate  >>>>>", string(blockByte))
+	cd = CaptRes{
+		Code:        5,
+		CaptchaKey:  captchaKey,
+		ImageBase64: masterImageBase64,
+		ThumbBase64: thumbImageBase64,
+		ThumbSize:   blockData.Width,
+	}
+	redis.Put(RedisCode, fmt.Sprintf(MoldCacheKey, captchaKey, c.Phone), cd.Code, SendCodeTtl)
+	return
+}
+
+// CheckRotateCaptchaData .
+func (c *CheckCaptcha) CheckRotateCaptchaData(cacheDataByte []byte) (err error) {
+	var dct *rotate.Block
+	if err = json.Unmarshal(cacheDataByte, &dct); err != nil {
+		return
+	}
+	sAngle, _ := strconv.ParseFloat(fmt.Sprintf("%v", c.Point), 64)
+	chkRet := rotate.CheckAngle(int64(sAngle), int64(dct.Angle), 2)
+	if !chkRet {
+		err = fmt.Errorf("check result false")
+		return
+	}
+	return
+}

+ 129 - 0
captcha/slide.go

@@ -0,0 +1,129 @@
+package captcha
+
+import (
+	"app.yhyue.com/moapp/jybase/captcha/helper"
+	"app.yhyue.com/moapp/jybase/redis"
+	"encoding/json"
+	"fmt"
+	"github.com/wenlng/go-captcha-assets/resources/images"
+	"github.com/wenlng/go-captcha-assets/resources/tiles"
+	"github.com/wenlng/go-captcha/v2/slide"
+	"image"
+	"log"
+	"strconv"
+	"strings"
+)
+
+// SlideCaptcha slide 滑动 Basic=1 || 拖拽 Region=2
+func SlideCaptcha() {
+	var builder = slide.NewBuilder(
+		slide.WithGenGraphNumber(2),
+	)
+	// background images
+	var (
+		imgS []image.Image
+		err  error
+	)
+	imgS, err = images.GetImages()
+	if err != nil {
+		log.Fatalln(err)
+		return
+	}
+	var graphs []*tiles.GraphImage
+	graphs, err = tiles.GetTiles()
+	if err != nil {
+		log.Fatalln(err)
+		return
+	}
+	var newGraphs = make([]*slide.GraphImage, 0, len(graphs))
+	for i := 0; i < len(graphs); i++ {
+		graph := graphs[i]
+		newGraphs = append(newGraphs, &slide.GraphImage{
+			OverlayImage: graph.OverlayImage,
+			MaskImage:    graph.MaskImage,
+			ShadowImage:  graph.ShadowImage,
+		})
+	}
+	// set resources
+	builder.SetResources(
+		slide.WithGraphImages(newGraphs),
+		slide.WithBackgrounds(imgS),
+	)
+	slideFuncS = append(slideFuncS, builder.Make(), builder.MakeWithRegion())
+}
+
+// GetSlideCaptchaData .
+func (c *GetCaptcha) GetSlideCaptchaData(rn int) (cd CaptRes, err error) {
+	if len(slideFuncS) == 0 {
+		err = fmt.Errorf("get slideFuncS generate failed")
+		return
+	}
+	if rn < 1 || rn > 2 {
+		rn = 1
+	}
+	var (
+		captData slide.CaptchaData
+	)
+	captData, err = slideFuncS[rn-1].Generate()
+	if err != nil {
+		log.Fatalln(err)
+		return
+	}
+	blockData := captData.GetData()
+	if blockData == nil {
+		err = fmt.Errorf("gen captcha data failed")
+		return
+	}
+	var masterImageBase64, tileImageBase64 string
+	masterImageBase64, err = captData.GetMasterImage().ToBase64()
+	if err != nil {
+		err = fmt.Errorf("masterImage base64 data failed")
+		return
+	}
+	tileImageBase64, err = captData.GetTileImage().ToBase64()
+	if err != nil {
+		err = fmt.Errorf("tileImage base64 data failed")
+		return
+	}
+	dotsByte, _ := json.Marshal(blockData)
+	captchaKey := helper.StringToMD5(string(dotsByte))
+	cacheKey := fmt.Sprintf(ResCacheKey, captchaKey, c.Phone)
+	err = redis.PutBytes(RedisCode, cacheKey, &dotsByte, redisTtl)
+	if err != nil {
+		err = fmt.Errorf("cache save value failed")
+		return
+	}
+	fmt.Println("slid  >>>>>", string(dotsByte))
+	cd = CaptRes{
+		Code:        rn,
+		CaptchaKey:  captchaKey,
+		ImageBase64: masterImageBase64,
+		TileBase64:  tileImageBase64,
+		TileWidth:   blockData.Width,
+		TileHeight:  blockData.Height,
+		TileX:       blockData.TileX,
+		TileY:       blockData.TileY,
+	}
+	redis.Put(RedisCode, fmt.Sprintf(MoldCacheKey, captchaKey, c.Phone), cd.Code, SendCodeTtl)
+	return
+}
+
+// CheckSlideCaptchaData .
+func (c *CheckCaptcha) CheckSlideCaptchaData(cacheDataByte []byte) (err error) {
+	src := strings.Split(c.Point, ",")
+	var dct *slide.Block
+	if err = json.Unmarshal(cacheDataByte, &dct); err != nil {
+		return
+	}
+	chkRet := false
+	if 2 == len(src) {
+		sx, _ := strconv.ParseFloat(fmt.Sprintf("%v", src[0]), 64)
+		sy, _ := strconv.ParseFloat(fmt.Sprintf("%v", src[1]), 64)
+		chkRet = slide.CheckPoint(int64(sx), int64(sy), int64(dct.X), int64(dct.Y), padding)
+	}
+	if !chkRet {
+		err = fmt.Errorf("check result false")
+		return
+	}
+	return nil
+}