package services import ( "eta/eta_mini_api/models" "eta/eta_mini_api/services/wechat" "eta/eta_mini_api/utils" "fmt" "time" ) // WechatSubscribe 关注公众号 func WechatSubscribe(openId string) { var err error defer func() { if err != nil { tips := fmt.Sprintf("WechatSubscribe, OpenId: %s, ErrMsg: %v", openId, err) utils.FileLog.Info(tips) fmt.Println(tips) } }() if openId == "" { err = fmt.Errorf("OpenId为空") return } // 获取订阅信息 userRecord := new(models.UserRecord) { cond := fmt.Sprintf(` AND %s = ?`, userRecord.Cols().OpenId) pars := make([]interface{}, 0) pars = append(pars, openId) record, e := userRecord.GetItemByCondition(cond, pars, "") if e != nil && e.Error() != utils.ErrNoRow() { err = fmt.Errorf("获取订阅记录失败, %v", e) return } if record != nil && record.UserRecordId > 0 { userRecord = record } } // 获取unionId var unionId string wechatUser, e := wechat.GetUserInfo(openId) if e != nil { err = fmt.Errorf("获取公众号用户信息失败, %v", e) return } if wechatUser.UnionID == "" { err = fmt.Errorf("UnionId有误") return } unionId = wechatUser.UnionID // 订阅信息不存在那么新增 if userRecord.UserRecordId == 0 { userRecord.OpenId = openId userRecord.UnionId = unionId userRecord.Subscribe = models.UserSubscribed userRecord.SubscribeTime = time.Now().Local() userRecord.NickName = wechatUser.Nickname userRecord.Gender = int(wechatUser.Sex) userRecord.Avatar = wechatUser.Headimgurl //userRecord.Province = wechatUser.Province //userRecord.City = wechatUser.City //userRecord.Country = wechatUser.Country userRecord.CreateTime = time.Now().Local() userRecord.ModifyTime = time.Now().Local() if e := userRecord.Create(); e != nil { err = fmt.Errorf("新增订阅记录失败, %v", e) return } } // 查询是否有小程序用户 users := new(models.Users) if userRecord.UserId > 0 { u, e := users.GetItemById(userRecord.UserId) if e != nil && e.Error() != utils.ErrNoRow() { err = fmt.Errorf("获取用户信息失败, %v", e) return } if u != nil && u.UserId > 0 { users = u } } else { cond := fmt.Sprintf(` AND %s = ?`, users.Cols().UnionId) pars := make([]interface{}, 0) pars = append(pars, unionId) u, e := users.GetItemByCondition(cond, pars, "") if e != nil && e.Error() != utils.ErrNoRow() { err = fmt.Errorf("UnionId获取用户信息失败, %s, %v", unionId, e) return } if u != nil && u.UserId > 0 { users = u } } // 更新订阅记录 var hasUsers bool updateCols := []string{userRecord.Cols().UnionId, userRecord.Cols().Subscribe, userRecord.Cols().SubscribeTime, userRecord.Cols().ModifyTime} if users.UserId > 0 { userRecord.UserId = users.UserId updateCols = append(updateCols, userRecord.Cols().UserId) hasUsers = true } userRecord.UnionId = unionId userRecord.Subscribe = models.UserSubscribed userRecord.SubscribeTime = time.Now().Local() userRecord.ModifyTime = time.Now().Local() if e := userRecord.Update(updateCols); e != nil { err = fmt.Errorf("更新订阅记录失败, %v", e) return } // 更新用户信息 if !hasUsers { return } users.UnionId = unionId users.Subscribe = userRecord.Subscribe users.ModifyTime = time.Now().Local() updateCols = []string{users.Cols().Subscribe, users.Cols().ModifyTime} if e := users.Update(updateCols); e != nil { err = fmt.Errorf("UnionId绑定用户失败, %v", e) return } } // WechatUnsubscribe 取消关注公众号 func WechatUnsubscribe(openId string) { var err error defer func() { if err != nil { tips := fmt.Sprintf("WechatUnsubscribe, OpenId: %s, ErrMsg: %v", openId, err) utils.FileLog.Info(tips) fmt.Println(tips) } }() if openId == "" { err = fmt.Errorf("OpenId为空") return } userRecord := new(models.UserRecord) { cond := fmt.Sprintf(` AND %s = ?`, userRecord.Cols().OpenId) pars := make([]interface{}, 0) pars = append(pars, openId) record, e := userRecord.GetItemByCondition(cond, pars, "") if e != nil { if e.Error() == utils.ErrNoRow() { err = fmt.Errorf("订阅信息不存在") return } err = fmt.Errorf("获取订阅记录失败, %v", e) return } userRecord = record } userRecord.Subscribe = models.UserNoSubscribe userRecord.SubscribeTime = time.Now().Local() userRecord.ModifyTime = time.Now().Local() updateCols := []string{userRecord.Cols().Subscribe, userRecord.Cols().SubscribeTime, userRecord.Cols().ModifyTime} if e := userRecord.Update(updateCols); e != nil { err = fmt.Errorf("更新订阅记录失败, %v", e) return } // 更新用户表 users := new(models.Users) if userRecord.UserId > 0 { u, e := users.GetItemById(userRecord.UserId) if e != nil && e.Error() != utils.ErrNoRow() { err = fmt.Errorf("获取用户信息失败, %v", e) return } if u != nil && u.UserId > 0 { users = u } } if users.UserId == 0 && userRecord.UnionId != "" { cond := fmt.Sprintf(` AND %s = ?`, users.Cols().UnionId) pars := make([]interface{}, 0) pars = append(pars, userRecord.UnionId) u, e := users.GetItemByCondition(cond, pars, "") if e != nil && e.Error() != utils.ErrNoRow() { err = fmt.Errorf("获取用户信息失败, %v", e) return } if u != nil && u.UserId > 0 { users = u } } if users.UserId == 0 { err = fmt.Errorf("用户信息不存在") return } users.Subscribe = userRecord.Subscribe users.ModifyTime = time.Now().Local() updateCols = []string{users.Cols().Subscribe, users.Cols().ModifyTime} if e := users.Update(updateCols); e != nil { err = fmt.Errorf("更新用户关注状态失败, %v", e) } return }