package services import ( "errors" "eta/eta_mini_api/models" "eta/eta_mini_api/services/go_redis" "eta/eta_mini_api/utils" "fmt" "time" ) // BindUser 用户绑定 func BindUser(unionId, openId, phone, areaCode string) (userItem *models.UsersItem, tips string, err error) { users := new(models.Users) { cond := fmt.Sprintf(` AND %s = ?`, users.Cols().OpenId) pars := make([]interface{}, 0) pars = append(pars, openId) item, e := users.GetItemByCondition(cond, pars, "") if e != nil && e.Error() != utils.ErrNoRow() { err = fmt.Errorf("OpenId获取用户信息失败, %v", e) return } if item != nil { users = item } } // open_id用户存在 var updateUsers, insertUsers bool var updateCols []string if users.UserId > 0 { if users.Mobile != "" && users.Mobile != phone { tips = "该微信号已绑定其他手机号" err = fmt.Errorf("该微信号已绑定其他手机号, Mobile: %s, OpenId: %s", phone, openId) return } if users.Mobile == "" { updateUsers = true updateCols = append(updateCols, users.Cols().Mobile, users.Cols().AreaCode) users.Mobile = phone users.AreaCode = areaCode } if users.IsRegistered == models.UserNoRegistered { updateUsers = true updateCols = append(updateCols, users.Cols().IsRegistered, users.Cols().RegisterTime) users.IsRegistered = models.UserRegistered users.RegisterTime = time.Now().Local() } } // 匹配后台添加的用户 if users.UserId <= 0 { cond := fmt.Sprintf(` AND %s = ?`, users.Cols().Mobile) pars := make([]interface{}, 0) pars = append(pars, phone) item, e := users.GetItemByCondition(cond, pars, "") if e != nil && e.Error() != utils.ErrNoRow() { err = fmt.Errorf("手机号获取用户信息失败, %v", e) return } if item != nil { users = item } if users.UserId > 0 { if users.OpenId != "" && users.OpenId != openId { tips = "该手机号已绑定其他微信号" err = fmt.Errorf("该手机号已绑定其他微信号, Mobile: %s, OpenId: %s", phone, openId) return } updateUsers = true updateCols = append(updateCols, users.Cols().OpenId, users.Cols().UnionId, users.Cols().IsRegistered, users.Cols().RegisterTime) users.OpenId = openId users.UnionId = unionId users.IsRegistered = models.UserRegistered users.RegisterTime = time.Now().Local() } } // 匹配不上后台添加的,那么新增试用 if users.UserId <= 0 { key := fmt.Sprint(utils.CACHE_ACCESS_WX_BIND, phone) locked := go_redis.IsExist(key) if locked { err = errors.New("多次提交,请关闭页面重新进入") return } go_redis.SetNX(key, "ok", time.Second*300) defer func() { _ = go_redis.Delete(key) }() users.Mobile = phone users.AreaCode = areaCode users.Status = models.UserStatusTrial users.AuthStatus = models.AuthStatusOpen users.IsRegistered = models.UserRegistered users.RegisterTime = time.Now().Local() users.OpenId = openId users.UnionId = unionId users.CreateTime = time.Now().Local() users.ModifyTime = time.Now().Local() insertUsers = true } // 新增/更新用户 if insertUsers { if e := users.Create(); e != nil { err = fmt.Errorf("新增试用用户失败, %v", e) return } } if updateUsers { updateCols = append(updateCols, users.Cols().ModifyTime) users.ModifyTime = time.Now().Local() if e := users.Update(updateCols); e != nil { err = fmt.Errorf("更新用户失败, %v", e) return } } userItem = users.Format2Item() // 绑定UserId userRecord := new(models.UserRecord) { cond := fmt.Sprintf(` AND %s = ?`, userRecord.Cols().UnionId) pars := make([]interface{}, 0) pars = append(pars, unionId) ur, e := userRecord.GetItemByCondition(cond, pars, "") if e != nil && e.Error() != utils.ErrNoRow() { err = fmt.Errorf("获取订阅记录失败, %v", e) return } if ur != nil && ur.UserRecordId > 0 { userRecord = ur } } if userRecord != nil && userRecord.UserRecordId > 0 { users.Subscribe = userRecord.Subscribe users.ModifyTime = time.Now().Local() if e := users.Update([]string{users.Cols().Subscribe, users.Cols().ModifyTime}); e != nil { err = fmt.Errorf("更新用户关注状态失败, %v", e) return } userRecord.UserId = users.UserId if e := userRecord.Update([]string{userRecord.Cols().UserId}); e != nil { err = fmt.Errorf("更新订阅记录绑定状态失败, %v", e) return } } return }