package v1 import ( "context" "github.com/gin-gonic/gin" v1 "hospital-open-api/api/requests/v1" "hospital-open-api/api/responses" "hospital-open-api/config" "hospital-open-api/extend/weChat/Scheme" "hospital-open-api/global" "hospital-open-api/utils" "regexp" "strings" ) type WeChat struct{} // GetScheme 获取页面加密scheme码 func (r *WeChat) GetScheme(c *gin.Context) { WeChatRequest := v1.WeChatRequest{} req := WeChatRequest.GetScheme if err := c.ShouldBind(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } // 验证path参数 if strings.Count(req.Path, "/") != 3 || !strings.HasPrefix(req.Path, "/") || strings.HasSuffix(req.Path, "/") { responses.FailWithMessage("path格式错误", c) return } // 验证query参数 // 定义正则表达式,匹配 k1=v1&k2=v2 这种格式 pattern := `^([a-zA-Z0-9_-]+=[a-zA-Z0-9_-]+&)*([a-zA-Z0-9_-]+=[a-zA-Z0-9_-]+)$` reg := regexp.MustCompile(pattern) res := reg.MatchString(req.Query) if !res { responses.FailWithMessage("query格式错误", c) return } // 判断环境 envVersion := "trial" if config.C.Env == "prod" { envVersion = "release" } // 获取缓存 redisKey := "c:official_account.scheme." + req.Path + "." + req.Query scheme, _ := global.Redis.Get(context.Background(), redisKey).Result() if scheme != "" { responses.OkWithData(scheme, c) return } // 构建请求数据 JumpWxaData := &Scheme.GetSchemeJumpWxaRequest{ Path: req.Path, Query: req.Query, EnvVersion: envVersion, } GetSchemeRequest := &Scheme.GetSchemeRequest{ JumpWxa: JumpWxaData, ExpireType: 1, ExpireTime: 0, ExpireInterval: 10, } openLink, err := GetSchemeRequest.GetScheme(1) if err != nil { responses.FailWithMessage(err.Error(), c) return } responses.OkWithData(openLink, c) }