groupchat.go 6.2 KB

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