123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- package controller
- import (
- "encoding/json"
- "errors"
- "fmt"
- "github.com/gin-gonic/gin"
- "message-pusher/common"
- "message-pusher/model"
- "net/http"
- "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) {
- user.FillUserByWeChatId()
- } else {
- user.Username = "wechat_" + strconv.Itoa(model.GetMaxUserId()+1)
- user.DisplayName = "WeChat User"
- user.Role = common.RoleCommonUser
- user.Status = common.UserStatusEnabled
- if err := user.Insert(); err != nil {
- c.JSON(http.StatusOK, gin.H{
- "success": false,
- "message": err.Error(),
- })
- 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,
- }
- user.FillUserById()
- 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
- }
|