func()

in user-center-wecom/company.go [139:199]


func (c *Company) AuthUser(code string) (info *UserInfo, err error) {
	token, err := c.Work.GetOauth().GetAccessToken()
	if err != nil {
		return nil, fmt.Errorf("get access token failed: %w", err)
	}

	getUserInfoResp, err := resty.New().R().Get(fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=" + token + "&code=" + code))
	if err != nil {
		log.Errorf("get user info failed: %v", err)
		return nil, err
	}
	log.Debugf("get user info: %s", getUserInfoResp.String())

	userTicket := gjson.Get(getUserInfoResp.String(), "user_ticket").String()

	getUserDetailResp, err := resty.New().R().
		SetHeader("Content-Type", "application/json").
		SetBody(map[string]string{"user_ticket": userTicket}).
		Post(fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail?access_token=" + token))
	if err != nil {
		log.Errorf("get user info failed: %v", err)
		return nil, err
	}

	var userInfoResp *AuthUserInfoResp
	err = json.Unmarshal([]byte(getUserDetailResp.String()), &userInfoResp)
	if err != nil {
		log.Errorf("unmarshal user info failed: %s", err)
		return nil, err
	}
	if userInfoResp.Errcode != 0 {
		log.Errorf("get user info failed: %v", getUserDetailResp.String())
		return nil, fmt.Errorf("get user info failed")
	}
	log.Debugf("get user info: %s", getUserDetailResp.String())

	employee := c.EmployeeMapping[userInfoResp.Userid]
	if employee == nil {
		return nil, fmt.Errorf("user %s not found in employee list", userInfoResp.Userid)
	}

	userDetailInfo, err := c.GetUserDetailInfo(userInfoResp.Userid)
	if err != nil {
		return nil, err
	}

	userInfo := &UserInfo{
		Userid:        userInfoResp.Userid,
		Mobile:        userInfoResp.Mobile,
		Gender:        userInfoResp.Gender,
		Email:         userInfoResp.Email,
		Avatar:        userInfoResp.Avatar,
		QrCode:        userInfoResp.QrCode,
		Address:       userInfoResp.Address,
		Name:          employee.Name,
		Position:      userDetailInfo.Position,
		IsAvailable:   userDetailInfo.Status == 1,
		DepartmentIDs: employee.Department,
	}
	return userInfo, nil
}