package Scheme import ( "context" "encoding/json" "errors" "fmt" "hospital-open-api/extend/weChat" "hospital-open-api/global" "strings" "time" ) // GetSchemeJumpWxaRequest 跳转到的目标小程序信息 type GetSchemeJumpWxaRequest struct { Path string `json:"path"` Query string `json:"query"` // envVersion 要打开的小程序版本。正式版为 "release",体验版为 "trial",开发版为 "develop" EnvVersion string `json:"env_version"` } // GetSchemeRequest 请求参数 // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-scheme/urlscheme.generate.html#请求参数 type GetSchemeRequest struct { JumpWxa *GetSchemeJumpWxaRequest `json:"jump_wxa"` ExpireType int `json:"expire_type"` ExpireTime int64 `json:"expire_time"` ExpireInterval int `json:"expire_interval"` } // GetSchemeResponse 获取加密scheme码返回数据 type GetSchemeResponse struct { OpenLink string `json:"openlink"` weChat.CommonError } // GetScheme 获取加密scheme码 func (r *GetSchemeRequest) GetScheme(userType int) (string, error) { // 初始化配置 weChatConfig := weChat.GetConfig(userType) // 获取token accessToken, err := weChatConfig.GetAccessToken() if err != nil { return "", err } url := fmt.Sprintf("%s?access_token=%s", "https://api.weixin.qq.com/wxa/generatescheme", accessToken) // 将请求数据转换为 JSON requestBody, err := json.Marshal(r) if err != nil { return "", err } // 去除json的转义 requestBody = []byte(strings.Replace(string(requestBody), "\\u0026", "&", -1)) body, err := weChat.PostRequest(url, requestBody) if err != nil { return "", errors.New(err.Error()) } var GetSchemeResponse GetSchemeResponse err = json.Unmarshal(body, &GetSchemeResponse) if err != nil { // json解析失败 return "", err } if GetSchemeResponse.ErrCode != 0 || GetSchemeResponse.ErrMsg != "ok" { return "", errors.New(GetSchemeResponse.ErrMsg) } if GetSchemeResponse.OpenLink == "" { return "", errors.New("失败") } // 加入缓存 redisKey := "c:official_account.scheme." + r.JumpWxa.Path + "." + r.JumpWxa.Query global.Redis.Set(context.Background(), redisKey, GetSchemeResponse.OpenLink, 60*60*24*10*time.Second) return GetSchemeResponse.OpenLink, nil }