|
| 1 | +package externalcontact |
| 2 | + |
| 3 | +import ( |
| 4 | + "fmt" |
| 5 | + |
| 6 | + "github.com/silenceper/wechat/v2/util" |
| 7 | +) |
| 8 | + |
| 9 | +// OpengIDToChatIDURL 客户群opengid转换URL |
| 10 | +const OpengIDToChatIDURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/opengid_to_chatid" |
| 11 | + |
| 12 | +type ( |
| 13 | + //GroupChatListRequest 获取客户群列表的请求参数 |
| 14 | + GroupChatListRequest struct { |
| 15 | + StatusFilter int `json:"status_filter"` // 非必填 客户群跟进状态过滤。0 - 所有列表(即不过滤) 1 - 离职待继承 2 - 离职继承中 3 - 离职继承完成 |
| 16 | + OwnerFilter OwnerFilter `json:"owner_filter"` //非必填 群主过滤。如果不填,表示获取应用可见范围内全部群主的数据(但是不建议这么用,如果可见范围人数超过1000人,为了防止数据包过大,会报错 81017) |
| 17 | + Cursor string `json:"cursor"` //非必填 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用不填 |
| 18 | + Limit int `json:"limit"` //必填 分页,预期请求的数据量,取值范围 1 ~ 1000 |
| 19 | + } |
| 20 | + |
| 21 | + //GroupChatList 客户群列表 |
| 22 | + GroupChatList struct { |
| 23 | + ChatID string `json:"chat_id"` |
| 24 | + Status int `json:"status"` |
| 25 | + } |
| 26 | + //GroupChatListResponse 获取客户群列表的返回值 |
| 27 | + GroupChatListResponse struct { |
| 28 | + util.CommonError |
| 29 | + GroupChatList []GroupChatList `json:"group_chat_list"` |
| 30 | + NextCursor string `json:"next_cursor"` //游标 |
| 31 | + } |
| 32 | +) |
| 33 | + |
| 34 | +// GetGroupChatList 获取客户群列表 |
| 35 | +// @see https://developer.work.weixin.qq.com/document/path/92120 |
| 36 | +func (r *Client) GetGroupChatList(req *GroupChatListRequest) (*GroupChatListResponse, error) { |
| 37 | + accessToken, err := r.GetAccessToken() |
| 38 | + if err != nil { |
| 39 | + return nil, err |
| 40 | + } |
| 41 | + var response []byte |
| 42 | + response, err = util.PostJSON(fmt.Sprintf("%s/list?access_token=%s", GroupChatURL, accessToken), req) |
| 43 | + if err != nil { |
| 44 | + return nil, err |
| 45 | + } |
| 46 | + result := &GroupChatListResponse{} |
| 47 | + if err = util.DecodeWithError(response, result, "GetGroupChatList"); err != nil { |
| 48 | + return nil, err |
| 49 | + } |
| 50 | + return result, nil |
| 51 | +} |
| 52 | + |
| 53 | +type ( |
| 54 | + //GroupChatDetailRequest 客户群详情 请求参数 |
| 55 | + GroupChatDetailRequest struct { |
| 56 | + ChatID string `json:"chat_id"` |
| 57 | + NeedName int `json:"need_name"` |
| 58 | + } |
| 59 | + //Invitor 邀请者 |
| 60 | + Invitor struct { |
| 61 | + UserID string `json:"userid"` //邀请者的userid |
| 62 | + } |
| 63 | + //GroupChatMember 群成员 |
| 64 | + GroupChatMember struct { |
| 65 | + UserID string `json:"userid"` //群成员id |
| 66 | + Type int `json:"type"` //成员类型。 1 - 企业成员 2 - 外部联系人 |
| 67 | + JoinTime int `json:"join_time"` //入群时间 |
| 68 | + JoinScene int `json:"join_scene"` //入群方式 1 - 由群成员邀请入群(直接邀请入群) 2 - 由群成员邀请入群(通过邀请链接入群) 3 - 通过扫描群二维码入群 |
| 69 | + Invitor Invitor `json:"invitor,omitempty"` //邀请者。目前仅当是由本企业内部成员邀请入群时会返回该值 |
| 70 | + GroupNickname string `json:"group_nickname"` //在群里的昵称 |
| 71 | + Name string `json:"name"` //名字。仅当 need_name = 1 时返回 如果是微信用户,则返回其在微信中设置的名字 如果是企业微信联系人,则返回其设置对外展示的别名或实名 |
| 72 | + UnionID string `json:"unionid,omitempty"` //外部联系人在微信开放平台的唯一身份标识(微信unionid),通过此字段企业可将外部联系人与公众号/小程序用户关联起来。仅当群成员类型是微信用户(包括企业成员未添加好友),且企业绑定了微信开发者ID有此字段(查看绑定方法)。第三方不可获取,上游企业不可获取下游企业客户的unionid字段 |
| 73 | + } |
| 74 | + //GroupChatAdmin 群管理员 |
| 75 | + GroupChatAdmin struct { |
| 76 | + UserID string `json:"userid"` //群管理员userid |
| 77 | + } |
| 78 | + //GroupChat 客户群详情 |
| 79 | + GroupChat struct { |
| 80 | + ChatID string `json:"chat_id"` //客户群ID |
| 81 | + Name string `json:"name"` //群名 |
| 82 | + Owner string `json:"owner"` //群主ID |
| 83 | + CreateTime int `json:"create_time"` //群的创建时间 |
| 84 | + Notice string `json:"notice"` //群公告 |
| 85 | + MemberList []GroupChatMember `json:"member_list"` //群成员列表 |
| 86 | + AdminList []GroupChatAdmin `json:"admin_list"` //群管理员列表 |
| 87 | + } |
| 88 | + //GroupChatDetailResponse 客户群详情 返回值 |
| 89 | + GroupChatDetailResponse struct { |
| 90 | + util.CommonError |
| 91 | + GroupChat GroupChat `json:"group_chat"` //客户群详情 |
| 92 | + } |
| 93 | +) |
| 94 | + |
| 95 | +// GetGroupChatDetail 获取客户群详情 |
| 96 | +// @see https://developer.work.weixin.qq.com/document/path/92122 |
| 97 | +func (r *Client) GetGroupChatDetail(req *GroupChatDetailRequest) (*GroupChatDetailResponse, error) { |
| 98 | + accessToken, err := r.GetAccessToken() |
| 99 | + if err != nil { |
| 100 | + return nil, err |
| 101 | + } |
| 102 | + var response []byte |
| 103 | + response, err = util.PostJSON(fmt.Sprintf("%s/get?access_token=%s", GroupChatURL, accessToken), req) |
| 104 | + if err != nil { |
| 105 | + return nil, err |
| 106 | + } |
| 107 | + result := &GroupChatDetailResponse{} |
| 108 | + if err = util.DecodeWithError(response, result, "GetGroupChatDetail"); err != nil { |
| 109 | + return nil, err |
| 110 | + } |
| 111 | + return result, nil |
| 112 | +} |
| 113 | + |
| 114 | +type ( |
| 115 | + //OpengIDToChatIDRequest 客户群opengid转换 请求参数 |
| 116 | + OpengIDToChatIDRequest struct { |
| 117 | + OpengID string `json:"opengid"` |
| 118 | + } |
| 119 | + //OpengIDToChatIDResponse 客户群opengid转换 返回值 |
| 120 | + OpengIDToChatIDResponse struct { |
| 121 | + util.CommonError |
| 122 | + ChatID string `json:"chat_id"` //客户群ID |
| 123 | + } |
| 124 | +) |
| 125 | + |
| 126 | +// OpengIDToChatID 客户群opengid转换 |
| 127 | +// @see https://developer.work.weixin.qq.com/document/path/94828 |
| 128 | +func (r *Client) OpengIDToChatID(req *OpengIDToChatIDRequest) (*OpengIDToChatIDResponse, error) { |
| 129 | + accessToken, err := r.GetAccessToken() |
| 130 | + if err != nil { |
| 131 | + return nil, err |
| 132 | + } |
| 133 | + var response []byte |
| 134 | + response, err = util.PostJSON(fmt.Sprintf("%s?access_token=%s", OpengIDToChatIDURL, accessToken), req) |
| 135 | + if err != nil { |
| 136 | + return nil, err |
| 137 | + } |
| 138 | + result := &OpengIDToChatIDResponse{} |
| 139 | + if err = util.DecodeWithError(response, result, "GetGroupChatDetail"); err != nil { |
| 140 | + return nil, err |
| 141 | + } |
| 142 | + return result, nil |
| 143 | +} |
0 commit comments