1
0
mirror of https://github.com/silenceper/wechat.git synced 2026-02-04 12:52:27 +08:00
This commit is contained in:
houseme
2024-07-19 12:04:04 +08:00
parent ba0a1477eb
commit d8fde54f2d
118 changed files with 974 additions and 867 deletions

View File

@@ -9,7 +9,7 @@ import (
const (
// departmentCreateURL 创建部门
departmentCreateURL = "https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token=%s"
// departmentSimpleListURL 获取子部门ID列表
// departmentSimpleListURL 获取子部门 ID 列表
departmentSimpleListURL = "https://qyapi.weixin.qq.com/cgi-bin/department/simplelist?access_token=%s&id=%d"
// departmentListURL 获取部门列表
departmentListURL = "https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=%s"
@@ -33,12 +33,12 @@ type (
ID int `json:"id"`
}
// DepartmentSimpleListResponse 获取子部门ID列表响应
// DepartmentSimpleListResponse 获取子部门 ID 列表响应
DepartmentSimpleListResponse struct {
util.CommonError
DepartmentID []*DepartmentID `json:"department_id"`
}
// DepartmentID 子部门ID
// DepartmentID 子部门 ID
DepartmentID struct {
ID int `json:"id"`
ParentID int `json:"parentid"`
@@ -52,12 +52,12 @@ type (
}
// Department 部门列表数据
Department struct {
ID int `json:"id"` // 创建的部门id
ID int `json:"id"` // 创建的部门 id
Name string `json:"name"` // 部门名称
NameEn string `json:"name_en"` // 英文名称
DepartmentLeader []string `json:"department_leader"` // 部门负责人的UserID
ParentID int `json:"parentid"` // 父部门id。根部门为1
Order int `json:"order"` // 在父部门中的次序值。order值大的排序靠前
DepartmentLeader []string `json:"department_leader"` // 部门负责人的 UserID
ParentID int `json:"parentid"` // 父部门 id。根部门为 1
Order int `json:"order"` // 在父部门中的次序值。order 值大的排序靠前
}
// DepartmentGetResponse 获取单个部门详情
DepartmentGetResponse struct {
@@ -85,7 +85,7 @@ func (r *Client) DepartmentCreate(req *DepartmentCreateRequest) (*DepartmentCrea
return result, err
}
// DepartmentSimpleList 获取子部门ID列表
// DepartmentSimpleList 获取子部门 ID 列表
// see https://developer.work.weixin.qq.com/document/path/95350
func (r *Client) DepartmentSimpleList(departmentID int) ([]*DepartmentID, error) {
var (
@@ -112,13 +112,13 @@ func (r *Client) DepartmentList() ([]*Department, error) {
// DepartmentListByID 获取部门列表
//
// departmentID 部门id。获取指定部门及其下的子部门以及子部门的子部门等等递归
// departmentID 部门 id。获取指定部门及其下的子部门以及子部门的子部门等等递归
//
// @desc https://developer.work.weixin.qq.com/document/path/90208
func (r *Client) DepartmentListByID(departmentID int) ([]*Department, error) {
var formatURL string
// 获取accessToken
// 获取 accessToken
accessToken, err := r.GetAccessToken()
if err != nil {
return nil, err
@@ -130,7 +130,7 @@ func (r *Client) DepartmentListByID(departmentID int) ([]*Department, error) {
formatURL = fmt.Sprintf(departmentListURL, accessToken)
}
// 发起http请求
// 发起 http 请求
response, err := util.HTTPGet(formatURL)
if err != nil {
return nil, err

View File

@@ -83,12 +83,12 @@ type ExtattrItem struct {
Web ExtattrItemWeb `json:"web,omitempty"`
}
// ExtattrItemText 互联企业成员详细信息自定义属性(文本)
// ExtattrItemText 互联企业成员详细信息自定义属性 (文本)
type ExtattrItemText struct {
Value string `json:"value"`
}
// ExtattrItemWeb 互联企业成员详细信息自定义属性(网页)
// ExtattrItemWeb 互联企业成员详细信息自定义属性 (网页)
type ExtattrItemWeb struct {
URL string `json:"url"`
Title string `json:"title"`

View File

@@ -16,11 +16,11 @@ const (
userGetURL = "https://qyapi.weixin.qq.com/cgi-bin/user/get"
// userDeleteURL 删除成员
userDeleteURL = "https://qyapi.weixin.qq.com/cgi-bin/user/delete"
// userListIDURL 获取成员ID列表
// userListIDURL 获取成员 ID 列表
userListIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/list_id"
// convertToOpenIDURL userIDopenID
// convertToOpenIDURL userIDopenID
convertToOpenIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid"
// convertToUserIDURL openIDuserID
// convertToUserIDURL openIDuserID
convertToUserIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_userid"
)
@@ -157,23 +157,23 @@ func (r *Client) UserCreate(req *UserCreateRequest) (*UserCreateResponse, error)
// UserGetResponse 获取部门成员响应
type UserGetResponse struct {
util.CommonError
UserID string `json:"userid"` // 成员UserID。对应管理端的帐号企业内必须唯一。不区分大小写长度为1~64个字节第三方应用返回的值为open_userid
Name string `json:"name"` // 成员名称第三方不可获取调用时返回userid以代替name代开发自建应用需要管理员授权才返回对于非第三方创建的成员第三方通讯录应用也不可获取未返回name的情况需要通过通讯录展示组件来展示名字
Department []int `json:"department"` // 成员所属部门id列表仅返回该应用有查看权限的部门id成员授权模式下固定返回根部门id即固定为1。对授权了“组织架构信息”权限的第三方应用返回成员所属的全部部门id
Order []int `json:"order"` // 部门内的排序值默认为0。数量必须和department一致数值越大排序越前面。值范围是[0, 2^32)。成员授权模式下不返回该字段
UserID string `json:"userid"` // 成员 UserID。对应管理端的帐号企业内必须唯一。不区分大小写长度为 1~64 个字节;第三方应用返回的值为 open_userid
Name string `json:"name"` // 成员名称;第三方不可获取,调用时返回 userid 以代替 name代开发自建应用需要管理员授权才返回对于非第三方创建的成员第三方通讯录应用也不可获取未返回 name 的情况需要通过通讯录展示组件来展示名字
Department []int `json:"department"` // 成员所属部门 id 列表,仅返回该应用有查看权限的部门 id成员授权模式下固定返回根部门 id即固定为 1。对授权了“组织架构信息”权限的第三方应用返回成员所属的全部部门 id
Order []int `json:"order"` // 部门内的排序值,默认为 0。数量必须和 department 一致,数值越大排序越前面。值范围是 [0, 2^32)。成员授权模式下不返回该字段
Position string `json:"position"` // 职务信息;代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
Mobile string `json:"mobile"` // 手机号码代开发自建应用需要管理员授权且成员oauth2授权获取第三方仅通讯录应用可获取对于非第三方创建的成员第三方通讯录应用也不可获取上游企业不可获取下游企业成员该字段
Gender string `json:"gender"` // 性别。0表示未定义1表示男性2表示女性。代开发自建应用需要管理员授权且成员oauth2授权获取第三方仅通讯录应用可获取对于非第三方创建的成员第三方通讯录应用也不可获取上游企业不可获取下游企业成员该字段。注不可获取指返回值0
Email string `json:"email"` // 邮箱代开发自建应用需要管理员授权且成员oauth2授权获取第三方仅通讯录应用可获取对于非第三方创建的成员第三方通讯录应用也不可获取上游企业不可获取下游企业成员该字段
BizMail string `json:"biz_mail"` // 企业邮箱代开发自建应用需要管理员授权且成员oauth2授权获取第三方仅通讯录应用可获取对于非第三方创建的成员第三方通讯录应用也不可获取上游企业不可获取下游企业成员该字段
IsLeaderInDept []int `json:"is_leader_in_dept"` // 表示在所在的部门内是否为部门负责人数量与department一致第三方通讯录应用或者授权了“组织架构信息-应用可获取企业的部门组织架构信息-部门负责人”权限的第三方应用可获取;对于非第三方创建的成员,第三方通讯录应用不可获取;上游企业不可获取下游企业成员该字段
DirectLeader []string `json:"direct_leader"` // 直属上级UserID返回在应用可见范围内的直属上级列表最多有五个直属上级第三方通讯录应用或者授权了“组织架构信息-应用可获取可见范围内成员组织架构信息-直属上级”权限的第三方应用可获取;对于非第三方创建的成员,第三方通讯录应用不可获取;上游企业不可获取下游企业成员该字段;代开发自建应用不可获取该字段
Avatar string `json:"avatar"` // 头像url。 代开发自建应用需要管理员授权且成员oauth2授权获取第三方仅通讯录应用可获取对于非第三方创建的成员第三方通讯录应用也不可获取上游企业不可获取下游企业成员该字段
ThumbAvatar string `json:"thumb_avatar"` // 头像缩略图url。第三方仅通讯录应用可获取对于非第三方创建的成员第三方通讯录应用也不可获取上游企业不可获取下游企业成员该字段
Mobile string `json:"mobile"` // 手机号码,代开发自建应用需要管理员授权且成员 oauth2 授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
Gender string `json:"gender"` // 性别。0 表示未定义1 表示男性2 表示女性。代开发自建应用需要管理员授权且成员 oauth2 授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段。注:不可获取指返回值 0
Email string `json:"email"` // 邮箱,代开发自建应用需要管理员授权且成员 oauth2 授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
BizMail string `json:"biz_mail"` // 企业邮箱,代开发自建应用需要管理员授权且成员 oauth2 授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
IsLeaderInDept []int `json:"is_leader_in_dept"` // 表示在所在的部门内是否为部门负责人,数量与 department 一致;第三方通讯录应用或者授权了“组织架构信息 - 应用可获取企业的部门组织架构信息 - 部门负责人”权限的第三方应用可获取;对于非第三方创建的成员,第三方通讯录应用不可获取;上游企业不可获取下游企业成员该字段
DirectLeader []string `json:"direct_leader"` // 直属上级 UserID返回在应用可见范围内的直属上级列表最多有五个直属上级第三方通讯录应用或者授权了“组织架构信息 - 应用可获取可见范围内成员组织架构信息 - 直属上级”权限的第三方应用可获取;对于非第三方创建的成员,第三方通讯录应用不可获取;上游企业不可获取下游企业成员该字段;代开发自建应用不可获取该字段
Avatar string `json:"avatar"` // 头像 url。代开发自建应用需要管理员授权且成员 oauth2 授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
ThumbAvatar string `json:"thumb_avatar"` // 头像缩略图 url。第三方仅通讯录应用可获取对于非第三方创建的成员第三方通讯录应用也不可获取上游企业不可获取下游企业成员该字段
Telephone string `json:"telephone"` // 座机。代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
Alias string `json:"alias"` // 别名;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
Address string `json:"address"` // 地址。代开发自建应用需要管理员授权且成员oauth2授权获取第三方仅通讯录应用可获取对于非第三方创建的成员第三方通讯录应用也不可获取上游企业不可获取下游企业成员该字段
OpenUserid string `json:"open_userid"` // 全局唯一。对于同一个服务商不同应用获取到企业内同一个成员的open_userid是相同的最多64个字节。仅第三方应用可获取
Address string `json:"address"` // 地址。代开发自建应用需要管理员授权且成员 oauth2 授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
OpenUserid string `json:"open_userid"` // 全局唯一。对于同一个服务商,不同应用获取到企业内同一个成员的 open_userid 是相同的,最多 64 个字节。仅第三方应用可获取
MainDepartment int `json:"main_department"` // 主部门,仅当应用对主部门有查看权限时返回。
Extattr struct {
Attrs []struct {
@@ -188,9 +188,9 @@ type UserGetResponse struct {
} `json:"web,omitempty"`
} `json:"attrs"`
} `json:"extattr"` // 扩展属性,代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
Status int `json:"status"` // 激活状态: 1=已激活2=已禁用4=未激活5=退出企业。 已激活代表已激活企业微信或已关注微信插件(原企业号)。未激活代表既未激活企业微信又未关注微信插件(原企业号)。
QrCode string `json:"qr_code"` // 员工个人二维码,扫描可添加为外部联系人(注意返回的是一个url可在浏览器上打开该url以展示二维码)代开发自建应用需要管理员授权且成员oauth2授权获取第三方仅通讯录应用可获取对于非第三方创建的成员第三方通讯录应用也不可获取上游企业不可获取下游企业成员该字段
ExternalPosition string `json:"external_position"` // 对外职务如果设置了该值则以此作为对外展示的职务否则以position来展示。代开发自建应用需要管理员授权才返回第三方仅通讯录应用可获取对于非第三方创建的成员第三方通讯录应用也不可获取上游企业不可获取下游企业成员该字段
Status int `json:"status"` // 激活状态1=已激活2=已禁用4=未激活5=退出企业。已激活代表已激活企业微信或已关注微信插件(原企业号)。未激活代表既未激活企业微信又未关注微信插件(原企业号)。
QrCode string `json:"qr_code"` // 员工个人二维码,扫描可添加为外部联系人 (注意返回的是一个 url可在浏览器上打开该 url 以展示二维码);代开发自建应用需要管理员授权且成员 oauth2 授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
ExternalPosition string `json:"external_position"` // 对外职务,如果设置了该值,则以此作为对外展示的职务,否则以 position 来展示。代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
ExternalProfile struct {
ExternalCorpName string `json:"external_corp_name"`
WechatChannels struct {
@@ -275,26 +275,26 @@ func (r *Client) UserDelete(userID string) (*UserDeleteResponse, error) {
return result, err
}
// UserListIDRequest 获取成员ID列表请求
// UserListIDRequest 获取成员 ID 列表请求
type UserListIDRequest struct {
Cursor string `json:"cursor"`
Limit int `json:"limit"`
}
// UserListIDResponse 获取成员ID列表响应
// UserListIDResponse 获取成员 ID 列表响应
type UserListIDResponse struct {
util.CommonError
NextCursor string `json:"next_cursor"`
DeptUser []*DeptUser `json:"dept_user"`
}
// DeptUser 用户-部门关系
// DeptUser 用户 - 部门关系
type DeptUser struct {
UserID string `json:"userid"`
Department int `json:"department"`
}
// UserListID 获取成员ID列表
// UserListID 获取成员 ID 列表
// see https://developer.work.weixin.qq.com/document/path/96067
func (r *Client) UserListID(req *UserListIDRequest) (*UserListIDResponse, error) {
var (
@@ -319,19 +319,19 @@ func (r *Client) UserListID(req *UserListIDRequest) (*UserListIDResponse, error)
}
type (
// convertToOpenIDRequest userIDopenID请求
// convertToOpenIDRequest userIDopenID 请求
convertToOpenIDRequest struct {
UserID string `json:"userid"`
}
// convertToOpenIDResponse userIDopenID响应
// convertToOpenIDResponse userIDopenID 响应
convertToOpenIDResponse struct {
util.CommonError
OpenID string `json:"openid"`
}
)
// ConvertToOpenID userIDopenID
// ConvertToOpenID userIDopenID
// see https://developer.work.weixin.qq.com/document/path/90202
func (r *Client) ConvertToOpenID(userID string) (string, error) {
var (
@@ -359,19 +359,19 @@ func (r *Client) ConvertToOpenID(userID string) (string, error) {
}
type (
// convertToUserIDRequest openIDuserID请求
// convertToUserIDRequest openIDuserID 请求
convertToUserIDRequest struct {
OpenID string `json:"openid"`
}
// convertToUserIDResponse openIDuserID响应
// convertToUserIDResponse openIDuserID 响应
convertToUserIDResponse struct {
util.CommonError
UserID string `json:"userid"`
}
)
// ConvertToUserID openIDuserID
// ConvertToUserID openIDuserID
// see https://developer.work.weixin.qq.com/document/path/90202
func (r *Client) ConvertToUserID(openID string) (string, error) {
var (

View File

@@ -15,11 +15,11 @@ const (
type (
// SendRequestCommon 发送应用推送消息请求公共参数
SendRequestCommon struct {
// 群聊id
// 群聊 id
ChatID string `json:"chatid"`
// 消息类型
MsgType string `json:"msgtype"`
// 表示是否是保密消息0表示否1表示是默认0
// 表示是否是保密消息0 表示否1 表示是,默认 0
Safe int `json:"safe"`
}
@@ -35,7 +35,7 @@ type (
}
// TextField 文本消息参数
TextField struct {
// 消息内容最长不超过2048个字节
// 消息内容,最长不超过 2048 个字节
Content string `json:"content"`
}
@@ -46,7 +46,7 @@ type (
}
// ImageField 图片消息参数
ImageField struct {
// 图片媒体文件id可以调用上传临时素材接口获取
// 图片媒体文件 id可以调用上传临时素材接口获取
MediaID string `json:"media_id"`
}
@@ -57,7 +57,7 @@ type (
}
// VoiceField 语音消息参数
VoiceField struct {
// 语音文件id可以调用上传临时素材接口获取
// 语音文件 id可以调用上传临时素材接口获取
MediaID string `json:"media_id"`
}
)
@@ -65,7 +65,7 @@ type (
// Send 发送应用消息
// @desc 实现企业微信发送应用消息接口https://developer.work.weixin.qq.com/document/path/90248
func (r *Client) Send(apiName string, request interface{}) (*SendResponse, error) {
// 获取accessToken
// 获取 accessToken
accessToken, err := r.GetAccessToken()
if err != nil {
return nil, err
@@ -75,7 +75,7 @@ func (r *Client) Send(apiName string, request interface{}) (*SendResponse, error
if err != nil {
return nil, err
}
// 发起http请求
// 发起 http 请求
response, err := util.HTTPPost(fmt.Sprintf(sendURL, accessToken), string(jsonData))
if err != nil {
return nil, err
@@ -89,25 +89,25 @@ func (r *Client) Send(apiName string, request interface{}) (*SendResponse, error
// SendText 发送文本消息
func (r *Client) SendText(request SendTextRequest) (*SendResponse, error) {
// 发送文本消息MsgType参数固定为text
// 发送文本消息 MsgType 参数固定为text
request.MsgType = "text"
return r.Send("MessageSendText", request)
}
// SendImage 发送图片消息
func (r *Client) SendImage(request SendImageRequest) (*SendResponse, error) {
// 发送图片消息MsgType参数固定为image
// 发送图片消息 MsgType 参数固定为image
request.MsgType = "image"
return r.Send("MessageSendImage", request)
}
// SendVoice 发送语音消息
func (r *Client) SendVoice(request SendVoiceRequest) (*SendResponse, error) {
// 发送语音消息MsgType参数固定为voice
// 发送语音消息 MsgType 参数固定为voice
request.MsgType = "voice"
return r.Send("MessageSendVoice", request)
}
// 以上实现了部分常用消息推送SendText 发送文本消息、SendImage 发送图片消息、SendVoice 发送语音消息,
// 如需扩展其他消息类型,建议按照以上格式,扩展对应消息类型的参数即可
// 也可以直接使用Send方法按照企业微信消息推送的接口文档传对应消息类型的参数来使用
// 也可以直接使用 Send 方法,按照企业微信消息推送的接口文档传对应消息类型的参数来使用

View File

@@ -1,4 +1,4 @@
// Package appchat 应用发送消息到群聊会话,企业微信接口https://developer.work.weixin.qq.com/document/path/90248
// Package appchat 应用发送消息到群聊会话企业微信接口https://developer.work.weixin.qq.com/document/path/90248
package appchat
import (

View File

@@ -217,7 +217,7 @@ type OptionGroupSpeOffDays struct {
EndTime int64 `json:"endtime"`
}
// OptionGroupWifiMacInfos WIFI信息
// OptionGroupWifiMacInfos WIFI 信息
type OptionGroupWifiMacInfos struct {
WifiName string `json:"wifiname"`
WifiMac string `json:"wifimac"`

View File

@@ -19,7 +19,7 @@ const (
getOptionURL = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckinoption?access_token=%s"
// getScheduleListURL 获取打卡人员排班信息
getScheduleListURL = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckinschedulist?access_token=%s"
// getHardwareDataURL获取设备打卡数据
// getHardwareDataURL 获取设备打卡数据
getHardwareDataURL = "https://qyapi.weixin.qq.com/cgi-bin/hardware/get_hardware_checkin_data?access_token=%s"
)
@@ -138,17 +138,17 @@ type (
SpDescription SpDescription `json:"sp_description"`
}
// SpTitle 假勤信息摘要-标题信息
// SpTitle 假勤信息摘要 - 标题信息
SpTitle struct {
Data []SpData `json:"data"`
}
// SpDescription 假勤信息摘要-描述信息
// SpDescription 假勤信息摘要 - 描述信息
SpDescription struct {
Data []SpData `json:"data"`
}
// SpData 假勤信息(多种语言描述,目前只有中文一种)
// SpData 假勤信息 (多种语言描述,目前只有中文一种)
SpData struct {
Lang string `json:"lang"`
Text string `json:"text"`
@@ -324,26 +324,26 @@ type GroupCheckinTime struct {
RemindOffWorkSec int64 `json:"remind_off_work_sec"`
}
// SpeWorkdays 特殊日期-必须打卡日期信息
// SpeWorkdays 特殊日期 - 必须打卡日期信息
type SpeWorkdays struct {
Timestamp int64 `json:"timestamp"`
Notes string `json:"notes"`
CheckinTime []GroupCheckinTime `json:"checkintime"`
}
// SpeOffDays 特殊日期-不用打卡日期信息
// SpeOffDays 特殊日期 - 不用打卡日期信息
type SpeOffDays struct {
Timestamp int64 `json:"timestamp"`
Notes string `json:"notes"`
}
// WifiMacInfos 打卡地点-WiFi打卡信息
// WifiMacInfos 打卡地点-WiFi 打卡信息
type WifiMacInfos struct {
WifiName string `json:"wifiname"`
WifiMac string `json:"wifimac"`
}
// LocInfos 打卡地点-位置打卡信息
// LocInfos 打卡地点 - 位置打卡信息
type LocInfos struct {
Lat int64 `json:"lat"`
Lng int64 `json:"lng"`
@@ -365,7 +365,7 @@ type ReporterInfo struct {
UpdateTime int64 `json:"updatetime"`
}
// Reporters 汇报对象每个汇报人用userid表示
// Reporters 汇报对象,每个汇报人用 userid 表示
type Reporters struct {
UserID string `json:"userid"`
}
@@ -378,7 +378,7 @@ type GroupOtInfo struct {
OtCheckInfo OtCheckInfo `json:"otcheckinfo"`
}
// OtCheckInfo 以打卡时间为准-加班时长计算规则信息
// OtCheckInfo 以打卡时间为准 - 加班时长计算规则信息
type OtCheckInfo struct {
OtWorkingDayTimeStart int64 `json:"ot_workingday_time_start"`
OtWorkingDayTimeMin int64 `json:"ot_workingday_time_min"`
@@ -390,25 +390,25 @@ type OtCheckInfo struct {
OtNonWorkingDayRestInfo OtRestInfo `json:"ot_nonworkingday_restinfo"`
}
// OtRestInfo 加班-休息扣除配置信息
// OtRestInfo 加班 - 休息扣除配置信息
type OtRestInfo struct {
Type int64 `json:"type"`
FixTimeRule FixTimeRule `json:"fix_time_rule"`
CalOtTimeRule CalOtTimeRule `json:"cal_ottime_rule"`
}
// FixTimeRule 工作日加班-指定休息时间配置信息
// FixTimeRule 工作日加班 - 指定休息时间配置信息
type FixTimeRule struct {
FixTimeBeginSec int64 `json:"fix_time_begin_sec"`
FixTimeEndSec int64 `json:"fix_time_end_sec"`
}
// CalOtTimeRule 工作日加班-按加班时长扣除配置信息
// CalOtTimeRule 工作日加班 - 按加班时长扣除配置信息
type CalOtTimeRule struct {
Items []CalOtTimeRuleItem `json:"items"`
}
// CalOtTimeRuleItem 工作日加班-按加班时长扣除条件信息
// CalOtTimeRuleItem 工作日加班 - 按加班时长扣除条件信息
type CalOtTimeRuleItem struct {
OtTime int64 `json:"ot_time"`
RestTime int64 `json:"rest_time"`

View File

@@ -1,4 +1,4 @@
// Package config 企业微信config配置
// Package config 企业微信 config 配置
package config
import (
@@ -8,11 +8,11 @@ import (
// Config for 企业微信
type Config struct {
CorpID string `json:"corp_id"` // corp_id
CorpSecret string `json:"corp_secret"` // corp_secret,如果需要获取会话存档实例当前参数请填写聊天内容存档的Secret可以在企业微信管理端--管理工具--聊天内容存档查看
CorpSecret string `json:"corp_secret"` // corp_secret如果需要获取会话存档实例,当前参数请填写聊天内容存档的 Secret可以在企业微信管理端--管理工具--聊天内容存档查看
AgentID string `json:"agent_id"` // agent_id
Cache cache.Cache
RasPrivateKey string // 消息加密私钥,可以在企业微信管理端--管理工具--消息加密公钥查看对用公钥,私钥一般由自己保存
Token string `json:"token"` // 微信客服回调配置,用于生成签名校验回调请求的合法性
EncodingAESKey string `json:"encoding_aes_key"` // 微信客服回调p配置,用于解密回调消息内容对应的密文
EncodingAESKey string `json:"encoding_aes_key"` // 微信客服回调 p 配置,用于解密回调消息内容对应的密文
}

View File

@@ -8,8 +8,8 @@ import (
// 原始回调消息内容
type callbackOriginMessage struct {
ToUserName string // 企业微信的CorpID当为第三方套件回调事件时CorpID的内容为suiteid
AgentID string // 接收的应用id可在应用的设置页面获取
ToUserName string // 企业微信的 CorpID当为第三方套件回调事件时CorpID 的内容为 suiteid
AgentID string // 接收的应用 id可在应用的设置页面获取
Encrypt string // 消息结构体加密后的字符串
}

View File

@@ -116,7 +116,7 @@ type (
util.CommonError
ContactWay ContactWay `json:"contact_way"`
}
// ContactWay 「联系我」配置
// ContactWay「联系我」配置
ContactWay struct {
ConfigID string `json:"config_id"`
Type int `json:"type"`
@@ -209,7 +209,7 @@ type (
ContactWay []*ContactWayForList `json:"contact_way"`
NextCursor string `json:"next_cursor"`
}
// ContactWayForList 「联系我」配置
// ContactWayForList「联系我」配置
ContactWayForList struct {
ConfigID string `json:"config_id"`
}

View File

@@ -104,7 +104,7 @@ type WechatChannel struct {
Source int `json:"source"`
}
// ExternalProfile 外部联系人的自定义展示信息,可以有多个字段和多种类型,包括文本,网页和小程序
// ExternalProfile 外部联系人的自定义展示信息可以有多个字段和多种类型,包括文本,网页和小程序
type ExternalProfile struct {
ExternalCorpName string `json:"external_corp_name"`
WechatChannels WechatChannels `json:"wechat_channels"`
@@ -276,7 +276,7 @@ type ListCustomerStrategyResponse struct {
NextCursor string `json:"next_cursor"`
}
// StrategyID 规则组ID
// StrategyID 规则组 ID
type StrategyID struct {
StrategyID int `json:"strategy_id"`
}

View File

@@ -6,14 +6,14 @@ import (
"github.com/silenceper/wechat/v2/util"
)
// opengIDToChatIDURL 客户群opengid转换URL
// opengIDToChatIDURL 客户群 opengid 转换 URL
const opengIDToChatIDURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/opengid_to_chatid"
type (
//GroupChatListRequest 获取客户群列表的请求参数
GroupChatListRequest struct {
StatusFilter int `json:"status_filter"` // 非必填 客户群跟进状态过滤。0 - 所有列表(即不过滤) 1 - 离职待继承 2 - 离职继承中 3 - 离职继承完成
OwnerFilter OwnerFilter `json:"owner_filter"` //非必填 群主过滤。如果不填表示获取应用可见范围内全部群主的数据但是不建议这么用如果可见范围人数超过1000人为了防止数据包过大会报错 81017
StatusFilter int `json:"status_filter"` // 非必填 客户群跟进状态过滤。0 - 所有列表 (即不过滤) 1 - 离职待继承 2 - 离职继承中 3 - 离职继承完成
OwnerFilter OwnerFilter `json:"owner_filter"` //非必填 群主过滤。如果不填,表示获取应用可见范围内全部群主的数据(但是不建议这么用,如果可见范围人数超过 1000 人,为了防止数据包过大,会报错 81017
Cursor string `json:"cursor"` //非必填 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用不填
Limit int `json:"limit"` //必填 分页,预期请求的数据量,取值范围 1 ~ 1000
}
@@ -56,29 +56,29 @@ type (
}
//Invitor 邀请者
Invitor struct {
UserID string `json:"userid"` //邀请者的userid
UserID string `json:"userid"` //邀请者的 userid
}
//GroupChatMember 群成员
GroupChatMember struct {
UserID string `json:"userid"` //群成员id
Type int `json:"type"` //成员类型。 1 - 企业成员 2 - 外部联系人
UserID string `json:"userid"` //群成员 id
Type int `json:"type"` //成员类型。1 - 企业成员 2 - 外部联系人
JoinTime int `json:"join_time"` //入群时间
JoinScene int `json:"join_scene"` //入群方式 1 - 由群成员邀请入群(直接邀请入群) 2 - 由群成员邀请入群(通过邀请链接入群) 3 - 通过扫描群二维码入群
JoinScene int `json:"join_scene"` //入群方式 1 - 由群成员邀请入群直接邀请入群2 - 由群成员邀请入群通过邀请链接入群3 - 通过扫描群二维码入群
Invitor Invitor `json:"invitor,omitempty"` //邀请者。目前仅当是由本企业内部成员邀请入群时会返回该值
GroupNickname string `json:"group_nickname"` //在群里的昵称
Name string `json:"name"` //名字。仅当 need_name = 1 时返回 如果是微信用户,则返回其在微信中设置的名字 如果是企业微信联系人,则返回其设置对外展示的别名或实名
UnionID string `json:"unionid,omitempty"` //外部联系人在微信开放平台的唯一身份标识微信unionid通过此字段企业可将外部联系人与公众号/小程序用户关联起来。仅当群成员类型是微信用户包括企业成员未添加好友且企业绑定了微信开发者ID有此字段查看绑定方法。第三方不可获取上游企业不可获取下游企业客户的unionid字段
State string `json:"state,omitempty"` //如果在配置入群方式时配置了state参数那么在获取客户群详情时通过该方式入群的成员会额外获取到相应的state参数
UnionID string `json:"unionid,omitempty"` //外部联系人在微信开放平台的唯一身份标识(微信 unionid通过此字段企业可将外部联系人与公众号/小程序用户关联起来。仅当群成员类型是微信用户(包括企业成员未添加好友),且企业绑定了微信开发者 ID 有此字段(查看绑定方法)。第三方不可获取,上游企业不可获取下游企业客户的 unionid 字段
State string `json:"state,omitempty"` //如果在配置入群方式时,配置了 state 参数,那么在获取客户群详情时,通过该方式入群的成员,会额外获取到相应的 state 参数
}
//GroupChatAdmin 群管理员
GroupChatAdmin struct {
UserID string `json:"userid"` //群管理员userid
UserID string `json:"userid"` //群管理员 userid
}
//GroupChat 客户群详情
GroupChat struct {
ChatID string `json:"chat_id"` //客户群ID
ChatID string `json:"chat_id"` //客户群 ID
Name string `json:"name"` //群名
Owner string `json:"owner"` //群主ID
Owner string `json:"owner"` //群主 ID
CreateTime int64 `json:"create_time"` //群的创建时间
Notice string `json:"notice"` //群公告
MemberList []GroupChatMember `json:"member_list"` //群成员列表
@@ -110,18 +110,18 @@ func (r *Client) GetGroupChatDetail(req *GroupChatDetailRequest) (*GroupChatDeta
}
type (
//OpengIDToChatIDRequest 客户群opengid转换 请求参数
//OpengIDToChatIDRequest 客户群 opengid 转换 请求参数
OpengIDToChatIDRequest struct {
OpengID string `json:"opengid"`
}
//OpengIDToChatIDResponse 客户群opengid转换 返回值
//OpengIDToChatIDResponse 客户群 opengid 转换 返回值
OpengIDToChatIDResponse struct {
util.CommonError
ChatID string `json:"chat_id"` //客户群ID
ChatID string `json:"chat_id"` //客户群 ID
}
)
// OpengIDToChatID 客户群opengid转换
// OpengIDToChatID 客户群 opengid 转换
// @see https://developer.work.weixin.qq.com/document/path/94828
func (r *Client) OpengIDToChatID(req *OpengIDToChatIDRequest) (*OpengIDToChatIDResponse, error) {
accessToken, err := r.GetAccessToken()

View File

@@ -12,13 +12,13 @@ const groupChatURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupc
type (
// AddJoinWayRequest 添加群配置请求参数
AddJoinWayRequest struct {
Scene int `json:"scene"` // 必填 1 - 群的小程序插件,2 - 群的二维码插件
Remark string `json:"remark"` //非必填 联系方式的备注信息用于助记超过30个字符将被截断
AutoCreateRoom int `json:"auto_create_room"` //非必填 当群满了后是否自动新建群。0-否1-是。 默认为1
RoomBaseName string `json:"room_base_name"` //非必填 自动建群的群名前缀当auto_create_room为1时有效。最长40utf8字符
RoomBaseID int `json:"room_base_id"` //非必填 自动建群的群起始序号当auto_create_room为1时有效
ChatIDList []string `json:"chat_id_list"` //必填 使用该配置的客户群ID列表支持5个。见客户群ID获取方法
State string `json:"state"` //非必填 企业自定义的state参数用于区分不同的入群渠道。不超过30UTF-8字符
Scene int `json:"scene"` // 必填 1 - 群的小程序插件2 - 群的二维码插件
Remark string `json:"remark"` //非必填 联系方式的备注信息,用于助记,超过 30 个字符将被截断
AutoCreateRoom int `json:"auto_create_room"` //非必填 当群满了后是否自动新建群。0-否1-是。默认为 1
RoomBaseName string `json:"room_base_name"` //非必填 自动建群的群名前缀,当 auto_create_room 为 1 时有效。最长 40utf8 字符
RoomBaseID int `json:"room_base_id"` //非必填 自动建群的群起始序号,当 auto_create_room 为 1 时有效
ChatIDList []string `json:"chat_id_list"` //必填 使用该配置的客户群 ID 列表,支持 5 个。见客户群 ID 获取方法
State string `json:"state"` //非必填 企业自定义的 state 参数,用于区分不同的入群渠道。不超过 30UTF-8 字符
}
// AddJoinWayResponse 添加群配置返回值
@@ -96,13 +96,13 @@ func (r *Client) GetJoinWay(req *JoinWayConfigRequest) (*GetJoinWayResponse, err
// UpdateJoinWayRequest 更新群配置的请求参数
type UpdateJoinWayRequest struct {
ConfigID string `json:"config_id"`
Scene int `json:"scene"` // 必填 1 - 群的小程序插件,2 - 群的二维码插件
Remark string `json:"remark"` //非必填 联系方式的备注信息用于助记超过30个字符将被截断
AutoCreateRoom int `json:"auto_create_room"` //非必填 当群满了后是否自动新建群。0-否1-是。 默认为1
RoomBaseName string `json:"room_base_name"` //非必填 自动建群的群名前缀当auto_create_room为1时有效。最长40utf8字符
RoomBaseID int `json:"room_base_id"` //非必填 自动建群的群起始序号当auto_create_room为1时有效
ChatIDList []string `json:"chat_id_list"` //必填 使用该配置的客户群ID列表支持5个。见客户群ID获取方法
State string `json:"state"` //非必填 企业自定义的state参数用于区分不同的入群渠道。不超过30UTF-8字符
Scene int `json:"scene"` // 必填 1 - 群的小程序插件2 - 群的二维码插件
Remark string `json:"remark"` //非必填 联系方式的备注信息,用于助记,超过 30 个字符将被截断
AutoCreateRoom int `json:"auto_create_room"` //非必填 当群满了后是否自动新建群。0-否1-是。默认为 1
RoomBaseName string `json:"room_base_name"` //非必填 自动建群的群名前缀,当 auto_create_room 为 1 时有效。最长 40utf8 字符
RoomBaseID int `json:"room_base_id"` //非必填 自动建群的群起始序号,当 auto_create_room 为 1 时有效
ChatIDList []string `json:"chat_id_list"` //必填 使用该配置的客户群 ID 列表,支持 5 个。见客户群 ID 获取方法
State string `json:"state"` //非必填 企业自定义的 state 参数,用于区分不同的入群渠道。不超过 30UTF-8 字符
}
// UpdateJoinWay 更新客户群进群方式配置

View File

@@ -441,7 +441,7 @@ type ListMomentStrategyResponse struct {
NextCursor string `json:"next_cursor"`
}
// MomentStrategyID 规则组ID
// MomentStrategyID 规则组 ID
type MomentStrategyID struct {
StrategyID int `json:"strategy_id"`
}

View File

@@ -81,7 +81,7 @@ type (
NextOffset int `json:"next_offset"`
Items []GroupChatStatItem `json:"items"`
}
// GroupChatStatItem 群聊数据统计(按群主聚合)条目
// GroupChatStatItem 群聊数据统计 (按群主聚合) 条目
GroupChatStatItem struct {
Owner string `json:"owner"`
Data GroupChatStatItemData `json:"data"`
@@ -138,7 +138,7 @@ type (
util.CommonError
Items []GetGroupChatStatByDayItem `json:"items"`
}
// GetGroupChatStatByDayItem 群聊数据统计(按自然日聚合)条目
// GetGroupChatStatByDayItem 群聊数据统计 (按自然日聚合) 条目
GetGroupChatStatByDayItem struct {
StatTime int `json:"stat_time"`
Data GroupChatStatItemData `json:"data"`

View File

@@ -1,3 +1,3 @@
### 微信客服SDK
### 微信客服 SDK
相关文档正在梳理中...

View File

@@ -22,14 +22,14 @@ const (
// AccountAddOptions 添加客服账号请求参数
type AccountAddOptions struct {
Name string `json:"name"` // 客服帐号名称, 不多于16个字符
MediaID string `json:"media_id"` // 客服头像临时素材。可以调用上传临时素材接口获取, 不多于128个字节
Name string `json:"name"` // 客服帐号名称不多于 16 个字符
MediaID string `json:"media_id"` // 客服头像临时素材。可以调用上传临时素材接口获取不多于 128 个字节
}
// AccountAddSchema 添加客服账号响应内容
type AccountAddSchema struct {
util.CommonError
OpenKFID string `json:"open_kfid"` // 新创建的客服张号ID
OpenKFID string `json:"open_kfid"` // 新创建的客服张号 ID
}
// AccountAdd 添加客服账号
@@ -55,7 +55,7 @@ func (r *Client) AccountAdd(options AccountAddOptions) (info AccountAddSchema, e
// AccountDelOptions 删除客服账号请求参数
type AccountDelOptions struct {
OpenKFID string `json:"open_kfid"` // 客服帐号ID, 不多于64字节
OpenKFID string `json:"open_kfid"` // 客服帐号 ID, 不多于 64 字节
}
// AccountDel 删除客服账号
@@ -81,9 +81,9 @@ func (r *Client) AccountDel(options AccountDelOptions) (info util.CommonError, e
// AccountUpdateOptions 修改客服账号请求参数
type AccountUpdateOptions struct {
OpenKFID string `json:"open_kfid"` // 客服帐号ID, 不多于64字节
Name string `json:"name"` // 客服帐号名称, 不多于16个字符
MediaID string `json:"media_id"` // 客服头像临时素材。可以调用上传临时素材接口获取, 不多于128个字节
OpenKFID string `json:"open_kfid"` // 客服帐号 ID, 不多于 64 字节
Name string `json:"name"` // 客服帐号名称不多于 16 个字符
MediaID string `json:"media_id"` // 客服头像临时素材。可以调用上传临时素材接口获取不多于 128 个字节
}
// AccountUpdate 修复客服账号
@@ -109,9 +109,9 @@ func (r *Client) AccountUpdate(options AccountUpdateOptions) (info util.CommonEr
// AccountInfoSchema 客服详情
type AccountInfoSchema struct {
OpenKFID string `json:"open_kfid"` // 客服帐号ID
OpenKFID string `json:"open_kfid"` // 客服帐号 ID
Name string `json:"name"` // 客服帐号名称
Avatar string `json:"avatar"` // 客服头像URL
Avatar string `json:"avatar"` // 客服头像 URL
}
// AccountListSchema 获取客服账号列表响应内容
@@ -142,19 +142,19 @@ func (r *Client) AccountList() (info AccountListSchema, err error) {
}
// AddContactWayOptions 获取客服账号链接
// 1.若scene非空返回的客服链接开发者可拼接scene_param=SCENE_PARAM参数使用用户进入会话事件会将SCENE_PARAM原样返回。其中SCENE_PARAM需要urlencode且长度不能超过128字节。
// 1.若 scene 非空,返回的客服链接开发者可拼接 scene_param=SCENE_PARAM 参数使用,用户进入会话事件会将 SCENE_PARAM 原样返回。其中 SCENE_PARAM 需要 urlencode且长度不能超过 128 字节。
// 如 https://work.weixin.qq.com/kf/kfcbf8f8d07ac7215f?enc_scene=ENCGFSDF567DF&scene_param=a%3D1%26b%3D2
// 2.历史调用接口返回的客服链接包含encScene=XXX参数不支持scene_param参数。
// 2.历史调用接口返回的客服链接(包含 encScene=XXX 参数),不支持 scene_param 参数。
// 3.返回的客服链接,不能修改或复制参数到其他链接使用。否则进入会话事件参数校验不通过,导致无法回调。
type AddContactWayOptions struct {
OpenKFID string `json:"open_kfid"` // 客服帐号ID, 不多于64字节
Scene string `json:"scene"` // 场景值,字符串类型,由开发者自定义, 不多于32字节, 字符串取值范围(正则表达式)[0-9a-zA-Z_-]*
OpenKFID string `json:"open_kfid"` // 客服帐号 ID, 不多于 64 字节
Scene string `json:"scene"` // 场景值,字符串类型,由开发者自定义不多于 32 字节字符串取值范围 (正则表达式)[0-9a-zA-Z_-]*
}
// AddContactWaySchema 获取客服账号链接响应内容
type AddContactWaySchema struct {
util.CommonError
URL string `json:"url"` // 客服链接开发者可将该链接嵌入到H5页面中用户点击链接即可向对应的微信客服帐号发起咨询。开发者也可根据该url自行生成需要的二维码图片
URL string `json:"url"` // 客服链接,开发者可将该链接嵌入到 H5 页面中,用户点击链接即可向对应的微信客服帐号发起咨询。开发者也可根据该 url 自行生成需要的二维码图片
}
// AddContactWay 获取客服账号链接

View File

@@ -16,14 +16,14 @@ type SignatureOptions struct {
// VerifyURL 验证请求参数是否合法并返回解密后的消息内容
//
// //Gin框架的使用示例
// //Gin 框架的使用示例
// r.GET("/v1/event/callback", func(c *gin.Context) {
// options := kf.SignatureOptions{}
// //获取回调的的校验参数
// if = c.ShouldBindQuery(&options); err != nil {
// c.String(http.StatusUnauthorized, "参数解析失败")
// }
// // 调用VerifyURL方法校验当前请求如果合法则把解密后的内容作为响应返回给微信服务器
// // 调用 VerifyURL 方法校验当前请求,如果合法则把解密后的内容作为响应返回给微信服务器
// echo, err := kfClient.VerifyURL(options)
// if err == nil {
// c.String(http.StatusOK, echo)
@@ -45,24 +45,24 @@ func (r *Client) VerifyURL(options SignatureOptions) (string, error) {
// 原始回调消息内容
type callbackOriginMessage struct {
ToUserName string // 企业微信的CorpID当为第三方套件回调事件时CorpID的内容为suiteid
AgentID string // 接收的应用id可在应用的设置页面获取
ToUserName string // 企业微信的 CorpID当为第三方套件回调事件时CorpID 的内容为 suiteid
AgentID string // 接收的应用 id可在应用的设置页面获取
Encrypt string // 消息结构体加密后的字符串
}
// CallbackMessage 微信客服回调消息
type CallbackMessage struct {
ToUserName string `json:"to_user_name" xml:"ToUserName"` // 微信客服组件ID
CreateTime int64 `json:"create_time" xml:"CreateTime"` // 消息创建时间unix时间戳
ToUserName string `json:"to_user_name" xml:"ToUserName"` // 微信客服组件 ID
CreateTime int64 `json:"create_time" xml:"CreateTime"` // 消息创建时间unix 时间戳
MsgType string `json:"msgtype" xml:"MsgType"` // 消息的类型,此时固定为 event
Event string `json:"event" xml:"Event"` // 事件的类型,此时固定为 kf_msg_or_event
Token string `json:"token" xml:"Token"` // 调用拉取消息接口时需要传此token用于校验请求的合法性
OpenKfID string `json:"open_kfid" xml:"OpenKfId"` // 有新消息的客服帐号。可通过sync_msg接口指定open_kfid获取此客服帐号的消息
Token string `json:"token" xml:"Token"` // 调用拉取消息接口时,需要传此 token用于校验请求的合法性
OpenKfID string `json:"open_kfid" xml:"OpenKfId"` // 有新消息的客服帐号。可通过 sync_msg 接口指定 open_kfid 获取此客服帐号的消息
}
// GetCallbackMessage 获取回调事件中的消息内容
//
// //Gin框架的使用示例
// //Gin 框架的使用示例
// r.POST("/v1/event/callback", func(c *gin.Context) {
// var (
// message kf.CallbackMessage

View File

@@ -9,10 +9,10 @@ import (
// Client 微信客服实例
type Client struct {
corpID string // 企业ID企业开通的每个微信客服都对应唯一的企业ID企业可在微信客服管理后台的企业信息处查看
secret string // Secret是微信客服用于校验开发者身份的访问密钥企业成功注册微信客服后可在「微信客服管理后台-开发配置」处获取
corpID string // 企业 ID企业开通的每个微信客服都对应唯一的企业 ID企业可在微信客服管理后台的企业信息处查看
secret string // Secret 是微信客服用于校验开发者身份的访问密钥,企业成功注册微信客服后,可在「微信客服管理后台 - 开发配置」处获取
token string // 用于生成签名校验回调请求的合法性
encodingAESKey string // 回调消息加解密参数是AES密钥的Base64编码用于解密回调消息内容对应的密文
encodingAESKey string // 回调消息加解密参数是 AES 密钥的 Base64 编码,用于解密回调消息内容对应的密文
cache cache.Cache
ctx *context.Context
}

View File

@@ -13,23 +13,23 @@ const (
// CustomerBatchGetOptions 客户基本信息获取请求参数
type CustomerBatchGetOptions struct {
ExternalUserIDList []string `json:"external_userid_list"` // external_userid列表
ExternalUserIDList []string `json:"external_userid_list"` // external_userid 列表
}
// CustomerSchema 微信客户基本资料
type CustomerSchema struct {
ExternalUserID string `json:"external_userid"` // 微信客户的external_userid
ExternalUserID string `json:"external_userid"` // 微信客户的 external_userid
NickName string `json:"nickname"` // 微信昵称
Avatar string `json:"avatar"` // 微信头像。第三方不可获取
Gender int `json:"gender"` // 性别
UnionID string `json:"unionid"` // unionid需要绑定微信开发者帐号才能获取到查看绑定方法: https://open.work.weixin.qq.com/kf/doc/92512/93143/94769#%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E5%BE%AE%E4%BF%A1%E5%AE%A2%E6%88%B7%E7%9A%84unionid
UnionID string `json:"unionid"` // unionid需要绑定微信开发者帐号才能获取到查看绑定方法https://open.work.weixin.qq.com/kf/doc/92512/93143/94769#%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E5%BE%AE%E4%BF%A1%E5%AE%A2%E6%88%B7%E7%9A%84unionid
}
// CustomerBatchGetSchema 获取客户基本信息响应内容
type CustomerBatchGetSchema struct {
util.CommonError
CustomerList []CustomerSchema `json:"customer_list"` // 微信客户信息列表
InvalidExternalUserID []string `json:"invalid_external_userid"` // 无效的微信客户ID
InvalidExternalUserID []string `json:"invalid_external_userid"` // 无效的微信客户 ID
}
// CustomerBatchGet 客户基本信息获取

View File

@@ -10,13 +10,13 @@ type Error string
const (
// SDKInitFailed 错误码50001
SDKInitFailed Error = "SDK初始化失败"
SDKInitFailed Error = "SDK 初始化失败"
// SDKCacheUnavailable 错误码50002
SDKCacheUnavailable Error = "缓存无效"
// SDKUnknownError 错误码50003
SDKUnknownError Error = "未知错误"
// SDKInvalidCredential 错误码40001
SDKInvalidCredential Error = "不合法的secret参数"
SDKInvalidCredential Error = "不合法的 secret 参数"
// SDKInvalidImageSize 错误码40009
SDKInvalidImageSize Error = "无效的图片大小"
// SDKInvalidCorpID 错误码40013
@@ -28,11 +28,11 @@ const (
// SDKDecryptMSGFailed 错误码40016
SDKDecryptMSGFailed Error = "消息解密失败"
// SDKMediaIDExceedMinLength 错误码40058
SDKMediaIDExceedMinLength Error = "不合法的参数, 请参照具体 API 接口说明进行传参"
SDKMediaIDExceedMinLength Error = "不合法的参数请参照具体 API 接口说明进行传参"
// SDKContentContainsSensitiveInformation 错误码40201
SDKContentContainsSensitiveInformation Error = "当前客服账号由于涉及敏感信息,已被封禁,请联系企业微信客服处理"
// SDKAccessTokenMissing 错误码41001
SDKAccessTokenMissing Error = "缺少AccessToken参数"
SDKAccessTokenMissing Error = "缺少 AccessToken 参数"
// SDKAccessTokenExpired 错误码42001
SDKAccessTokenExpired Error = "AccessToken 已过期"
// SDKApiFreqOutOfLimit 错误码45009
@@ -79,7 +79,7 @@ var codeDic = map[int64]error{
95017: SDKApiNotOpen,
}
// NewSDKErr 初始化SDK实例错误信息
// NewSDKErr 初始化 SDK 实例错误信息
func NewSDKErr(code int64, msgList ...string) error {
if err := codeDic[code]; err != nil {
return err

View File

@@ -15,14 +15,14 @@ const (
// CorpQualificationSchema 获取视频号绑定状态响应内容
type CorpQualificationSchema struct {
util.CommonError
WechatChannelsBinding bool `json:"wechat_channels_binding"` // 当企业具有绑定成功的视频号时返回true否则返回false。 1. 企业申请绑定视频号且由视频号管理员确认后,才为绑定成功状态 2. 至少有一个绑定成功的视频号就会返回true
WechatChannelsBinding bool `json:"wechat_channels_binding"` // 当企业具有绑定成功的视频号时,返回 true否则返回 false。1. 企业申请绑定视频号且由视频号管理员确认后,才为绑定成功状态 2. 至少有一个绑定成功的视频号就会返回 true
}
// GetCorpQualification 获取视频号绑定状态
// 微信客服可接待的客户数,和企业是否已完成主体验证、是否绑定视频号相关。
//
// 企业未完成主体验证时微信客服仅可累计接待100位客户
// 企业已验证但未绑定视频号时微信客服仅可累计接待10000位客户
// 企业未完成主体验证时,微信客服仅可累计接待 100 位客户
// 企业已验证但未绑定视频号时,微信客服仅可累计接待 10000 位客户
// 企业已验证且已绑定视频号时,微信客服可接待的客户数不受限制
//
// 开发者可获取状态后,在应用等地方提示企业去完成主体验证或绑定视频号。

View File

@@ -15,17 +15,17 @@ const (
// SendMsgSchema 发送消息响应内容
type SendMsgSchema struct {
util.CommonError
MsgID string `json:"msgid"` // 消息ID。如果请求参数指定了msgid则原样返回否则系统自动生成并返回。不多于32字节, 字符串取值范围(正则表达式)[0-9a-zA-Z_-]*
MsgID string `json:"msgid"` // 消息 ID。如果请求参数指定了 msgid则原样返回否则系统自动生成并返回。不多于 32 字节字符串取值范围 (正则表达式)[0-9a-zA-Z_-]*
}
// SendMsg 发送消息
// 当微信客户处于“新接入待处理”或“由智能助手接待”状态下,可调用该接口给用户发送消息。
// 注意仅当微信客户在主动发送消息给客服后的48小时内企业可发送消息给客户最多可发送5条消息;若用户继续发送消息,企业可再次下发消息。
// 注意仅当微信客户在主动发送消息给客服后的 48 小时内,企业可发送消息给客户,最多可发送 5 条消息;若用户继续发送消息,企业可再次下发消息。
// 支持发送消息类型:文本、图片、语音、视频、文件、图文、小程序、菜单消息、地理位置。
// 目前该接口允许下发消息条数和下发时限如下:
//
// 用户动作 允许下发条数限制 下发时限
// 用户发送消息 5条 48 小时
// 用户发送消息 5 条 48 小时
func (r *Client) SendMsg(options interface{}) (info SendMsgSchema, err error) {
var (
accessToken string

View File

@@ -2,9 +2,9 @@ package sendmsg
// Message 发送消息
type Message struct {
ToUser string `json:"touser"` // 指定接收消息的客户UserID
OpenKFID string `json:"open_kfid"` // 指定发送消息的客服帐号ID
MsgID string `json:"msgid,omitempty"` // 指定消息ID
ToUser string `json:"touser"` // 指定接收消息的客户 UserID
OpenKFID string `json:"open_kfid"` // 指定发送消息的客服帐号 ID
MsgID string `json:"msgid,omitempty"` // 指定消息 ID
}
// Text 发送文本消息
@@ -12,7 +12,7 @@ type Text struct {
Message
MsgType string `json:"msgtype"` // 消息类型此时固定为text
Text struct {
Content string `json:"content"` // 消息内容最长不超过2048个字节
Content string `json:"content"` // 消息内容,最长不超过 2048 个字节
} `json:"text"` // 文本消息
}
@@ -21,7 +21,7 @@ type Image struct {
Message
MsgType string `json:"msgtype"` // 消息类型此时固定为image
Image struct {
MediaID string `json:"media_id"` // 图片文件id可以调用上传临时素材接口获取
MediaID string `json:"media_id"` // 图片文件 id可以调用上传临时素材接口获取
} `json:"image"` // 图片消息
}
@@ -30,7 +30,7 @@ type Voice struct {
Message
MsgType string `json:"msgtype"` // 消息类型此时固定为voice
Voice struct {
MediaID string `json:"media_id"` // 语音文件id可以调用上传临时素材接口获取
MediaID string `json:"media_id"` // 语音文件 id可以调用上传临时素材接口获取
} `json:"voice"` // 语音消息
}
@@ -39,7 +39,7 @@ type Video struct {
Message
MsgType string `json:"msgtype"` // 消息类型此时固定为video
Video struct {
MediaID string `json:"media_id"` // 视频文件id可以调用上传临时素材接口获取
MediaID string `json:"media_id"` // 视频文件 id可以调用上传临时素材接口获取
} `json:"video"` // 视频消息
}
@@ -48,7 +48,7 @@ type File struct {
Message
MsgType string `json:"msgtype"` // 消息类型此时固定为file
File struct {
MediaID string `json:"media_id"` // 文件id可以调用上传临时素材接口获取
MediaID string `json:"media_id"` // 文件 id可以调用上传临时素材接口获取
} `json:"file"` // 文件消息
}
@@ -57,10 +57,10 @@ type Link struct {
Message
MsgType string `json:"msgtype"` // 消息类型此时固定为link
Link struct {
Title string `json:"title"` // 标题不超过128个字节超过会自动截断
Desc string `json:"desc"` // 描述不超过512个字节超过会自动截断
URL string `json:"url"` // 点击后跳转的链接。 最长2048字节请确保包含了协议头(http/https)
ThumbMediaID string `json:"thumb_media_id"` // 缩略图的media_id, 可以通过素材管理接口获得。此处thumb_media_id即上传接口返回的media_id
Title string `json:"title"` // 标题,不超过 128 个字节,超过会自动截断
Desc string `json:"desc"` // 描述,不超过 512 个字节,超过会自动截断
URL string `json:"url"` // 点击后跳转的链接。最长 2048 字节,请确保包含了协议头 (http/https)
ThumbMediaID string `json:"thumb_media_id"` // 缩略图的 media_id, 可以通过素材管理接口获得。此处 thumb_media_id 即上传接口返回的 media_id
} `json:"link"` // 链接消息
}
@@ -69,9 +69,9 @@ type MiniProgram struct {
Message
MsgType string `json:"msgtype"` // 消息类型此时固定为miniprogram
MiniProgram struct {
AppID string `json:"appid"` // 小程序appid必须是关联到企业的小程序应用
Title string `json:"title"` // 小程序消息标题最多64个字节超过会自动截断
ThumbMediaID string `json:"thumb_media_id"` // 小程序消息封面的mediaid封面图建议尺寸为520*416
AppID string `json:"appid"` // 小程序 appid必须是关联到企业的小程序应用
Title string `json:"title"` // 小程序消息标题,最多 64 个字节,超过会自动截断
ThumbMediaID string `json:"thumb_media_id"` // 小程序消息封面的 mediaid封面图建议尺寸为 520*416
PagePath string `json:"pagepath"` // 点击消息卡片后进入的小程序页面路径
} `json:"miniprogram"` // 小程序消息
}
@@ -81,37 +81,37 @@ type Menu struct {
Message
MsgType string `json:"msgtype"` // 消息类型此时固定为msgmenu
MsgMenu struct {
HeadContent string `json:"head_content"` // 消息内容不多于1024字节
List []interface{} `json:"list"` // 菜单项配置不能多余10个
TailContent string `json:"tail_content"` // 结束文本, 不多于1024字
HeadContent string `json:"head_content"` // 消息内容,不多于 1024 字节
List []interface{} `json:"list"` // 菜单项配置,不能多余 10
TailContent string `json:"tail_content"` // 结束文本不多于 1024
} `json:"msgmenu"`
}
// MenuClick 回复菜单
type MenuClick struct {
Type string `json:"type"` // 菜单类型: click 回复菜单
Type string `json:"type"` // 菜单类型click 回复菜单
Click struct {
ID string `json:"id"` // 菜单ID, 不少于1字节, 不多于64字节
Content string `json:"content"` // 菜单显示内容, 不少于1字节, 不多于128字节
ID string `json:"id"` // 菜单 ID, 不少于 1 字节,不多于 64 字节
Content string `json:"content"` // 菜单显示内容不少于 1 字节,不多于 128 字节
} `json:"click"`
}
// MenuView 超链接菜单
type MenuView struct {
Type string `json:"type"` // 菜单类型: view 超链接菜单
Type string `json:"type"` // 菜单类型view 超链接菜单
View struct {
URL string `json:"url"` // 点击后跳转的链接, 不少于1字节, 不多于2048字节
Content string `json:"content"` // 菜单显示内容, 不少于1字节, 不多于1024字节
URL string `json:"url"` // 点击后跳转的链接不少于 1 字节,不多于 2048 字节
Content string `json:"content"` // 菜单显示内容不少于 1 字节,不多于 1024 字节
} `json:"view"`
}
// MenuMiniProgram 小程序菜单
type MenuMiniProgram struct {
Type string `json:"type"` // 菜单类型: miniprogram 小程序菜单
Type string `json:"type"` // 菜单类型miniprogram 小程序菜单
MiniProgram struct {
AppID string `json:"appid"` // 小程序appid, 不少于1字节, 不多于32字节
PagePath string `json:"pagepath"` // 点击后进入的小程序页面, 不少于1字节, 不多于1024字节
Content string `json:"content"` // 菜单显示内容, 不少于1字节, 不多于1024字节
AppID string `json:"appid"` // 小程序 appid, 不少于 1 字节,不多于 32 字节
PagePath string `json:"pagepath"` // 点击后进入的小程序页面不少于 1 字节,不多于 1024 字节
Content string `json:"content"` // 菜单显示内容不少于 1 字节,不多于 1024 字节
} `json:"miniprogram"`
}
@@ -120,8 +120,8 @@ type Location struct {
Message
MsgType string `json:"msgtype"` // 消息类型此时固定为location
Location struct {
Latitude float32 `json:"latitude"` // 纬度, 浮点数范围为90 ~ -90
Longitude float32 `json:"longitude"` // 经度, 浮点数范围为180 ~ -180
Latitude float32 `json:"latitude"` // 纬度浮点数,范围为 90 ~ -90
Longitude float32 `json:"longitude"` // 经度浮点数,范围为 180 ~ -180
Name string `json:"name"` // 位置名
Address string `json:"address"` // 地址详情说明
} `json:"location"`

View File

@@ -15,24 +15,24 @@ const (
// SendMsgOnEventSchema 发送事件响应消息
type SendMsgOnEventSchema struct {
util.CommonError
MsgID string `json:"msgid"` // 消息ID。如果请求参数指定了msgid则原样返回否则系统自动生成并返回。不多于32字节, 字符串取值范围(正则表达式)[0-9a-zA-Z_-]*
MsgID string `json:"msgid"` // 消息 ID。如果请求参数指定了 msgid则原样返回否则系统自动生成并返回。不多于 32 字节字符串取值范围 (正则表达式)[0-9a-zA-Z_-]*
}
// SendMsgOnEvent 发送事件响应消息
// 当特定的事件回调消息包含code字段或通过接口变更到特定的会话状态会返回code字段。
// 开发者可以此code为凭证调用该接口给用户发送相应事件场景下的消息如客服欢迎语、客服提示语和会话结束语等。
// 除”用户进入会话事件”以外响应消息仅支持会话处于获取该code的会话状态时发送如将会话转入待接入池时获得的code仅能在会话状态为”待接入池排队中“时发送。
// 当特定的事件回调消息包含 code 字段,或通过接口变更到特定的会话状态,会返回 code 字段。
// 开发者可以此 code 为凭证,调用该接口给用户发送相应事件场景下的消息,如客服欢迎语、客服提示语和会话结束语等。
// 除”用户进入会话事件”以外,响应消息仅支持会话处于获取该 code 的会话状态时发送,如将会话转入待接入池时获得的 code 仅能在会话状态为”待接入池排队中“时发送。
//
// 目前支持的事件场景和相关约束如下:
//
// 事件场景 允许下发条数 code有效期 支持的消息类型 获取code途径
// 用户进入会话,用于发送客服欢迎语 1条 20秒 文本、菜单 事件回调
// 进入接待池,用于发送排队提示语等 1条 48小时 文本 转接会话接口
// 从接待池接入会话,用于发送非工作时间的提示语或超时未回复的提示语等 1条 48小时 文本 事件回调、转接会话接口
// 结束会话,用于发送结束会话提示语或满意度评价等 1条 20秒 文本、菜单 事件回调、转接会话接口
// 事件场景 允许下发条数 code 有效期 支持的消息类型 获取 code 途径
// 用户进入会话,用于发送客服欢迎语 1 条 20 秒 文本、菜单 事件回调
// 进入接待池,用于发送排队提示语等 1 条 48 小时 文本 转接会话接口
// 从接待池接入会话,用于发送非工作时间的提示语或超时未回复的提示语等 1 条 48 小时 文本 事件回调、转接会话接口
// 结束会话,用于发送结束会话提示语或满意度评价等 1 条 20 秒 文本、菜单 事件回调、转接会话接口
//
// 「进入会话事件」响应消息:
// 如果满足通过API下发欢迎语条件条件为1. 企业没有在管理端配置了原生欢迎语2. 用户在过去48小时里未收过欢迎语且未向该用户发过消息则用户进入会话事件会额外返回一个welcome_code开发者以此为凭据调用接口填到该接口code参数即可向客户发送客服欢迎语。
// 如果满足通过 API 下发欢迎语条件条件为1. 企业没有在管理端配置了原生欢迎语2. 用户在过去 48 小时里未收过欢迎语,且未向该用户发过消息),则用户进入会话事件会额外返回一个 welcome_code开发者以此为凭据调用接口填到该接口 code 参数),即可向客户发送客服欢迎语。
func (r *Client) SendMsgOnEvent(options interface{}) (info SendMsgOnEventSchema, err error) {
var (
accessToken string

View File

@@ -2,8 +2,8 @@ package sendmsgonevent
// Message 发送事件响应消息
type Message struct {
Code string `json:"code"` // 事件响应消息对应的code。通过事件回调下发仅可使用一次。
MsgID string `json:"msgid"` // 消息ID。如果请求参数指定了msgid则原样返回否则系统自动生成并返回。不多于32字节不多于32字节
Code string `json:"code"` // 事件响应消息对应的 code。通过事件回调下发仅可使用一次。
MsgID string `json:"msgid"` // 消息 ID。如果请求参数指定了 msgid则原样返回否则系统自动生成并返回。不多于 32 字节,不多于 32 字节
}
// Text 文本消息
@@ -11,7 +11,7 @@ type Text struct {
Message
MsgType string `json:"msgtype"` // 消息类型此时固定为text
Text struct {
Content string `json:"content"` // 消息内容最长不超过2048个字节
Content string `json:"content"` // 消息内容,最长不超过 2048 个字节
} `json:"text"` // 文本消息
}
@@ -20,36 +20,36 @@ type Menu struct {
Message
MsgType string `json:"msgtype"` // 消息类型此时固定为msgmenu
MsgMenu struct {
HeadContent string `json:"head_content"` // 消息内容不多于1024字节
List []interface{} `json:"list"` // 菜单项配置不能多余10个
TailContent string `json:"tail_content"` // 结束文本, 不多于1024字
HeadContent string `json:"head_content"` // 消息内容,不多于 1024 字节
List []interface{} `json:"list"` // 菜单项配置,不能多余 10
TailContent string `json:"tail_content"` // 结束文本不多于 1024
} `json:"msgmenu"`
}
// MenuClick 回复菜单
type MenuClick struct {
Type string `json:"type"` // 菜单类型: click 回复菜单
Type string `json:"type"` // 菜单类型click 回复菜单
Click struct {
ID string `json:"id"` // 菜单ID, 不少于1字节, 不多于64字节
Content string `json:"content"` // 菜单显示内容, 不少于1字节, 不多于128字节
ID string `json:"id"` // 菜单 ID, 不少于 1 字节,不多于 64 字节
Content string `json:"content"` // 菜单显示内容不少于 1 字节,不多于 128 字节
} `json:"click"`
}
// MenuView 超链接菜单
type MenuView struct {
Type string `json:"type"` // 菜单类型: view 超链接菜单
Type string `json:"type"` // 菜单类型view 超链接菜单
View struct {
URL string `json:"url"` // 点击后跳转的链接, 不少于1字节, 不多于2048字节
Content string `json:"content"` // 菜单显示内容, 不少于1字节, 不多于1024字节
URL string `json:"url"` // 点击后跳转的链接不少于 1 字节,不多于 2048 字节
Content string `json:"content"` // 菜单显示内容不少于 1 字节,不多于 1024 字节
} `json:"view"`
}
// MenuMiniProgram 小程序菜单
type MenuMiniProgram struct {
Type string `json:"type"` // 菜单类型: miniprogram 小程序菜单
Type string `json:"type"` // 菜单类型miniprogram 小程序菜单
MiniProgram struct {
AppID string `json:"appid"` // 小程序appid, 不少于1字节, 不多于32字节
PagePath string `json:"pagepath"` // 点击后进入的小程序页面, 不少于1字节, 不多于1024字节
Content string `json:"content"` // 菜单显示内容, 不少于1字节, 不多于1024字节
AppID string `json:"appid"` // 小程序 appid, 不少于 1 字节,不多于 32 字节
PagePath string `json:"pagepath"` // 点击后进入的小程序页面不少于 1 字节,不多于 1024 字节
Content string `json:"content"` // 菜单显示内容不少于 1 字节,不多于 1024 字节
} `json:"miniprogram"`
}

View File

@@ -18,8 +18,8 @@ const (
// ReceptionistOptions 添加接待人员请求参数
type ReceptionistOptions struct {
OpenKFID string `json:"open_kfid"` // 客服帐号ID
UserIDList []string `json:"userid_list"` // 接待人员userid列表。第三方应用填密文userid即open_userid 可填充个数1 ~ 100。超过100个需分批调用。
OpenKFID string `json:"open_kfid"` // 客服帐号 ID
UserIDList []string `json:"userid_list"` // 接待人员 userid 列表。第三方应用填密文 userid open_userid 可填充个数1 ~ 100。超过 100 个需分批调用。
}
// ReceptionistSchema 添加接待人员响应内容
@@ -79,8 +79,8 @@ func (r *Client) ReceptionistDel(options ReceptionistOptions) (info Receptionist
type ReceptionistListSchema struct {
util.CommonError
ReceptionistList []struct {
UserID string `json:"userid"` // 接待人员的userid。第三方应用获取到的为密文userid即open_userid
Status int `json:"status"` // 接待人员的接待状态。0:接待中,1:停止接待。第三方应用需具有“管理帐号、分配会话和收发消息”权限才可获取
UserID string `json:"userid"` // 接待人员的 userid。第三方应用获取到的为密文 userid open_userid
Status int `json:"status"` // 接待人员的接待状态。0:接待中1:停止接待。第三方应用需具有“管理帐号、分配会话和收发消息”权限才可获取
} `json:"servicer_list"`
}

View File

@@ -16,24 +16,24 @@ const (
// ServiceStateGetOptions 获取会话状态请求参数
type ServiceStateGetOptions struct {
OpenKFID string `json:"open_kfid"` // 客服帐号ID
ExternalUserID string `json:"external_userid"` // 微信客户的external_userid
OpenKFID string `json:"open_kfid"` // 客服帐号 ID
ExternalUserID string `json:"external_userid"` // 微信客户的 external_userid
}
// ServiceStateGetSchema 获取会话状态响应内容
type ServiceStateGetSchema struct {
util.CommonError
ServiceState int `json:"service_state"` // 当前的会话状态,状态定义参考概述中的表格
ServiceUserID string `json:"service_userid"` // 接待人员的userid仅当state=3时有效
ServiceUserID string `json:"service_userid"` // 接待人员的 userid仅当 state=3 时有效
}
// ServiceStateGet 获取会话状态
// 0 未处理 新会话接入客户发信咨询。可选择1.直接用API自动回复消息。2.放进待接入池等待接待人员接待。3.指定接待人员(接待人员须处于“正在接待”中,下同)进行接待
// 1 由智能助手接待 可使用API回复消息。可选择转入待接入池或者指定接待人员处理
// 0 未处理 新会话接入客户发信咨询。可选择1.直接用 API 自动回复消息。2.放进待接入池等待接待人员接待。3.指定接待人员(接待人员须处于“正在接待”中,下同)进行接待
// 1 由智能助手接待 可使用 API 回复消息。可选择转入待接入池或者指定接待人员处理
// 2 待接入池排队中 在待接入池中排队等待接待人员接入。可选择转为指定人员接待
// 3 由人工接待 人工接待中。可选择转接给其他接待人员处理或者结束会话
// 4 已结束 会话已经结束或未开始。不允许变更会话状态,客户重新发信咨询后会话状态变为“未处理”
// 注一个微信用户向一个客服帐号发起咨询后在48h内或主动结束会话前包括接待人员手动结束或企业通过API结束会话都算是一次会话
// 注:一个微信用户向一个客服帐号发起咨询后,在 48h 内,或主动结束会话前(包括接待人员手动结束,或企业通过 API 结束会话),都算是一次会话
func (r *Client) ServiceStateGet(options ServiceStateGetOptions) (info ServiceStateGetSchema, err error) {
var (
accessToken string
@@ -56,16 +56,16 @@ func (r *Client) ServiceStateGet(options ServiceStateGetOptions) (info ServiceSt
// ServiceStateTransOptions 变更会话状态请求参数
type ServiceStateTransOptions struct {
OpenKFID string `json:"open_kfid"` // 客服帐号ID
ExternalUserID string `json:"external_userid"` // 微信客户的external_userid
OpenKFID string `json:"open_kfid"` // 客服帐号 ID
ExternalUserID string `json:"external_userid"` // 微信客户的 external_userid
ServiceState int `json:"service_state"` // 变更的目标状态,状态定义和所允许的变更可参考概述中的流程图和表格
ServicerUserID string `json:"servicer_userid"` // 接待人员的userid当state=3时要求必填接待人员须处于“正在接待”中
ServicerUserID string `json:"servicer_userid"` // 接待人员的 userid state=3 时要求必填,接待人员须处于“正在接待”中
}
// ServiceStateTransSchema 变更会话状态响应内容
type ServiceStateTransSchema struct {
util.CommonError
MsgCode string `json:"msg_code"` // 用于发送响应事件消息的code将会话初次变更为service_state为2和3返回回复语codeservice_state为4返回结束语code。可用该code调用发送事件响应消息接口给客户发送事件响应消息
MsgCode string `json:"msg_code"` // 用于发送响应事件消息的 code将会话初次变更为 service_state 为 2 和 3 时,返回回复语 codeservice_state 为 4 时,返回结束语 code。可用该 code 调用发送事件响应消息接口给客户发送事件响应消息
}
// ServiceStateTrans 变更会话状态

View File

@@ -16,11 +16,11 @@ const (
// SyncMsgOptions 获取消息查询参数
type SyncMsgOptions struct {
Cursor string `json:"cursor"` // 上一次调用时返回的next_cursor第一次拉取可以不填, 不多于64字节
Token string `json:"token"` // 回调事件返回的token字段10分钟内有效可不填如果不填接口有严格的频率限制, 不多于128字节
Limit uint `json:"limit"` // 期望请求的数据量默认值和最大值都为1000, 注意可能会出现返回条数少于limit的情况需结合返回的has_more字段判断是否继续请求。
VoiceFormat uint `json:"voice_format,omitempty"` // 语音消息类型0-Amr 1-Silk默认0。可通过该参数控制返回的语音格式开发者可按需选择自己程序支持的一种格式
OpenKfID string `json:"open_kfid,omitempty"` // 指定拉取某个客服帐号的消息否则默认返回有权限的客服帐号的消息。当客服帐号较多建议按open_kfid来拉取以获取更好的性能。
Cursor string `json:"cursor"` // 上一次调用时返回的 next_cursor第一次拉取可以不填不多于 64 字节
Token string `json:"token"` // 回调事件返回的 token 字段10 分钟内有效;可不填,如果不填接口有严格的频率限制不多于 128 字节
Limit uint `json:"limit"` // 期望请求的数据量,默认值和最大值都为 1000, 注意:可能会出现返回条数少于 limit 的情况,需结合返回的 has_more 字段判断是否继续请求。
VoiceFormat uint `json:"voice_format,omitempty"` // 语音消息类型0-Amr 1-Silk默认 0。可通过该参数控制返回的语音格式开发者可按需选择自己程序支持的一种格式
OpenKfID string `json:"open_kfid,omitempty"` // 指定拉取某个客服帐号的消息,否则默认返回有权限的客服帐号的消息。当客服帐号较多,建议按 open_kfid 来拉取以获取更好的性能。
}
// SyncMsgSchema 获取消息查询响应内容
@@ -28,7 +28,7 @@ type syncMsgSchema struct {
ErrCode int32 `json:"errcode"` // 返回码
ErrMsg string `json:"errmsg"` // 错误码描述
NextCursor string `json:"next_cursor"` // 下次调用带上该值,则从当前的位置继续往后拉,以实现增量拉取。强烈建议对改该字段入库保存,每次请求读取带上,请求结束后更新。避免因意外丢,导致必须从头开始拉取,引起消息延迟。
HasMore uint32 `json:"has_more"` // 是否还有更多数据。0-否1-是。不能通过判断msg_list是否空来停止拉取可能会出现has_more1而msg_list为空的情况
HasMore uint32 `json:"has_more"` // 是否还有更多数据。0-否1-是。不能通过判断 msg_list 是否空来停止拉取,可能会出现 has_more1 msg_list 为空的情况
MsgList []map[string]interface{} `json:"msg_list"` // 消息列表
}
@@ -36,8 +36,8 @@ type syncMsgSchema struct {
type SyncMsgSchema struct {
ErrCode int32 `json:"errcode"` // 返回码
ErrMsg string `json:"errmsg"` // 错误码描述
NextCursor string `json:"next_cursor"` // 下次调用带上该值则从该key值往后拉用于增量拉取
HasMore uint32 `json:"has_more"` // 是否还有更多数据。0-否1-是。不能通过判断msg_list是否空来停止拉取可能会出现has_more1而msg_list为空的情况
NextCursor string `json:"next_cursor"` // 下次调用带上该值则从该 key 值往后拉,用于增量拉取
HasMore uint32 `json:"has_more"` // 是否还有更多数据。0-否1-是。不能通过判断 msg_list 是否空来停止拉取,可能会出现 has_more1 msg_list 为空的情况
MsgList []syncmsg.Message `json:"msg_list"` // 消息列表
}

View File

@@ -2,10 +2,10 @@ package syncmsg
// BaseMessage 接收消息
type BaseMessage struct {
MsgID string `json:"msgid"` // 消息ID
OpenKFID string `json:"open_kfid"` // 客服帐号IDmsgtypeevent该字段不返回
ExternalUserID string `json:"external_userid"` // 客户UserIDmsgtypeevent该字段不返回
ReceptionistUserID string `json:"servicer_userid"` // 接待客服userID
MsgID string `json:"msgid"` // 消息 ID
OpenKFID string `json:"open_kfid"` // 客服帐号 IDmsgtypeevent该字段不返回
ExternalUserID string `json:"external_userid"` // 客户 UserIDmsgtypeevent该字段不返回
ReceptionistUserID string `json:"servicer_userid"` // 接待客服 userID
SendTime uint64 `json:"send_time"` // 消息发送时间
Origin uint32 `json:"origin"` // 消息来源。3-微信客户发送的消息 4-系统推送的事件消息 5-接待人员在企业微信客户端发送的消息
}
@@ -16,7 +16,7 @@ type Text struct {
MsgType string `json:"msgtype"` // 消息类型此时固定为text
Text struct {
Content string `json:"content"` // 文本内容
MenuID string `json:"menu_id"` // 客户点击菜单消息触发的回复消息中附带的菜单ID
MenuID string `json:"menu_id"` // 客户点击菜单消息,触发的回复消息中附带的菜单 ID
} `json:"text"` // 文本消息
}
@@ -25,7 +25,7 @@ type Image struct {
BaseMessage
MsgType string `json:"msgtype"` // 消息类型此时固定为image
Image struct {
MediaID string `json:"media_id"` // 图片文件ID
MediaID string `json:"media_id"` // 图片文件 ID
} `json:"image"` // 图片消息
}
@@ -34,7 +34,7 @@ type Voice struct {
BaseMessage
MsgType string `json:"msgtype"` // 消息类型此时固定为voice
Voice struct {
MediaID string `json:"media_id"` // 语音文件ID
MediaID string `json:"media_id"` // 语音文件 ID
} `json:"voice"` // 语音消息
}
@@ -43,7 +43,7 @@ type Video struct {
BaseMessage
MsgType string `json:"msgtype"` // 消息类型此时固定为video
Video struct {
MediaID string `json:"media_id"` // 文件ID
MediaID string `json:"media_id"` // 文件 ID
} `json:"video"` // 视频消息
}
@@ -52,7 +52,7 @@ type File struct {
BaseMessage
MsgType string `json:"msgtype"` // 消息类型此时固定为file
File struct {
MediaID string `json:"media_id"` // 文件ID
MediaID string `json:"media_id"` // 文件 ID
} `json:"file"` // 文件消息
}
@@ -94,9 +94,9 @@ type MiniProgram struct {
BaseMessage
MsgType string `json:"msgtype"` // 消息类型此时固定为miniprogram
MiniProgram struct {
AppID string `json:"appid"` // 小程序appid必须是关联到企业的小程序应用
Title string `json:"title"` // 小程序消息标题最多64个字节超过会自动截断
ThumbMediaID string `json:"thumb_media_id"` // 小程序消息封面的mediaid封面图建议尺寸为520*416
AppID string `json:"appid"` // 小程序 appid必须是关联到企业的小程序应用
Title string `json:"title"` // 小程序消息标题,最多 64 个字节,超过会自动截断
ThumbMediaID string `json:"thumb_media_id"` // 小程序消息封面的 mediaid封面图建议尺寸为 520*416
PagePath string `json:"pagepath"` // 点击消息卡片后进入的小程序页面路径
} `json:"miniprogram"` // 小程序消息
}
@@ -116,11 +116,11 @@ type EnterSessionEvent struct {
MsgType string `json:"msgtype"` // 消息类型此时固定为event
Event struct {
EventType string `json:"event_type"` // 事件类型。此处固定为enter_session
OpenKFID string `json:"open_kfid"` // 客服账号ID
ExternalUserID string `json:"external_userid"` // 客户UserID
OpenKFID string `json:"open_kfid"` // 客服账号 ID
ExternalUserID string `json:"external_userid"` // 客户 UserID
Scene string `json:"scene"` // 进入会话的场景值,获取客服帐号链接开发者自定义的场景值
SceneParam string `json:"scene_param"` // 进入会话的自定义参数获取客服帐号链接返回的url开发者按规范拼接的scene_param参数
WelcomeCode string `json:"welcome_code"` // 如果满足发送欢迎语条件条件为1. 企业没有在管理端配置了原生欢迎语2. 用户在过去48小时里未收过欢迎语且未向该用户发过消息会返回该字段。可用该welcome_code调用发送事件响应消息接口给客户发送欢迎语。
SceneParam string `json:"scene_param"` // 进入会话的自定义参数,获取客服帐号链接返回的 url开发者按规范拼接的 scene_param 参数
WelcomeCode string `json:"welcome_code"` // 如果满足发送欢迎语条件条件为1. 企业没有在管理端配置了原生欢迎语2. 用户在过去 48 小时里未收过欢迎语,且未向该用户发过消息),会返回该字段。可用该 welcome_code 调用发送事件响应消息接口给客户发送欢迎语。
} `json:"event"` // 事件消息
}
@@ -130,10 +130,10 @@ type MsgSendFailEvent struct {
MsgType string `json:"msgtype"` // 消息类型此时固定为event
Event struct {
EventType string `json:"event_type"` // 事件类型。此处固定为msg_send_fail
OpenKFID string `json:"open_kfid"` // 客服账号ID
ExternalUserID string `json:"external_userid"` // 客户UserID
FailMsgID string `json:"fail_msgid"` // 发送失败的消息msgid
FailType uint32 `json:"fail_type"` // 失败类型。0-未知原因 1-客服账号已删除 2-应用已关闭 4-会话已过期超过48小时 5-会话已关闭 6-超过5条限制 7-未绑定视频号 8-主体未验证 9-未绑定视频号且主体未验证 10-用户拒收
OpenKFID string `json:"open_kfid"` // 客服账号 ID
ExternalUserID string `json:"external_userid"` // 客户 UserID
FailMsgID string `json:"fail_msgid"` // 发送失败的消息 msgid
FailType uint32 `json:"fail_type"` // 失败类型。0-未知原因 1-客服账号已删除 2-应用已关闭 4-会话已过期,超过 48 小时 5-会话已关闭 6-超过 5 条限制 7-未绑定视频号 8-主体未验证 9-未绑定视频号且主体未验证 10-用户拒收
} `json:"event"` // 事件消息
}
@@ -143,8 +143,8 @@ type ReceptionistStatusChangeEvent struct {
MsgType string `json:"msgtype"` // 消息类型此时固定为event
Event struct {
EventType string `json:"event_type"` // 事件类型。此处固定为servicer_status_change
ReceptionistUserID string `json:"servicer_userid"` // 客服人员userid
OpenKFID string `json:"open_kfid"` // 客服帐号ID
ReceptionistUserID string `json:"servicer_userid"` // 客服人员 userid
OpenKFID string `json:"open_kfid"` // 客服帐号 ID
Status uint32 `json:"status"` // 状态类型。1-接待中 2-停止接待
} `json:"event"`
}
@@ -155,11 +155,11 @@ type SessionStatusChangeEvent struct {
MsgType string `json:"msgtype"` // 消息类型此时固定为event
Event struct {
EventType string `json:"event_type"` // 事件类型。此处固定为session_status_change
OpenKFID string `json:"open_kfid"` // 客服账号ID
ExternalUserID string `json:"external_userid"` // 客户UserID
OpenKFID string `json:"open_kfid"` // 客服账号 ID
ExternalUserID string `json:"external_userid"` // 客户 UserID
ChangeType uint32 `json:"change_type"` // 变更类型。1-从接待池接入会话 2-转接会话 3-结束会话
OldReceptionistUserID string `json:"old_servicer_userid"` // 老的客服人员userid。仅change_type为2和3有值
NewReceptionistUserID string `json:"new_servicer_userid"` // 新的客服人员userid。仅change_type为1和2有值
MsgCode string `json:"msg_code"` // 用于发送事件响应消息的code仅change_type为1和3会返回该字段。可用该msg_code调用发送事件响应消息接口给客户发送回复语或结束语。
OldReceptionistUserID string `json:"old_servicer_userid"` // 老的客服人员 userid。仅 change_type 为 2 和 3 有值
NewReceptionistUserID string `json:"new_servicer_userid"` // 新的客服人员 userid。仅 change_type 为 1 和 2 有值
MsgCode string `json:"msg_code"` // 用于发送事件响应消息的 code change_type 为 1 和 3 时,会返回该字段。可用该 msg_code 调用发送事件响应消息接口给客户发送回复语或结束语。
} `json:"event"` // 事件消息
}

View File

@@ -4,10 +4,10 @@ import "encoding/json"
// Message 同步的消息内容
type Message struct {
MsgID string `json:"msgid"` // 消息ID
OpenKFID string `json:"open_kfid"` // 客服帐号ID
ExternalUserID string `json:"external_userid"` // 客户UserID
ReceptionistUserID string `json:"servicer_userid"` // 接待客服userID
MsgID string `json:"msgid"` // 消息 ID
OpenKFID string `json:"open_kfid"` // 客服帐号 ID
ExternalUserID string `json:"external_userid"` // 客户 UserID
ReceptionistUserID string `json:"servicer_userid"` // 接待客服 userID
SendTime uint64 `json:"send_time"` // 消息发送时间
Origin uint32 `json:"origin"` // 消息来源。3-客户回复的消息 4-系统推送的消 息
MsgType string `json:"msgtype"` // 消息类型

View File

@@ -20,7 +20,7 @@ const (
type UpgradeServiceConfigSchema struct {
util.CommonError
MemberRange struct {
UserIDList []string `json:"userid_list"` // 专员userid列表
UserIDList []string `json:"userid_list"` // 专员 userid 列表
DepartmentIDList []string `json:"department_id_list"` // 专员部门列表
} `json:"member_range"` // 专员服务配置范围
GroupChatRange struct {
@@ -51,17 +51,17 @@ func (r *Client) UpgradeServiceConfig() (info UpgradeServiceConfigSchema, err er
// UpgradeServiceOptions 为客户升级为专员或客户群服务请求参数
type UpgradeServiceOptions struct {
OpenKFID string `json:"open_kfid"` // 客服帐号ID
ExternalUserID string `json:"external_userid"` // 微信客户的external_userid
OpenKFID string `json:"open_kfid"` // 客服帐号 ID
ExternalUserID string `json:"external_userid"` // 微信客户的 external_userid
Type int `json:"type"` // 表示是升级到专员服务还是客户群服务。1:专员服务。2:客户群服务
Member struct {
UserID string `json:"userid"` // 服务专员的userid
UserID string `json:"userid"` // 服务专员的 userid
Wording string `json:"wording"` // 推荐语
} `json:"member"` // 推荐的服务专员type等于1时有效
} `json:"member"` // 推荐的服务专员type 等于 1 时有效
GroupChat struct {
ChatID string `json:"chat_id"` // 客户群id
ChatID string `json:"chat_id"` // 客户群 id
Wording string `json:"wording"` // 推荐语
} `json:"groupchat"` // 推荐的客户群type等于2时有效
} `json:"groupchat"` // 推荐的客户群type 等于 2 时有效
}
// UpgradeService 为客户升级为专员或客户群服务
@@ -87,13 +87,13 @@ func (r *Client) UpgradeService(options UpgradeServiceOptions) (info util.Common
// UpgradeMemberServiceOptions 为客户升级为专员服务请求参数
type UpgradeMemberServiceOptions struct {
OpenKFID string `json:"open_kfid"` // 客服帐号ID
ExternalUserID string `json:"external_userid"` // 微信客户的external_userid
OpenKFID string `json:"open_kfid"` // 客服帐号 ID
ExternalUserID string `json:"external_userid"` // 微信客户的 external_userid
Type int `json:"type"` // 表示是升级到专员服务还是客户群服务。1:专员服务
Member struct {
UserID string `json:"userid"` // 服务专员的userid
UserID string `json:"userid"` // 服务专员的 userid
Wording string `json:"wording"` // 推荐语
} `json:"member"` // 推荐的服务专员type等于1时有效
} `json:"member"` // 推荐的服务专员type 等于 1 时有效
}
// UpgradeMemberService 为客户升级为专员服务
@@ -119,13 +119,13 @@ func (r *Client) UpgradeMemberService(options UpgradeMemberServiceOptions) (info
// UpgradeServiceGroupChatOptions 为客户升级为客户群服务请求参数
type UpgradeServiceGroupChatOptions struct {
OpenKFID string `json:"open_kfid"` // 客服帐号ID
ExternalUserID string `json:"external_userid"` // 微信客户的external_userid
OpenKFID string `json:"open_kfid"` // 客服帐号 ID
ExternalUserID string `json:"external_userid"` // 微信客户的 external_userid
Type int `json:"type"` // 表示是升级到专员服务还是客户群服务。2:客户群服务
GroupChat struct {
ChatID string `json:"chat_id"` // 客户群id
ChatID string `json:"chat_id"` // 客户群 id
Wording string `json:"wording"` // 推荐语
} `json:"groupchat"` // 推荐的客户群type等于2时有效
} `json:"groupchat"` // 推荐的客户群type 等于 2 时有效
}
// UpgradeGroupChatService 为客户升级为客户群服务
@@ -153,8 +153,8 @@ func (r *Client) UpgradeGroupChatService(options UpgradeServiceGroupChatOptions)
// UpgradeServiceCancelOptions 为客户取消推荐
type UpgradeServiceCancelOptions struct {
OpenKFID string `json:"open_kfid"` // 客服帐号ID
ExternalUserID string `json:"external_userid"` // 微信客户的external_userid
OpenKFID string `json:"open_kfid"` // 客服帐号 ID
ExternalUserID string `json:"external_userid"` // 微信客户的 external_userid
}
// UpgradeServiceCancel 为客户取消推荐

View File

@@ -1,4 +1,4 @@
// Package message 消息推送,实现企业微信消息推送相关接口https://developer.work.weixin.qq.com/document/path/90235
// Package message 消息推送实现企业微信消息推送相关接口https://developer.work.weixin.qq.com/document/path/90235
package message
import (

View File

@@ -15,33 +15,33 @@ const (
type (
// SendRequestCommon 发送应用消息请求公共参数
SendRequestCommon struct {
// 指定接收消息的成员成员ID列表多个接收者用|分隔最多支持1000个 特殊情况:指定为"@all",则向该企业应用的全部成员发送
// 指定接收消息的成员,成员 ID 列表(多个接收者用‘|’分隔,最多支持 1000 个)。特殊情况:指定为"@all",则向该企业应用的全部成员发送
ToUser string `json:"touser"`
// 指定接收消息的部门部门ID列表多个接收者用|分隔最多支持100个。 当touser为"@all"时忽略本参数
// 指定接收消息的部门,部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为"@all"时忽略本参数
ToParty string `json:"toparty"`
// 指定接收消息的标签标签ID列表多个接收者用|分隔最多支持100个。 当touser为"@all"时忽略本参数
// 指定接收消息的标签,标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为"@all"时忽略本参数
ToTag string `json:"totag"`
// 消息类型此时固定为text
MsgType string `json:"msgtype"`
// 企业应用的id整型。企业内部开发可在应用的设置页面查看第三方服务商可通过接口 获取企业授权信息 获取该参数值
// 企业应用的 id整型。企业内部开发可在应用的设置页面查看第三方服务商可通过接口 获取企业授权信息 获取该参数值
AgentID string `json:"agentid"`
// 表示是否是保密消息0表示可对外分享1表示不能分享且内容显示水印默认为0
// 表示是否是保密消息0 表示可对外分享1 表示不能分享且内容显示水印,默认为 0
Safe int `json:"safe"`
// 表示是否开启id转译0表示否1表示是默认0。仅第三方应用需要用到企业自建应用可以忽略。
// 表示是否开启 id 转译0 表示否1 表示是,默认 0。仅第三方应用需要用到企业自建应用可以忽略。
EnableIDTrans int `json:"enable_id_trans"`
// 表示是否开启重复消息检查0表示否1表示是默认0
// 表示是否开启重复消息检查0 表示否1 表示是,默认 0
EnableDuplicateCheck int `json:"enable_duplicate_check"`
// 表示是否重复消息检查的时间间隔默认1800s最大不超过4小时
// 表示是否重复消息检查的时间间隔,默认 1800s最大不超过 4 小时
DuplicateCheckInterval int `json:"duplicate_check_interval"`
}
// SendResponse 发送应用消息响应参数
SendResponse struct {
util.CommonError
InvalidUser string `json:"invaliduser"` // 不合法的userid不区分大小写统一转为小写
InvalidParty string `json:"invalidparty"` // 不合法的partyid
InvalidTag string `json:"invalidtag"` // 不合法的标签id
UnlicensedUser string `json:"unlicenseduser"` // 没有基础接口许可(包含已过期)userid
MsgID string `json:"msgid"` // 消息id
InvalidUser string `json:"invaliduser"` // 不合法的 userid不区分大小写统一转为小写
InvalidParty string `json:"invalidparty"` // 不合法的 partyid
InvalidTag string `json:"invalidtag"` // 不合法的标签 id
UnlicensedUser string `json:"unlicenseduser"` // 没有基础接口许可 (包含已过期)userid
MsgID string `json:"msgid"` // 消息 id
ResponseCode string `json:"response_code"`
}
@@ -52,7 +52,7 @@ type (
}
// TextField 文本消息参数
TextField struct {
// 消息内容最长不超过2048个字节超过将截断支持id转译
// 消息内容,最长不超过 2048 个字节,超过将截断(支持 id 转译)
Content string `json:"content"`
}
@@ -63,7 +63,7 @@ type (
}
// ImageField 图片消息参数
ImageField struct {
// 图片媒体文件id可以调用上传临时素材接口获取
// 图片媒体文件 id可以调用上传临时素材接口获取
MediaID string `json:"media_id"`
}
@@ -74,7 +74,7 @@ type (
}
// VoiceField 语音消息参数
VoiceField struct {
// 语音文件id可以调用上传临时素材接口获取
// 语音文件 id可以调用上传临时素材接口获取
MediaID string `json:"media_id"`
}
)
@@ -82,7 +82,7 @@ type (
// Send 发送应用消息
// @desc 实现企业微信发送应用消息接口https://developer.work.weixin.qq.com/document/path/90236
func (r *Client) Send(apiName string, request interface{}) (*SendResponse, error) {
// 获取accessToken
// 获取 accessToken
accessToken, err := r.GetAccessToken()
if err != nil {
return nil, err
@@ -92,7 +92,7 @@ func (r *Client) Send(apiName string, request interface{}) (*SendResponse, error
if err != nil {
return nil, err
}
// 发起http请求
// 发起 http 请求
response, err := util.HTTPPost(fmt.Sprintf(sendURL, accessToken), string(jsonData))
if err != nil {
return nil, err
@@ -106,25 +106,25 @@ func (r *Client) Send(apiName string, request interface{}) (*SendResponse, error
// SendText 发送文本消息
func (r *Client) SendText(request SendTextRequest) (*SendResponse, error) {
// 发送文本消息MsgType参数固定为text
// 发送文本消息 MsgType 参数固定为text
request.MsgType = "text"
return r.Send("MessageSendText", request)
}
// SendImage 发送图片消息
func (r *Client) SendImage(request SendImageRequest) (*SendResponse, error) {
// 发送图片消息MsgType参数固定为image
// 发送图片消息 MsgType 参数固定为image
request.MsgType = "image"
return r.Send("MessageSendImage", request)
}
// SendVoice 发送语音消息
func (r *Client) SendVoice(request SendVoiceRequest) (*SendResponse, error) {
// 发送语音消息MsgType参数固定为voice
// 发送语音消息 MsgType 参数固定为voice
request.MsgType = "voice"
return r.Send("MessageSendVoice", request)
}
// 以上实现了部分常用消息推送SendText 发送文本消息、SendImage 发送图片消息、SendVoice 发送语音消息,
// 如需扩展其他消息类型,建议按照以上格式,扩展对应消息类型的参数即可
// 也可以直接使用Send方法按照企业微信消息推送的接口文档传对应消息类型的参数来使用
// 也可以直接使用 Send 方法,按照企业微信消息推送的接口文档传对应消息类型的参数来使用

View File

@@ -1,4 +1,4 @@
企业微信会话存档SDK基于企业微信C版官方SDK封装暂时只支持在`linux`环境下使用当前SDK。
企业微信会话存档 SDK基于企业微信 C 版官方 SDK 封装),暂时只支持在`linux`环境下使用当前 SDK。
### 官方文档地址
@@ -12,8 +12,8 @@ https://open.work.weixin.qq.com/api/doc/90000/90135/91774
2、从 `github.com/silenceper/wechat/v2/work/msgaudit/lib` 文件夹下复制 `libWeWorkFinanceSdk_C.so` 动态库文件到系统动态链接库默认文件夹下,或者复制到任意文件夹并在当前文件夹下执行 `export LD_LIBRARY_PATH=$(pwd)`命令设置动态链接库检索地址后即可正常使用
3、编译要求
- 开启CGO: `CGO_ENABLED=1`
- 增加tags参数`msgaudit` `go build -tags msgaudit`或者`go run -tags msgaudit main.go`
- 开启 CGO: `CGO_ENABLED=1`
- 增加 tags 参数`msgaudit` `go build -tags msgaudit`或者`go run -tags msgaudit main.go`
### Example
@@ -93,7 +93,7 @@ func main() {
}
}
//释放SDK实例
//释放 SDK 实例
client.Free()
}

View File

@@ -15,19 +15,19 @@ func (c ChatDataResponse) IsError() bool {
// ChatData 会话存档原始数据
type ChatData struct {
Seq uint64 `json:"seq,omitempty"` // 消息的seq值标识消息的序号。再次拉取需要带上上次回包中最大的seq。Uint64类型范围0-pow(2,64)-1
MsgID string `json:"msgid,omitempty"` // 消息id消息的唯一标识企业可以使用此字段进行消息去重。
Seq uint64 `json:"seq,omitempty"` // 消息的 seq 值,标识消息的序号。再次拉取需要带上上次回包中最大的 seq。Uint64 类型,范围 0-pow(2,64)-1
MsgID string `json:"msgid,omitempty"` // 消息 id消息的唯一标识企业可以使用此字段进行消息去重。
PublickeyVer uint32 `json:"publickey_ver,omitempty"` // 加密此条消息使用的公钥版本号。
EncryptRandomKey string `json:"encrypt_random_key,omitempty"` // 使用publickey_ver指定版本的公钥进行非对称加密后base64加密的内容需要业务方先base64 decode处理后再使用指定版本的私钥进行解密得出内容。
EncryptChatMsg string `json:"encrypt_chat_msg,omitempty"` // 消息密文。需要业务方使用将encrypt_random_key解密得到的内容与encrypt_chat_msg传入sdk接口DecryptData,得到消息明文。
EncryptRandomKey string `json:"encrypt_random_key,omitempty"` // 使用 publickey_ver 指定版本的公钥进行非对称加密后 base64 加密的内容,需要业务方先 base64 decode 处理后,再使用指定版本的私钥进行解密,得出内容。
EncryptChatMsg string `json:"encrypt_chat_msg,omitempty"` // 消息密文。需要业务方使用将 encrypt_random_key 解密得到的内容,与 encrypt_chat_msg传入 sdk 接口 DecryptData得到消息明文。
}
// ChatMessage 会话存档消息
type ChatMessage struct {
ID string // 消息id消息的唯一标识企业可以使用此字段进行消息去重。
From string // 消息发送方id。同一企业内容为userid非相同企业为external_userid。消息如果是机器人发出也为external_userid。
ToList []string // 消息接收方列表可能是多个同一个企业内容为userid非相同企业为external_userid。
Action string // 消息动作目前有send(发送消息)/recall(撤回消息)/switch(切换企业日志)三种类型。
ID string // 消息 id消息的唯一标识企业可以使用此字段进行消息去重。
From string // 消息发送方 id。同一企业内容为 userid非相同企业为 external_userid。消息如果是机器人发出也为 external_userid。
ToList []string // 消息接收方列表,可能是多个,同一个企业内容为 userid非相同企业为 external_userid。
Action string // 消息动作,目前有 send(发送消息)/recall(撤回消息)/switch(切换企业日志) 三种类型。
Type string // 消息类型
originData []byte // 原始消息对象
}
@@ -152,7 +152,7 @@ func (c ChatMessage) GetDocMessage() (msg DocMessage, err error) {
return msg, err
}
// GetMarkdownMessage 获取MarkDown格式消息
// GetMarkdownMessage 获取 MarkDown 格式消息
func (c ChatMessage) GetMarkdownMessage() (msg MarkdownMessage, err error) {
err = json.Unmarshal(c.originData, &msg)
return msg, err

View File

@@ -26,11 +26,11 @@ type Client struct {
// NewClient 初始会话会话存档实例
/**
* 初始化函数
* Return值=0表示该API调用成功
* Return 值=0 表示该 API 调用成功
*
* @param [in] sdk NewSdk返回的sdk指针
* @param [in] corpid 调用企业的企业id例如wwd08c8exxxx5ab44d可以在企业微信管理端--我的企业--企业信息查看
* @param [in] secret 聊天内容存档的Secret可以在企业微信管理端--管理工具--聊天内容存档查看
* @param [in] sdk NewSdk 返回的 sdk 指针
* @param [in] corpid 调用企业的企业 id例如wwd08c8exxxx5ab44d可以在企业微信管理端--我的企业--企业信息查看
* @param [in] secret 聊天内容存档的 Secret可以在企业微信管理端--管理工具--聊天内容存档查看
* @param [in] privateKey 消息加密私钥,可以在企业微信管理端--管理工具--消息加密公钥查看对用公钥,私钥一般由自己保存
*
*
@@ -57,7 +57,7 @@ func NewClient(cfg *config.Config) (*Client, error) {
}, nil
}
// Free 释放SDK实例是可调用该方法释放内存
// Free 释放 SDK 实例是可调用该方法释放内存
func (s *Client) Free() {
if s.ptr == nil {
return
@@ -71,12 +71,12 @@ func (s *Client) Free() {
* 拉取聊天记录函数
*
*
* @param [in] seq 从指定的seq开始拉取消息注意的是返回的消息从seq+1开始返回seq为之前接口返回的最大seq值。首次使用请使用seq:0
* @param [in] limit 一次拉取的消息条数最大值1000条超过1000条会返回错误
* @param [in] seq 从指定的 seq 开始拉取消息,注意的是返回的消息从 seq+1 开始返回seq 为之前接口返回的最大 seq 值。首次使用请使用 seq:0
* @param [in] limit 一次拉取的消息条数,最大值 1000 条,超过 1000 条会返回错误
* @param [in] proxy 使用代理的请求需要传入代理的链接。如socks5://10.0.0.1:8081 或者 http://10.0.0.1:8081
* @param [in] passwd 代理账号密码,需要传入代理的账号密码。如 user_name:passwd_123
* @param [in] timeout 超时时间,单位秒
* @return chatDatas 返回本次拉取消息的数据slice结构体.内容包括errcode/errmsg以及每条消息内容。示例如下
* @return chatDatas 返回本次拉取消息的数据slice 结构体内容包括 errcode/errmsg以及每条消息内容。示例如下
{"errcode":0,"errmsg":"ok","chatdata":[{"seq":196,"msgid":"CAQQ2fbb4QUY0On2rYSAgAMgip/yzgs=","publickey_ver":3,"encrypt_random_key":"ftJ+uz3n/z1DsxlkwxNgE+mL38H42/KCvN8T60gbbtPD+Rta1hKTuQPzUzO6Hzne97MgKs7FfdDxDck/v8cDT6gUVjA2tZ/M7euSD0L66opJ/IUeBtpAtvgVSD5qhlaQjvfKJc/zPMGNK2xCLFYqwmQBZXbNT7uA69Fflm512nZKW/piK2RKdYJhRyvQnA1ISxK097sp9WlEgDg250fM5tgwMjujdzr7ehK6gtVBUFldNSJS7ndtIf6aSBfaLktZgwHZ57ONewWq8GJe7WwQf1hwcDbCh7YMG8nsweEwhDfUz+u8rz9an+0lgrYMZFRHnmzjgmLwrR7B/32Qxqd79A==","encrypt_chat_msg":"898WSfGMnIeytTsea7Rc0WsOocs0bIAerF6de0v2cFwqo9uOxrW9wYe5rCjCHHH5bDrNvLxBE/xOoFfcwOTYX0HQxTJaH0ES9OHDZ61p8gcbfGdJKnq2UU4tAEgGb8H+Q9n8syRXIjaI3KuVCqGIi4QGHFmxWenPFfjF/vRuPd0EpzUNwmqfUxLBWLpGhv+dLnqiEOBW41Zdc0OO0St6E+JeIeHlRZAR+E13Isv9eS09xNbF0qQXWIyNUi+ucLr5VuZnPGXBrSfvwX8f0QebTwpy1tT2zvQiMM2MBugKH6NuMzzuvEsXeD+6+3VRqL"}]}
*/
@@ -117,12 +117,12 @@ func (s *Client) GetChatData(seq uint64, limit uint64, proxy string, passwd stri
* 拉取聊天记录函数
*
*
* @param [in] seq 从指定的seq开始拉取消息注意的是返回的消息从seq+1开始返回seq为之前接口返回的最大seq值。首次使用请使用seq:0
* @param [in] limit 一次拉取的消息条数最大值1000条超过1000条会返回错误
* @param [in] seq 从指定的 seq 开始拉取消息,注意的是返回的消息从 seq+1 开始返回seq 为之前接口返回的最大 seq 值。首次使用请使用 seq:0
* @param [in] limit 一次拉取的消息条数,最大值 1000 条,超过 1000 条会返回错误
* @param [in] proxy 使用代理的请求需要传入代理的链接。如socks5://10.0.0.1:8081 或者 http://10.0.0.1:8081
* @param [in] passwd 代理账号密码,需要传入代理的账号密码。如 user_name:passwd_123
* @param [in] timeout 超时时间,单位秒
* @return chatDatas 返回本次拉取消息的数据slice结构体.内容包括errcode/errmsg以及每条消息内容。示例如下
* @return chatDatas 返回本次拉取消息的数据slice 结构体内容包括 errcode/errmsg以及每条消息内容。示例如下
{"errcode":0,"errmsg":"ok","chatdata":[{"seq":196,"msgid":"CAQQ2fbb4QUY0On2rYSAgAMgip/yzgs=","publickey_ver":3,"encrypt_random_key":"ftJ+uz3n/z1DsxlkwxNgE+mL38H42/KCvN8T60gbbtPD+Rta1hKTuQPzUzO6Hzne97MgKs7FfdDxDck/v8cDT6gUVjA2tZ/M7euSD0L66opJ/IUeBtpAtvgVSD5qhlaQjvfKJc/zPMGNK2xCLFYqwmQBZXbNT7uA69Fflm512nZKW/piK2RKdYJhRyvQnA1ISxK097sp9WlEgDg250fM5tgwMjujdzr7ehK6gtVBUFldNSJS7ndtIf6aSBfaLktZgwHZ57ONewWq8GJe7WwQf1hwcDbCh7YMG8nsweEwhDfUz+u8rz9an+0lgrYMZFRHnmzjgmLwrR7B/32Qxqd79A==","encrypt_chat_msg":"898WSfGMnIeytTsea7Rc0WsOocs0bIAerF6de0v2cFwqo9uOxrW9wYe5rCjCHHH5bDrNvLxBE/xOoFfcwOTYX0HQxTJaH0ES9OHDZ61p8gcbfGdJKnq2UU4tAEgGb8H+Q9n8syRXIjaI3KuVCqGIi4QGHFmxWenPFfjF/vRuPd0EpzUNwmqfUxLBWLpGhv+dLnqiEOBW41Zdc0OO0St6E+JeIeHlRZAR+E13Isv9eS09xNbF0qQXWIyNUi+ucLr5VuZnPGXBrSfvwX8f0QebTwpy1tT2zvQiMM2MBugKH6NuMzzuvEsXeD+6+3VRqL"}]}
*/
@@ -152,11 +152,11 @@ func (s *Client) GetRawChatData(seq uint64, limit uint64, proxy string, passwd s
return data, err
}
// DecryptData 解析密文.企业微信自有解密内容
// DecryptData 解析密文企业微信自有解密内容
/**
* @brief 解析密文.企业微信自有解密内容
* @param [in] encrypt_key, getchatdata返回的encrypt_random_key,使用企业自持对应版本秘钥RSA解密后的内容
* @param [in] encrypt_msg, getchatdata返回的encrypt_chat_msg
* @brief 解析密文企业微信自有解密内容
* @param [in] encrypt_key, getchatdata 返回的 encrypt_random_key使用企业自持对应版本秘钥 RSA 解密后的内容
* @param [in] encrypt_msg, getchatdata 返回的 encrypt_chat_msg
* @param [out] msg, 解密的消息明文
* @return 返回是否调用成功
* 0 - 成功
@@ -210,16 +210,16 @@ func (s *Client) DecryptData(encryptRandomKey string, encryptMsg string) (msg Ch
// GetMediaData 拉取媒体消息函数
/**
* 拉取媒体消息函数
* Return值=0表示该API调用成功
* Return 值=0 表示该 API 调用成功
*
*
* @param [in] sdk NewSdk返回的sdk指针
* @param [in] sdkFileid 从GetChatData返回的聊天消息中媒体消息包括的sdkfileid
* @param [in] sdk NewSdk 返回的 sdk 指针
* @param [in] sdkFileid 从 GetChatData 返回的聊天消息中,媒体消息包括的 sdkfileid
* @param [in] proxy 使用代理的请求需要传入代理的链接。如socks5://10.0.0.1:8081 或者 http://10.0.0.1:8081
* @param [in] passwd 代理账号密码,需要传入代理的账号密码。如 user_name:passwd_123
* @param [in] indexbuf 媒体消息分片拉取需要填入每次拉取的索引信息。首次不需要填写默认拉取512k后续每次调用只需要将上次调用返回的outindexbuf填入即可。
* @param [in] indexbuf 媒体消息分片拉取,需要填入每次拉取的索引信息。首次不需要填写,默认拉取 512k后续每次调用只需要将上次调用返回的 outindexbuf 填入即可。
* @param [in] timeout 超时时间,单位秒
* @param [out] media_data 返回本次拉取的媒体数据.MediaData结构体.内容包括data(数据内容)/outindexbuf(下次索引)/is_finish(拉取完成标记)
* @param [out] media_data 返回本次拉取的媒体数据.MediaData 结构体内容包括 data(数据内容)/outindexbuf(下次索引)/is_finish(拉取完成标记)
*
* @return 返回是否调用成功

View File

@@ -2,7 +2,7 @@ package msgaudit
// Config 会话存档初始化参数
type Config struct {
CorpID string // 调用企业的企业id例如wwd08c8exxxx5ab44d可以在企业微信管理端--我的企业--企业信息查看
CorpSecret string // 聊天内容存档的Secret可以在企业微信管理端--管理工具--聊天内容存档查看
CorpID string // 调用企业的企业 id例如wwd08c8exxxx5ab44d可以在企业微信管理端--我的企业--企业信息查看
CorpSecret string // 聊天内容存档的 Secret可以在企业微信管理端--管理工具--聊天内容存档查看
RasPrivateKey string // 消息加密私钥,可以在企业微信管理端--管理工具--消息加密公钥查看对用公钥,私钥一般由自己保存
}

View File

@@ -10,11 +10,11 @@ import (
// 10002 数据解析失败
// 10003 系统失败
// 10004 密钥错误导致加密失败
// 10005 fileid错误
// 10005 fileid 错误
// 10006 解密失败
// 10007 找不到消息加密版本的私钥,需要重新传入私钥对
// 10008 解析encrypt_key出错
// 10009 ip非法
// 10008 解析 encrypt_key 出错
// 10009 ip 非法
// 10010 数据过期
// 10011 证书错误
const (
@@ -24,11 +24,11 @@ const (
SDKParseErrMsg = "数据解析失败"
SDKSystemErrMsg = "系统失败"
SDKSecretErrMsg = "密钥错误导致加密失败"
SDKFileIDErrMsg = "fileid错误"
SDKFileIDErrMsg = "fileid 错误"
SDKDecryptErrMsg = "解密失败"
SDKSecretMissErrMsg = "找不到消息加密版本的私钥,需要重新传入私钥对"
SDKEncryptKeyErrMsg = "解析encrypt_key出错"
SDKIPNotWhiteListErrMsg = "ip非法"
SDKEncryptKeyErrMsg = "解析 encrypt_key 出错"
SDKIPNotWhiteListErrMsg = "ip 非法"
SDKDataExpiredErrMsg = "数据过期"
SDKTokenExpiredErrMsg = "证书过期"
)
@@ -43,7 +43,7 @@ func (e Error) Error() string {
return fmt.Sprintf("%d:%s", e.ErrCode, e.ErrMsg)
}
// NewSDKErr 初始化新的SDK错误
// NewSDKErr 初始化新的 SDK 错误
func NewSDKErr(code int) Error {
msg := ""
switch code {

View File

@@ -22,15 +22,15 @@ typedef void FreeMediaData_t(MediaData_t*);
int main(int argc, char* argv[])
{
int ret = 0;
//seq 表示该企业存档消息序号该序号单调递增拉取序号建议设置为上次拉取返回结果中最大序号。首次拉取时seq0sdk会返回有效期内最早的消息。
//limit 表示本次拉取的最大消息条数取值范围为1~1000
//proxypasswd为代理参数如果运行sdk的环境不能直接访问外网需要配置代理参数。sdk访问的域名是"https://qyapi.weixin.qq.com"。
//建议先通过curl访问"https://qyapi.weixin.qq.com"验证代理配置正确后再传入sdk。
//timeout 为拉取会话存档的超时时间单位为秒建议超时时间设置为5s。
//sdkfileid 媒体文件id从解密后的会话存档中得到
//seq 表示该企业存档消息序号,该序号单调递增,拉取序号建议设置为上次拉取返回结果中最大序号。首次拉取时 seq0sdk 会返回有效期内最早的消息。
//limit 表示本次拉取的最大消息条数,取值范围为 1~1000
//proxypasswd 为代理参数,如果运行 sdk 的环境不能直接访问外网需要配置代理参数。sdk 访问的域名是"https://qyapi.weixin.qq.com"。
//建议先通过 curl 访问"https://qyapi.weixin.qq.com",验证代理配置正确后,再传入 sdk。
//timeout 为拉取会话存档的超时时间,单位为秒,建议超时时间设置为 5s。
//sdkfileid 媒体文件 id从解密后的会话存档中得到
//savefile 媒体文件保存路径
//encrypt_key 拉取会话存档返回的encrypt_random_key使用配置在企业微信管理台的rsa公钥对应的私钥解密后得到encrypt_key。
//encrypt_chat_msg 拉取会话存档返回的encrypt_chat_msg
//encrypt_key 拉取会话存档返回的 encrypt_random_key使用配置在企业微信管理台的 rsa 公钥对应的私钥解密后得到 encrypt_key。
//encrypt_chat_msg 拉取会话存档返回的 encrypt_chat_msg
if (argc < 2) {
printf("./sdktools 1(chatmsg) 2(mediadata) 3(decryptdata)\n");
printf("./sdktools 1 seq limit proxy passwd timeout\n");
@@ -47,14 +47,14 @@ int main(int argc, char* argv[])
newsdk_t* newsdk_fn = (newsdk_t*)dlsym(so_handle, "NewSdk");
WeWorkFinanceSdk_t* sdk = newsdk_fn();
//使用sdk前需要初始化初始化成功后的sdk可以一直使用。
//如需并发调用sdk建议每个线程持有一个sdk实例。
//初始化时请填入自己企业的corpidsecrectkey。
//使用 sdk 前需要初始化,初始化成功后的 sdk 可以一直使用。
//如需并发调用 sdk建议每个线程持有一个 sdk 实例。
//初始化时请填入自己企业的 corpidsecrectkey。
Init_t* init_fn = (Init_t*)dlsym(so_handle, "Init");
DestroySdk_t* destroysdk_fn = (DestroySdk_t*)dlsym(so_handle, "DestroySdk");
ret = init_fn(sdk, "wwd08c8e7c775ab44d", "zJ6k0naVVQ--gt9PUSSEvs03zW_nlDVmjLCTOTAfrew");
if (ret != 0) {
//sdk需要主动释放
//sdk 需要主动释放
destroysdk_fn(sdk);
printf("init sdk err ret:%d\n", ret);
return -1;
@@ -70,7 +70,7 @@ int main(int argc, char* argv[])
NewSlice_t* newslice_fn = (NewSlice_t*)dlsym(so_handle, "NewSlice");
FreeSlice_t* freeslice_fn = (FreeSlice_t*)dlsym(so_handle, "FreeSlice");
//每次使用GetChatData拉取存档前需要调用NewSlice获取一个chatDatas在使用完chatDatas中数据后还需要调用FreeSlice释放。
//每次使用 GetChatData 拉取存档前需要调用 NewSlice 获取一个 chatDatas在使用完 chatDatas 中数据后,还需要调用 FreeSlice 释放。
Slice_t* chatDatas = newslice_fn();
GetChatData_t* getchatdata_fn = (GetChatData_t*)dlsym(so_handle, "GetChatData");
ret = getchatdata_fn(sdk, iSeq, iLimit, argv[4], argv[5], timeout, chatDatas);
@@ -92,10 +92,10 @@ int main(int argc, char* argv[])
NewMediaData_t* newmediadata_fn = (NewMediaData_t*)dlsym(so_handle, "NewMediaData");
FreeMediaData_t* freemediadata_fn = (FreeMediaData_t*)dlsym(so_handle, "FreeMediaData");
//媒体文件每次拉取的最大size512k因此超过512k的文件需要分片拉取。若该文件未拉取完整mediaData中的is_finish会返回0同时mediaData中的outindexbuf会返回下次拉取需要传入GetMediaDataindexbuf。
//indexbuf一般格式如右侧所示”Range:bytes=524288-1048575“表示这次拉取的是从5242881048575的分片。单个文件首次拉取填写的indexbuf为空字符串拉取后续分片时直接填入上次返回的indexbuf即可。
//媒体文件每次拉取的最大 size512k因此超过 512k 的文件需要分片拉取。若该文件未拉取完整mediaData 中的 is_finish 会返回 0同时 mediaData 中的 outindexbuf 会返回下次拉取需要传入 GetMediaDataindexbuf。
//indexbuf 一般格式如右侧所示”Range:bytes=524288-1048575“表示这次拉取的是从 5242881048575 的分片。单个文件首次拉取填写的 indexbuf 为空字符串,拉取后续分片时直接填入上次返回的 indexbuf 即可。
while (isfinish == 0) {
//每次使用GetMediaData拉取存档前需要调用NewMediaData获取一个mediaData在使用完mediaData中数据后还需要调用FreeMediaData释放。
//每次使用 GetMediaData 拉取存档前需要调用 NewMediaData 获取一个 mediaData在使用完 mediaData 中数据后,还需要调用 FreeMediaData 释放。
printf("index:%s\n", index.c_str());
MediaData_t* mediaData = newmediadata_fn();
ret = getmediadata_fn(sdk, index.c_str(), argv[2], argv[3], argv[4], timeout, mediaData);
@@ -107,7 +107,7 @@ int main(int argc, char* argv[])
}
printf("content size:%d isfin:%d outindex:%s\n", mediaData->data_len, mediaData->is_finish, mediaData->outindexbuf);
//大于512k的文件会分片拉取此处需要使用追加写避免后面的分片覆盖之前的数据。
//大于 512k 的文件会分片拉取,此处需要使用追加写,避免后面的分片覆盖之前的数据。
char file[200];
snprintf(file, sizeof(file), "%s", argv[6]);
FILE* fp = fopen(file, "ab+");
@@ -121,7 +121,7 @@ int main(int argc, char* argv[])
fwrite(mediaData->data, mediaData->data_len, 1, fp);
fclose(fp);
//获取下次拉取需要使用的indexbuf
//获取下次拉取需要使用的 indexbuf
index.assign(string(mediaData->outindexbuf));
isfinish = mediaData->is_finish;
freemediadata_fn(mediaData);
@@ -129,9 +129,9 @@ int main(int argc, char* argv[])
}
else if (type == 3) {
//解密会话存档内容
//sdk不会要求用户传入rsa私钥保证用户会话存档数据只有自己能够解密。
//此处需要用户先用rsa私钥解密encrypt_random_key后作为encrypt_key参数传入sdk来解密encrypt_chat_msg获取会话存档明文。
//每次使用DecryptData解密会话存档前需要调用NewSlice获取一个Msgs在使用完Msgs中数据后还需要调用FreeSlice释放。
//sdk 不会要求用户传入 rsa 私钥,保证用户会话存档数据只有自己能够解密。
//此处需要用户先用 rsa 私钥解密 encrypt_random_key 后,作为 encrypt_key 参数传入 sdk 来解密 encrypt_chat_msg 获取会话存档明文。
//每次使用 DecryptData 解密会话存档前需要调用 NewSlice 获取一个 Msgs在使用完 Msgs 中数据后,还需要调用 FreeSlice 释放。
NewSlice_t* newslice_fn = (NewSlice_t*)dlsym(so_handle, "NewSlice");
FreeSlice_t* freeslice_fn = (FreeSlice_t*)dlsym(so_handle, "FreeSlice");

View File

@@ -2,12 +2,12 @@ package msgaudit
// BaseMessage 基础消息
type BaseMessage struct {
MsgID string `json:"msgid,omitempty"` // 消息id消息的唯一标识企业可以使用此字段进行消息去重。
Action string `json:"action,omitempty"` // 消息动作目前有send(发送消息)/recall(撤回消息)/switch(切换企业日志)三种类型。
From string `json:"from,omitempty"` // 消息发送方id。同一企业内容为userid非相同企业为external_userid。消息如果是机器人发出也为external_userid。
ToList []string `json:"tolist,omitempty"` // 消息接收方列表可能是多个同一个企业内容为userid非相同企业为external_userid。
RoomID string `json:"roomid,omitempty"` // 群聊消息的群id。如果是单聊则为空。
MsgTime int64 `json:"msgtime,omitempty"` // 消息发送时间戳utc时间ms单位。
MsgID string `json:"msgid,omitempty"` // 消息 id消息的唯一标识企业可以使用此字段进行消息去重。
Action string `json:"action,omitempty"` // 消息动作,目前有 send(发送消息)/recall(撤回消息)/switch(切换企业日志) 三种类型。
From string `json:"from,omitempty"` // 消息发送方 id。同一企业内容为 userid非相同企业为 external_userid。消息如果是机器人发出也为 external_userid。
ToList []string `json:"tolist,omitempty"` // 消息接收方列表,可能是多个,同一个企业内容为 userid非相同企业为 external_userid。
RoomID string `json:"roomid,omitempty"` // 群聊消息的群 id。如果是单聊则为空。
MsgTime int64 `json:"msgtime,omitempty"` // 消息发送时间戳utc 时间ms 单位。
MsgType string `json:"msgtype,omitempty"` // 文本消息为text。
}
@@ -23,8 +23,8 @@ type TextMessage struct {
type ImageMessage struct {
BaseMessage
Image struct {
SdkFileID string `json:"sdkfileid,omitempty"` // 媒体资源的id信息。
Md5Sum string `json:"md5sum,omitempty"` // 图片资源的md5值供进行校验。
SdkFileID string `json:"sdkfileid,omitempty"` // 媒体资源的 id 信息。
Md5Sum string `json:"md5sum,omitempty"` // 图片资源的 md5 值,供进行校验。
FileSize uint32 `json:"filesize,omitempty"` // 图片资源的文件大小。
} `json:"image,omitempty"`
}
@@ -33,7 +33,7 @@ type ImageMessage struct {
type RevokeMessage struct {
BaseMessage
Revoke struct {
PreMsgID string `json:"pre_msgid,omitempty"` // 标识撤回的原消息的msgid
PreMsgID string `json:"pre_msgid,omitempty"` // 标识撤回的原消息的 msgid
} `json:"revoke,omitempty"`
}
@@ -41,8 +41,8 @@ type RevokeMessage struct {
type AgreeMessage struct {
BaseMessage
Agree struct {
UserID string `json:"userid,omitempty"` // 同意/不同意协议者的userid外部企业默认为external_userid。
AgreeTime int64 `json:"agree_time,omitempty"` // 同意/不同意协议的时间utc时间ms单位。
UserID string `json:"userid,omitempty"` // 同意/不同意协议者的 userid外部企业默认为 external_userid。
AgreeTime int64 `json:"agree_time,omitempty"` // 同意/不同意协议的时间utc 时间ms 单位。
} `json:"agree,omitempty"`
}
@@ -50,10 +50,10 @@ type AgreeMessage struct {
type VoiceMessage struct {
BaseMessage
Voice struct {
SdkFileID string `json:"sdkfileid,omitempty"` // 媒体资源的id信息。
SdkFileID string `json:"sdkfileid,omitempty"` // 媒体资源的 id 信息。
VoiceSize uint32 `json:"voice_size,omitempty"` // 语音消息大小。
PlayLength uint32 `json:"play_length,omitempty"` // 播放长度。
Md5Sum string `json:"md5sum,omitempty"` // 图片资源的md5值供进行校验。
Md5Sum string `json:"md5sum,omitempty"` // 图片资源的 md5 值,供进行校验。
} `json:"voice,omitempty"`
}
@@ -61,10 +61,10 @@ type VoiceMessage struct {
type VideoMessage struct {
BaseMessage
Video struct {
SdkFileID string `json:"sdkfileid,omitempty"` // 媒体资源的id信息。
SdkFileID string `json:"sdkfileid,omitempty"` // 媒体资源的 id 信息。
FileSize uint32 `json:"filesize,omitempty"` // 图片资源的文件大小。
PlayLength uint32 `json:"play_length,omitempty"` // 播放长度。
Md5Sum string `json:"md5sum,omitempty"` // 图片资源的md5值供进行校验。
Md5Sum string `json:"md5sum,omitempty"` // 图片资源的 md5 值,供进行校验。
} `json:"video,omitempty"`
}
@@ -73,7 +73,7 @@ type CardMessage struct {
BaseMessage
Card struct {
CorpName string `json:"corpname,omitempty"` // 名片所有者所在的公司名称。
UserID string `json:"userid,omitempty"` // 名片所有者的id同一公司是userid不同公司是external_userid
UserID string `json:"userid,omitempty"` // 名片所有者的 id同一公司是 userid不同公司是 external_userid
} `json:"card,omitempty"`
}
@@ -81,10 +81,10 @@ type CardMessage struct {
type LocationMessage struct {
BaseMessage
Location struct {
Lng float64 `json:"longitude,omitempty"` // 经度单位double
Lat float64 `json:"latitude,omitempty"` // 纬度单位double
Lng float64 `json:"longitude,omitempty"` // 经度,单位 double
Lat float64 `json:"latitude,omitempty"` // 纬度,单位 double
Address string `json:"address,omitempty"` // 地址信息
Title string `json:"title,omitempty"` // 位置信息的title。
Title string `json:"title,omitempty"` // 位置信息的 title。
Zoom uint32 `json:"zoom,omitempty"` // 缩放比例。
} `json:"location,omitempty"`
}
@@ -93,12 +93,12 @@ type LocationMessage struct {
type EmotionMessage struct {
BaseMessage
Emotion struct {
Type uint32 `json:"type,omitempty"` // 表情类型png或者gif.1表示gif 2表示png。
Type uint32 `json:"type,omitempty"` // 表情类型png 或者 gif.1 表示 gif 2 表示 png。
Width uint32 `json:"width,omitempty"` // 表情图片宽度。
Height uint32 `json:"height,omitempty"` // 表情图片高度。
ImageSize uint32 `json:"imagesize,omitempty"` // 资源的文件大小。
SdkFileID string `json:"sdkfileid,omitempty"` // 媒体资源的id信息。
Md5Sum string `json:"md5sum,omitempty"` // 图片资源的md5值供进行校验。
SdkFileID string `json:"sdkfileid,omitempty"` // 媒体资源的 id 信息。
Md5Sum string `json:"md5sum,omitempty"` // 图片资源的 md5 值,供进行校验。
} `json:"emotion,omitempty"`
}
@@ -108,9 +108,9 @@ type FileMessage struct {
File struct {
FileName string `json:"filename,omitempty"` // 文件名称。
FileExt string `json:"fileext,omitempty"` // 文件类型后缀。
SdkFileID string `json:"sdkfileid,omitempty"` // 媒体资源的id信息。
SdkFileID string `json:"sdkfileid,omitempty"` // 媒体资源的 id 信息。
FileSize uint32 `json:"filesize,omitempty"` // 文件大小。
Md5Sum string `json:"md5sum,omitempty"` // 资源的md5值供进行校验。
Md5Sum string `json:"md5sum,omitempty"` // 资源的 md5 值,供进行校验。
} `json:"file,omitempty"`
}
@@ -120,8 +120,8 @@ type LinkMessage struct {
Link struct {
Title string `json:"title,omitempty"` // 消息标题。
Desc string `json:"description,omitempty"` // 消息描述。
LinkURL string `json:"link_url,omitempty"` // 链接url地址
ImageURL string `json:"image_url,omitempty"` // 链接图片url。
LinkURL string `json:"link_url,omitempty"` // 链接 url 地址
ImageURL string `json:"image_url,omitempty"` // 链接图片 url。
} `json:"link,omitempty"`
}
@@ -159,8 +159,8 @@ type VoteMessage struct {
BaseMessage
VoteTitle string `json:"votetitle,omitempty"` // 投票主题。
VoteItem []string `json:"voteitem,omitempty"` // 投票选项,可能多个内容。
VoteType uint32 `json:"votetype,omitempty"` // 投票类型.101发起投票、102参与投票。
VoteID string `json:"voteid,omitempty"` // 投票id方便将参与投票消息与发起投票消息进行前后对照。
VoteType uint32 `json:"votetype,omitempty"` // 投票类型.101 发起投票、102 参与投票。
VoteID string `json:"voteid,omitempty"` // 投票 id方便将参与投票消息与发起投票消息进行前后对照。
}
// CollectMessage 填表消息
@@ -190,12 +190,12 @@ type MeetingMessage struct {
BaseMessage
Meeting struct {
Topic string `json:"topic,omitempty"` // 会议主题
StartTime int64 `json:"starttime,omitempty"` // 会议开始时间。Utc时间
EndTime int64 `json:"endtime,omitempty"` // 会议结束时间。Utc时间
StartTime int64 `json:"starttime,omitempty"` // 会议开始时间。Utc 时间
EndTime int64 `json:"endtime,omitempty"` // 会议结束时间。Utc 时间
Address string `json:"address,omitempty"` // 会议地址
Remarks string `json:"remarks,omitempty"` // 会议备注
MeetingType uint32 `json:"meetingtype,omitempty"` // 会议消息类型。101发起会议邀请消息、102处理会议邀请消息
MeetingID uint64 `json:"meetingid,omitempty"` // 会议id。方便将发起、处理消息进行对照
MeetingType uint32 `json:"meetingtype,omitempty"` // 会议消息类型。101 发起会议邀请消息、102 处理会议邀请消息
MeetingID uint64 `json:"meetingid,omitempty"` // 会议 id。方便将发起、处理消息进行对照
Status uint32 `json:"status,omitempty"` // 会议邀请处理状态。1 参加会议、2 拒绝会议、3 待定、4 未被邀请、5 会议已取消、6 会议已过期、7 不在房间内。
} `json:"meeting,omitempty"`
}
@@ -206,15 +206,15 @@ type DocMessage struct {
Doc struct {
Title string `json:"title,omitempty"` // 在线文档名称
LinkURL string `json:"link_url,omitempty"` // 在线文档链接
DocCreator string `json:"doc_creator,omitempty"` // 在线文档创建者。本企业成员创建为userid外部企业成员创建为external_userid
DocCreator string `json:"doc_creator,omitempty"` // 在线文档创建者。本企业成员创建为 userid外部企业成员创建为 external_userid
} `json:"doc,omitempty"`
}
// MarkdownMessage MarkDown消息
// MarkdownMessage MarkDown 消息
type MarkdownMessage struct {
BaseMessage
Info struct {
Content string `json:"content,omitempty"` // markdown消息内容目前为机器人发出的消息
Content string `json:"content,omitempty"` // markdown 消息内容,目前为机器人发出的消息
} `json:"info,omitempty"`
}
@@ -232,9 +232,9 @@ type CalendarMessage struct {
Calendar struct {
Title string `json:"title,omitempty"` // 日程主题
CreatorName string `json:"creatorname,omitempty"` // 日程组织者
AttendeeName []string `json:"attendeename,omitempty"` // 日程参与人。数组内容为String类型
StartTime int64 `json:"starttime,omitempty"` // 日程开始时间。Utc时间单位秒
EndTime int64 `json:"endtime,omitempty"` // 日程结束时间。Utc时间单位秒
AttendeeName []string `json:"attendeename,omitempty"` // 日程参与人。数组,内容为 String 类型
StartTime int64 `json:"starttime,omitempty"` // 日程开始时间。Utc 时间,单位秒
EndTime int64 `json:"endtime,omitempty"` // 日程结束时间。Utc 时间,单位秒
Place string `json:"place,omitempty"` // 日程地点
Remarks string `json:"remarks,omitempty"` // 日程备注
} `json:"calendar,omitempty"`
@@ -245,31 +245,31 @@ type MixedMessage struct {
BaseMessage
Mixed struct {
Item []MixedMsg `json:"item,omitempty"`
} `json:"mixed,omitempty"` // 消息内容。可包含图片、文字、表情等多种消息。Object类型
} `json:"mixed,omitempty"` // 消息内容。可包含图片、文字、表情等多种消息。Object 类型
}
// MeetingVoiceCallMessage 音频存档消息
type MeetingVoiceCallMessage struct {
BaseMessage
VoiceID string `json:"voiceid,omitempty"` // 音频id
MeetingVoiceCall *MeetingVoiceCall `json:"meeting_voice_call,omitempty"` // 音频消息内容。包括结束时间、fileid可能包括多个demofiledata、sharescreendata消息demofiledata表示文档共享信息sharescreendata表示屏幕共享信息。Object类型
VoiceID string `json:"voiceid,omitempty"` // 音频 id
MeetingVoiceCall *MeetingVoiceCall `json:"meeting_voice_call,omitempty"` // 音频消息内容。包括结束时间、fileid可能包括多个 demofiledata、sharescreendata 消息demofiledata 表示文档共享信息sharescreendata 表示屏幕共享信息。Object 类型
}
// VoipDocShareMessage 音频共享消息
type VoipDocShareMessage struct {
BaseMessage
VoipID string `json:"voipid,omitempty"` // 音频id
VoipDocShare *VoipDocShare `json:"voip_doc_share,omitempty"` // 共享文档消息内容。包括filename、md5sum、filesize、sdkfileid字段。Object类型
VoipID string `json:"voipid,omitempty"` // 音频 id
VoipDocShare *VoipDocShare `json:"voip_doc_share,omitempty"` // 共享文档消息内容。包括 filename、md5sum、filesize、sdkfileid 字段。Object 类型
}
// ExternalRedPacketMessage 互通小红包消息
type ExternalRedPacketMessage struct {
BaseMessage
RedPacket struct {
Type uint32 `json:"type,omitempty"` // 红包消息类型。1 普通红包、2 拼手气群红包。Uint32类型
Wish string `json:"wish,omitempty"` // 红包祝福语。String类型
TotalCnt uint32 `json:"totalcnt,omitempty"` // 红包总个数。Uint32类型
TotalAmount uint32 `json:"totalamount,omitempty"` // 红包总金额。Uint32类型单位为分。
Type uint32 `json:"type,omitempty"` // 红包消息类型。1 普通红包、2 拼手气群红包。Uint32 类型
Wish string `json:"wish,omitempty"` // 红包祝福语。String 类型
TotalCnt uint32 `json:"totalcnt,omitempty"` // 红包总个数。Uint32 类型
TotalAmount uint32 `json:"totalamount,omitempty"` // 红包总金额。Uint32 类型,单位为分。
} `json:"redpacket,omitempty"`
}
@@ -277,33 +277,33 @@ type ExternalRedPacketMessage struct {
type SphFeedMessage struct {
BaseMessage
SphFeed struct {
FeedType uint32 `json:"feed_type,omitempty"` // 视频号消息类型。2 图片、4 视频、9 直播。Uint32类型
SphName string `json:"sph_name,omitempty"` // 视频号账号名称。String类型
FeedDesc string `json:"feed_desc,omitempty"` // 视频号消息描述。String类型
FeedType uint32 `json:"feed_type,omitempty"` // 视频号消息类型。2 图片、4 视频、9 直播。Uint32 类型
SphName string `json:"sph_name,omitempty"` // 视频号账号名称。String 类型
FeedDesc string `json:"feed_desc,omitempty"` // 视频号消息描述。String 类型
}
}
// SwitchMessage 企业切换日志
type SwitchMessage struct {
MsgID string `json:"msgid,omitempty"` // 消息id消息的唯一标识企业可以使用此字段进行消息去重
Action string `json:"action,omitempty"` // 消息动作切换企业为switch
Time int64 `json:"time,omitempty"` // 消息发送时间戳utc时间ms单位。
User string `json:"user,omitempty"` // 具体为切换企业的成员的userid。
MsgID string `json:"msgid,omitempty"` // 消息 id消息的唯一标识企业可以使用此字段进行消息去重
Action string `json:"action,omitempty"` // 消息动作,切换企业为 switch
Time int64 `json:"time,omitempty"` // 消息发送时间戳utc 时间ms 单位。
User string `json:"user,omitempty"` // 具体为切换企业的成员的 userid。
}
// ChatRecord 会话记录消息
type ChatRecord struct {
Type string `json:"type,omitempty"` // 每条聊天记录的具体消息类型ChatRecordText/ ChatRecordFile/ ChatRecordImage/ ChatRecordVideo/ ChatRecordLink/ ChatRecordLocation/ ChatRecordMixed ….
Content string `json:"content,omitempty"` // 消息内容。Json串内容为对应类型的json
MsgTime int64 `json:"msgtime,omitempty"` // 消息时间utc时间ms单位。
Content string `json:"content,omitempty"` // 消息内容。Json 串,内容为对应类型的 json
MsgTime int64 `json:"msgtime,omitempty"` // 消息时间utc 时间ms 单位。
FromChatroom bool `json:"from_chatroom,omitempty"` // 是否来自群会话。
}
// CollectDetails 填表消息
type CollectDetails struct {
ID uint64 `json:"id,omitempty"` // 表项id
ID uint64 `json:"id,omitempty"` // 表项 id
Ques string `json:"ques,omitempty"` // 表项名称
Type string `json:"type,omitempty"` // 表项类型有Text(文本),Number(数字),Date(日期),Time(时间)
Type string `json:"type,omitempty"` // 表项类型,有 Text(文本),Number(数字),Date(日期),Time(时间)
}
// News 图文消息
@@ -311,7 +311,7 @@ type News struct {
Title string `json:"title,omitempty"` // 图文消息标题
Desc string `json:"description,omitempty"` // 图文消息描述
URL string `json:"url,omitempty"` // 图文消息点击跳转地址
PicURL string `json:"picurl,omitempty"` // 图文消息配图的url
PicURL string `json:"picurl,omitempty"` // 图文消息配图的 url
}
// MixedMsg 混合消息
@@ -323,22 +323,22 @@ type MixedMsg struct {
// MeetingVoiceCall 音频存档消息
type MeetingVoiceCall struct {
EndTime int64 `json:"endtime,omitempty"` // 音频结束时间
SdkFileID string `json:"sdkfileid,omitempty"` // 音频媒体下载的id
DemoFileData []DemoFileData `json:"demofiledata,omitempty"` // 文档分享对象Object类型
ShareScreenData []ShareScreenData `json:"sharescreendata,omitempty"` // 屏幕共享对象Object类型
SdkFileID string `json:"sdkfileid,omitempty"` // 音频媒体下载的 id
DemoFileData []DemoFileData `json:"demofiledata,omitempty"` // 文档分享对象Object 类型
ShareScreenData []ShareScreenData `json:"sharescreendata,omitempty"` // 屏幕共享对象Object 类型
}
// DemoFileData 文档共享消息
type DemoFileData struct {
FileName string `json:"filename,omitempty"` // 文档共享名称
DemoOperator string `json:"demooperator,omitempty"` // 文档共享操作用户的id
DemoOperator string `json:"demooperator,omitempty"` // 文档共享操作用户的 id
StartTime int64 `json:"starttime,omitempty"` // 文档共享开始时间
EndTime int64 `json:"endtime,omitempty"` // 文档共享结束时间
}
// ShareScreenData 屏幕共享信息
type ShareScreenData struct {
Share string `json:"share,omitempty"` // 屏幕共享用户的id
Share string `json:"share,omitempty"` // 屏幕共享用户的 id
StartTime int64 `json:"starttime,omitempty"` // 屏幕共享开始时间
EndTime int64 `json:"endtime,omitempty"` // 屏幕共享结束时间
}
@@ -346,7 +346,7 @@ type ShareScreenData struct {
// VoipDocShare 音频共享文档消息
type VoipDocShare struct {
FileName string `json:"filename,omitempty"` // 文档共享文件名称
Md5Sum string `json:"md5sum,omitempty"` // 共享文件的md5值
Md5Sum string `json:"md5sum,omitempty"` // 共享文件的 md5
FileSize uint64 `json:"filesize,omitempty"` // 共享文件的大小
SdkFileID string `json:"sdkfileid,omitempty"` // 共享文件的sdkfile通过此字段进行媒体数据下载
SdkFileID string `json:"sdkfileid,omitempty"` // 共享文件的 sdkfile通过此字段进行媒体数据下载
}

View File

@@ -17,7 +17,7 @@ type Oauth struct {
var (
// oauthTargetURL 企业微信内跳转地址
oauthTargetURL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect"
// oauthTargetURL 企业微信内跳转地址(获取成员的详细信息)
// oauthTargetURL 企业微信内跳转地址 (获取成员的详细信息)
oauthTargetPrivateURL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_privateinfo&agentid=%s&state=STATE#wechat_redirect"
// oauthUserInfoURL 获取用户信息地址
oauthUserInfoURL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=%s&code=%s"
@@ -80,7 +80,7 @@ type ResUserInfo struct {
ExternalUserID string `json:"external_userid"`
}
// UserFromCode 根据code获取用户信息
// UserFromCode 根据 code 获取用户信息
func (ctr *Oauth) UserFromCode(code string) (result ResUserInfo, err error) {
var accessToken string
if accessToken, err = ctr.GetAccessToken(); err != nil {

View File

@@ -9,118 +9,118 @@ type WebhookSendResponse struct {
// WebhookSendTextOption 机器人发送文本消息请求参数
type WebhookSendTextOption struct {
MsgType string `json:"msgtype"` // 消息类型,此时固定为text
MsgType string `json:"msgtype"` // 消息类型此时固定为 text
Text struct {
Content string `json:"content"` // 文本内容最长不超过2048个字节必须是utf8编码
MentionedList []string `json:"mentioned_list"` // userid的列表提醒群中的指定成员(@某个成员)@all表示提醒所有人如果开发者获取不到userid可以使用mentioned_mobile_list
MentionedMobileList []string `json:"mentioned_mobile_list"` // 手机号列表,提醒手机号对应的群成员(@某个成员)@all表示提醒所有人
Content string `json:"content"` // 文本内容,最长不超过 2048 个字节,必须是 utf8 编码
MentionedList []string `json:"mentioned_list"` // userid 的列表,提醒群中的指定成员 (@某个成员)@all 表示提醒所有人,如果开发者获取不到 userid可以使用 mentioned_mobile_list
MentionedMobileList []string `json:"mentioned_mobile_list"` // 手机号列表,提醒手机号对应的群成员 (@某个成员)@all 表示提醒所有人
} `json:"text"` // 文本消息内容
}
// WebhookSendMarkdownOption 机器人发送markdown消息请求参数
// WebhookSendMarkdownOption 机器人发送 markdown 消息请求参数
// 支持语法参考 https://developer.work.weixin.qq.com/document/path/91770
type WebhookSendMarkdownOption struct {
MsgType string `json:"msgtype"` // 消息类型,此时固定为markdown
MsgType string `json:"msgtype"` // 消息类型此时固定为 markdown
Markdown struct {
Content string `json:"content"` // markdown内容最长不超过4096个字节必须是utf8编码
} `json:"markdown"` // markdown消息内容
Content string `json:"content"` // markdown 内容,最长不超过 4096 个字节,必须是 utf8 编码
} `json:"markdown"` // markdown 消息内容
}
// WebhookSendImageOption 机器人发送图片消息请求参数
type WebhookSendImageOption struct {
MsgType string `json:"msgtype"` // 消息类型,此时固定为image
MsgType string `json:"msgtype"` // 消息类型此时固定为 image
Image struct {
Base64 string `json:"base64"` // 图片内容的base64编码
MD5 string `json:"md5"` // 图片内容base64编码前的md5值
Base64 string `json:"base64"` // 图片内容的 base64 编码
MD5 string `json:"md5"` // 图片内容base64 编码前)的 md5
} `json:"image"` // 图片消息内容
}
// WebhookSendNewsOption 机器人发送图文消息请求参数
type WebhookSendNewsOption struct {
MsgType string `json:"msgtype"` // 消息类型,此时固定为news
MsgType string `json:"msgtype"` // 消息类型此时固定为 news
News struct {
Articles []struct {
Title string `json:"title"` // 标题不超过128个字节超过会自动截断
Description string `json:"description"` // 描述不超过512个字节超过会自动截断
Title string `json:"title"` // 标题,不超过 128 个字节,超过会自动截断
Description string `json:"description"` // 描述,不超过 512 个字节,超过会自动截断
URL string `json:"url"` // 点击后跳转的链接
PicURL string `json:"picurl"` // 图文消息的图片链接支持JPG、PNG格式较好的效果为大图 1068*455小图150*150
} `json:"articles"` // 图文消息列表 一个图文消息支持1到8条图文
PicURL string `json:"picurl"` // 图文消息的图片链接,支持 JPG、PNG 格式,较好的效果为大图 1068*455小图 150*150
} `json:"articles"` // 图文消息列表 一个图文消息支持 1 到 8 条图文
} `json:"news"` // 图文消息内容
}
// WebhookSendFileOption 机器人发送文件消息请求参数
type WebhookSendFileOption struct {
MsgType string `json:"msgtype"` // 消息类型此时固定为file
MsgType string `json:"msgtype"` // 消息类型,此时固定为 file
File struct {
MediaID string `json:"media_id"` // 文件id通过下文的文件上传接口获取
MediaID string `json:"media_id"` // 文件 id通过下文的文件上传接口获取
} `json:"file"` // 文件类型
}
// WebHookSendTempNoticeOption 机器人发送文本通知模版消息请求参数
type WebHookSendTempNoticeOption struct {
MsgType string `json:"msgtype"` // 消息类型此时的消息类型固定为template_card
MsgType string `json:"msgtype"` // 消息类型,此时的消息类型固定为 template_card
TemplateCard TemplateCard `json:"template_card"` // 具体的模版卡片参数
}
// TemplateCard 具体的模版卡片参数
type TemplateCard struct {
CardType string `json:"card_type"` // 模版卡片的模版类型文本通知模版卡片的类型为text_notice
CardType string `json:"card_type"` // 模版卡片的模版类型,文本通知模版卡片的类型为 text_notice
Source CardSource `json:"source"` // 卡片来源样式信息,不需要来源样式可不填写
MainTitle CardTitle `json:"main_title"` // 模版卡片的主要内容,包括一级标题和标题辅助信息
EmphasisContent CardTitle `json:"emphasis_content"` // 关键数据样式
QuoteArea CardQuoteArea `json:"quote_area"` // 引用文献样式,建议不与关键数据共用
SubTitleText string `json:"sub_title_text"` // 二级普通文本建议不超过112个字。模版卡片主要内容的一级标题main_title.title和二级普通文本sub_title_text必须有一项填写
HorizontalContentList []CardContent `json:"horizontal_content_list"` // 二级标题+文本列表该字段可为空数组但有数据的话需确认对应字段是否必填列表长度不超过6
JumpList []JumpContent `json:"jump_list"` // 跳转指引样式的列表该字段可为空数组但有数据的话需确认对应字段是否必填列表长度不超过3
CardAction CardAction `json:"card_action"` // 整体卡片的点击跳转事件text_notice模版卡片中该字段为必填项
SubTitleText string `json:"sub_title_text"` // 二级普通文本,建议不超过 112 个字。模版卡片主要内容的一级标题 main_title.title 和二级普通文本 sub_title_text 必须有一项填写
HorizontalContentList []CardContent `json:"horizontal_content_list"` // 二级标题 + 文本列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过 6
JumpList []JumpContent `json:"jump_list"` // 跳转指引样式的列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过 3
CardAction CardAction `json:"card_action"` // 整体卡片的点击跳转事件text_notice 模版卡片中该字段为必填项
}
// CardSource 卡片来源样式信息,不需要来源样式可不填写
type CardSource struct {
IconURL string `json:"icon_url"` // 来源图片的url
Desc string `json:"desc"` // 来源图片的描述建议不超过13个字
IconURL string `json:"icon_url"` // 来源图片的 url
Desc string `json:"desc"` // 来源图片的描述,建议不超过 13 个字
DescColor int `json:"desc_color"` // 来源文字的颜色目前支持0(默认) 灰色1 黑色2 红色3 绿色
}
// CardTitle 标题和标题辅助信息
type CardTitle struct {
Title string `json:"title"` // 标题建议不超过26个字。模版卡片主要内容的一级标题main_title.title和二级普通文本sub_title_text必须有一项填写
Desc string `json:"desc"` // 标题辅助信息建议不超过30个字
Title string `json:"title"` // 标题,建议不超过 26 个字。模版卡片主要内容的一级标题 main_title.title 和二级普通文本 sub_title_text 必须有一项填写
Desc string `json:"desc"` // 标题辅助信息,建议不超过 30 个字
}
// CardQuoteArea 引用文献样式,建议不与关键数据共用
type CardQuoteArea struct {
Type int `json:"type"` // 引用文献样式区域点击事件0或不填代表没有点击事件1 代表跳转url2 代表跳转小程序
URL string `json:"url,omitempty"` // 点击跳转的urlquote_area.type是1时必填
Appid string `json:"appid,omitempty"` // 点击跳转的小程序的appidquote_area.type是2时必填
Pagepath string `json:"pagepath,omitempty"` // 点击跳转的小程序的pagepathquote_area.type是2时选填
Type int `json:"type"` // 引用文献样式区域点击事件0 或不填代表没有点击事件1 代表跳转 url2 代表跳转小程序
URL string `json:"url,omitempty"` // 点击跳转的 urlquote_area.type 是 1 时必填
Appid string `json:"appid,omitempty"` // 点击跳转的小程序的 appidquote_area.type 是 2 时必填
Pagepath string `json:"pagepath,omitempty"` // 点击跳转的小程序的 pagepathquote_area.type 是 2 时选填
Title string `json:"title"` // 引用文献样式的标题
QuoteText string `json:"quote_text"` // 引用文献样式的引用文案
}
// CardContent 二级标题+文本列表该字段可为空数组但有数据的话需确认对应字段是否必填列表长度不超过6
// CardContent 二级标题 + 文本列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过 6
type CardContent struct {
KeyName string `json:"keyname"` // 链接类型0或不填代表是普通文本1 代表跳转url2 代表下载附件3 代表@员工
Value string `json:"value"` // 二级标题,建议不超过5个字
Type int `json:"type,omitempty"` // 二级文本如果horizontal_content_list.type2该字段代表文件名称要包含文件类型建议不超过26个字
URL string `json:"url,omitempty"` // 链接跳转的urlhorizontal_content_list.type是1时必填
MediaID string `json:"media_id,omitempty"` // 附件的media_idhorizontal_content_list.type是2时必填
UserID string `json:"userid,omitempty"` // 被@的成员的useridhorizontal_content_list.type是3时必填
KeyName string `json:"keyname"` // 链接类型0 或不填代表是普通文本1 代表跳转 url2 代表下载附件3 代表@员工
Value string `json:"value"` // 二级标题,建议不超过 5 个字
Type int `json:"type,omitempty"` // 二级文本,如果 horizontal_content_list.type2该字段代表文件名称要包含文件类型建议不超过 26 个字
URL string `json:"url,omitempty"` // 链接跳转的 urlhorizontal_content_list.type 是 1 时必填
MediaID string `json:"media_id,omitempty"` // 附件的 media_idhorizontal_content_list.type 是 2 时必填
UserID string `json:"userid,omitempty"` // 被@的成员的 useridhorizontal_content_list.type 是 3 时必填
}
// JumpContent 跳转指引样式的列表该字段可为空数组但有数据的话需确认对应字段是否必填列表长度不超过3
// JumpContent 跳转指引样式的列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过 3
type JumpContent struct {
Type int `json:"type"` // 跳转链接类型0或不填代表不是链接1 代表跳转url2 代表跳转小程序
URL string `json:"url,omitempty"` // 跳转链接的urljump_list.type是1时必填
Title string `json:"title"` // 跳转链接样式的文案内容建议不超过13个字
AppID string `json:"appid,omitempty"` // 跳转链接的小程序的appidjump_list.type是2时必填
PagePath string `json:"pagepath,omitempty"` // 跳转链接的小程序的pagepathjump_list.type是2时选填
Type int `json:"type"` // 跳转链接类型0 或不填代表不是链接1 代表跳转 url2 代表跳转小程序
URL string `json:"url,omitempty"` // 跳转链接的 urljump_list.type 是 1 时必填
Title string `json:"title"` // 跳转链接样式的文案内容,建议不超过 13 个字
AppID string `json:"appid,omitempty"` // 跳转链接的小程序的 appidjump_list.type 是 2 时必填
PagePath string `json:"pagepath,omitempty"` // 跳转链接的小程序的 pagepathjump_list.type 是 2 时选填
}
// CardAction 整体卡片的点击跳转事件text_notice模版卡片中该字段为必填项
// CardAction 整体卡片的点击跳转事件text_notice 模版卡片中该字段为必填项
type CardAction struct {
Type int `json:"type"` // 卡片跳转类型1 代表跳转url2 代表打开小程序。text_notice模版卡片中该字段取值范围为[1,2]
URL string `json:"url,omitempty"` // 跳转事件的urlcard_action.type是1时必填
Appid string `json:"appid,omitempty"` // 跳转事件的小程序的appidcard_action.type是2时必填
PagePath string `json:"pagepath,omitempty"` // 跳转事件的小程序的pagepathcard_action.type是2时选填
Type int `json:"type"` // 卡片跳转类型1 代表跳转 url2 代表打开小程序。text_notice 模版卡片中该字段取值范围为 [1,2]
URL string `json:"url,omitempty"` // 跳转事件的 urlcard_action.type 是 1 时必填
Appid string `json:"appid,omitempty"` // 跳转事件的小程序的 appidcard_action.type 是 2 时必填
PagePath string `json:"pagepath,omitempty"` // 跳转事件的小程序的 pagepathcard_action.type 是 2 时选填
}