Download controller/wechat.go from Jack698/velo: direct link, hf CLI and curl.
- Browser
- Download file 4.29 kB
-
https://huggingface.co/spaces/Jack698/velo/resolve/main/controller/wechat.go
- Command line
-
hf download hf://spaces/Jack698/velo/controller/wechat.go
-
curl -L -o wechat.go https://huggingface.co/spaces/Jack698/velo/resolve/main/controller/wechat.go
4.29 kB
| // Copyright (c) 2025 Tethys Plex | |
| // | |
| // This file is part of Veloera. | |
| // | |
| // This program is free software: you can redistribute it and/or modify | |
| // it under the terms of the GNU General Public License as published by | |
| // the Free Software Foundation, either version 3 of the License, or | |
| // (at your option) any later version. | |
| // | |
| // This program is distributed in the hope that it will be useful, | |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| // GNU General Public License for more details. | |
| // | |
| // You should have received a copy of the GNU General Public License | |
| // along with this program. If not, see <https://www.gnu.org/licenses/>. | |
| package controller | |
| import ( | |
| "encoding/json" | |
| "errors" | |
| "fmt" | |
| "github.com/gin-contrib/sessions" | |
| "github.com/gin-gonic/gin" | |
| "net/http" | |
| "strconv" | |
| "time" | |
| "veloera/common" | |
| "veloera/model" | |
| ) | |
| type wechatLoginResponse struct { | |
| Success bool `json:"success"` | |
| Message string `json:"message"` | |
| Data string `json:"data"` | |
| } | |
| func getWeChatIdByCode(code string) (string, error) { | |
| if code == "" { | |
| return "", errors.New("无效的参数") | |
| } | |
| req, err := http.NewRequest("GET", fmt.Sprintf("%s/api/wechat/user?code=%s", common.WeChatServerAddress, code), nil) | |
| if err != nil { | |
| return "", err | |
| } | |
| req.Header.Set("Authorization", common.WeChatServerToken) | |
| client := http.Client{ | |
| Timeout: 5 * time.Second, | |
| } | |
| httpResponse, err := client.Do(req) | |
| if err != nil { | |
| return "", err | |
| } | |
| defer httpResponse.Body.Close() | |
| var res wechatLoginResponse | |
| err = json.NewDecoder(httpResponse.Body).Decode(&res) | |
| if err != nil { | |
| return "", err | |
| } | |
| if !res.Success { | |
| return "", errors.New(res.Message) | |
| } | |
| if res.Data == "" { | |
| return "", errors.New("验证码错误或已过期") | |
| } | |
| return res.Data, nil | |
| } | |
| func WeChatAuth(c *gin.Context) { | |
| if !common.WeChatAuthEnabled { | |
| c.JSON(http.StatusOK, gin.H{ | |
| "message": "管理员未开启通过微信登录以及注册", | |
| "success": false, | |
| }) | |
| return | |
| } | |
| code := c.Query("code") | |
| wechatId, err := getWeChatIdByCode(code) | |
| if err != nil { | |
| c.JSON(http.StatusOK, gin.H{ | |
| "message": err.Error(), | |
| "success": false, | |
| }) | |
| return | |
| } | |
| user := model.User{ | |
| WeChatId: wechatId, | |
| } | |
| if model.IsWeChatIdAlreadyTaken(wechatId) { | |
| err := user.FillUserByWeChatId() | |
| if err != nil { | |
| c.JSON(http.StatusOK, gin.H{ | |
| "success": false, | |
| "message": err.Error(), | |
| }) | |
| return | |
| } | |
| if user.Id == 0 { | |
| c.JSON(http.StatusOK, gin.H{ | |
| "success": false, | |
| "message": "用户已注销", | |
| }) | |
| return | |
| } | |
| } else { | |
| if common.RegisterEnabled { | |
| user.Username = "wechat_" + strconv.Itoa(model.GetMaxUserId()+1) | |
| user.DisplayName = "WeChat User" | |
| user.Role = common.RoleCommonUser | |
| user.Status = common.UserStatusEnabled | |
| if err := user.Insert(0); err != nil { | |
| c.JSON(http.StatusOK, gin.H{ | |
| "success": false, | |
| "message": err.Error(), | |
| }) | |
| return | |
| } | |
| } else { | |
| c.JSON(http.StatusOK, gin.H{ | |
| "success": false, | |
| "message": "管理员关闭了新用户注册", | |
| }) | |
| return | |
| } | |
| } | |
| if user.Status != common.UserStatusEnabled { | |
| c.JSON(http.StatusOK, gin.H{ | |
| "message": "用户已被封禁", | |
| "success": false, | |
| }) | |
| return | |
| } | |
| setupLogin(&user, c) | |
| } | |
| func WeChatBind(c *gin.Context) { | |
| if !common.WeChatAuthEnabled { | |
| c.JSON(http.StatusOK, gin.H{ | |
| "message": "管理员未开启通过微信登录以及注册", | |
| "success": false, | |
| }) | |
| return | |
| } | |
| code := c.Query("code") | |
| wechatId, err := getWeChatIdByCode(code) | |
| if err != nil { | |
| c.JSON(http.StatusOK, gin.H{ | |
| "message": err.Error(), | |
| "success": false, | |
| }) | |
| return | |
| } | |
| if model.IsWeChatIdAlreadyTaken(wechatId) { | |
| c.JSON(http.StatusOK, gin.H{ | |
| "success": false, | |
| "message": "该微信账号已被绑定", | |
| }) | |
| return | |
| } | |
| session := sessions.Default(c) | |
| id := session.Get("id") | |
| user := model.User{ | |
| Id: id.(int), | |
| } | |
| err = user.FillUserById() | |
| if err != nil { | |
| c.JSON(http.StatusOK, gin.H{ | |
| "success": false, | |
| "message": err.Error(), | |
| }) | |
| return | |
| } | |
| user.WeChatId = wechatId | |
| err = user.Update(false) | |
| if err != nil { | |
| c.JSON(http.StatusOK, gin.H{ | |
| "success": false, | |
| "message": err.Error(), | |
| }) | |
| return | |
| } | |
| c.JSON(http.StatusOK, gin.H{ | |
| "success": true, | |
| "message": "", | |
| }) | |
| return | |
| } | |