2023-04-22 12:39:27 +00:00
|
|
|
package controller
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"net/http"
|
2023-04-22 13:14:09 +00:00
|
|
|
"one-api/common"
|
|
|
|
"one-api/model"
|
2023-04-22 12:39:27 +00:00
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if common.RegisterEnabled {
|
|
|
|
user.Username = "wechat_" + strconv.Itoa(model.GetMaxUserId()+1)
|
|
|
|
user.DisplayName = "WeChat User"
|
|
|
|
user.Role = common.RoleCommonUser
|
|
|
|
user.Status = common.UserStatusEnabled
|
|
|
|
|
2023-06-17 10:12:58 +00:00
|
|
|
if err := user.Insert(0); err != nil {
|
2023-04-22 12:39:27 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
id := c.GetInt("id")
|
|
|
|
user := model.User{
|
|
|
|
Id: id,
|
|
|
|
}
|
|
|
|
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
|
|
|
|
}
|