workwx

package module
v1.0.0-alpha.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 29, 2020 License: MIT Imports: 19 Imported by: 19

README

go-workwx

Travis Build Status Go Report Card GoDoc

import (
    "github.com/xen0n/go-workwx" // package workwx
)

A Work Weixin (a.k.a. Wechat Work) client SDK for Golang, that happens to be battle-tested and pretty serious about its types.

In production since late 2018, pushing all kinds of notifications and alerts in at least 2 of Qiniu's internal systems.

一个 Golang 企业微信客户端 SDK;碰巧在生产环境试炼过,还对类型很严肃。

自 2018 年末以来,在七牛至少 2 个内部系统运转至今,推送各种通知、告警。

English translation TODO for now, as the service covered here is not available outside of China (AFAIK).

Why another wheel?

工作中需要用 Go 实现一个简单的消息推送,想着找个开源库算了,然而现有唯一的开源企业微信 Golang SDK 代码质量不佳。只好自己写一个。

Update: 自从这个库写出来,已经过了很久;现在(2019.08)已经有三四个同类项目了。 不过看了看这些“竞品”,发现自己这个库的类型设计、公开接口、access token 处理等方面还不赖。 为什么人们总是喜欢写死请求 Host、用全局量、为拆包而拆包甚至不惜公开内部方法呢?

Features

  • 支持最近 3 个 Go 版本
  • 包名短
  • 支持覆盖 API Host,用于自己拦一层网关、临时调试等等奇葩需求
  • 支持使用自定义 http.Client
  • access token 处理靠谱
    • 你可以直接就做 API 调用,会自动请求 access token
    • 你也可以一行代码起一个后台 access token 刷新 goroutine
    • 自带指数退避重试
  • 严肃对待类型、公开接口
    • 公开暴露接口最小化,两步构造出 WorkwxApp 对象,然后直接用
    • 刻意不暴露企业微信原始接口请求、响应类型
    • 后续可能会做一个 lowlevel 包暴露裸的 API 接口,但很可能不做
    • 不为多态而多态,宁可 SDK 内部重复代码,也保证一个接口一类动作,下游用户 static dispatch
    • 个别数据模型做了调整甚至重做(如 UserInfoRecipient),以鼓励 idiomatic Go 风格
    • 几乎不会越俎代庖,一言不合 panic现存的少数一些情况都是要修掉的。
  • 自带一个 workwxctl 命令行小工具帮助调试
    • 用起来不爽提 issue 让我知道你在想啥

详情看 godoc 文档,还提供 Examples 小段代码可以参考。

Supported APIs

  • 通讯录管理 (部分支持,见下)
  • 外部联系人管理
  • 应用管理
  • 消息发送 (除修改群聊会话外全部支持)
  • 消息接收 (接口尚不稳定,极有可能做出不兼容改动,先不要用)
  • 素材管理 (支持上传, 见下)
  • 会话内容存档
  • 企业微信登录接口 (code2Session)
通讯录管理 API
  • 成员管理
    • 创建成员
    • 读取成员 NOTE: 成员对外信息暂未实现
    • 更新成员
    • 删除成员
    • 批量删除成员
    • 获取部门成员
    • 获取部门成员详情
    • userid与openid互换
    • 二次验证
    • 邀请成员
  • 部门管理
    • 创建部门
    • 更新部门
    • 删除部门
    • 获取部门列表
  • 标签管理
    • 创建标签
    • 更新标签名字
    • 删除标签
    • 获取标签成员
    • 增加标签成员
    • 删除标签成员
    • 获取标签列表
  • 异步批量接口
    • 增量更新成员
    • 全量覆盖成员
    • 全量覆盖部门
    • 获取异步任务结果
  • 通讯录回调通知
    • 成员变更通知
    • 部门变更通知
    • 标签变更通知
    • 异步任务完成通知
外部联系人管理 API
  • 成员对外信息
  • 客户管理
    • 获取客户列表
    • 获取客户详情
    • 修改客户备注信息
  • 客户标签管理
    • 管理企业标签
    • 编辑客户企业标签
  • 客户分配
    • 获取离职成员列表
    • 分配在职或离职成员的客户
    • 查询客户接替结果
    • 分配离职成员的客户群
  • 变更回调通知
    • 添加企业客户事件
    • 编辑企业客户事件
    • 外部联系人免验证添加成员事件
    • 删除企业客户事件
    • 删除跟进成员事件
    • 客户接替失败事件
    • 客户群变更事件
身份验证 API
  • 获取访问用户身份
应用管理 API
  • 获取应用
  • 设置应用
  • 自定义菜单
    • 创建菜单
    • 获取菜单
    • 删除菜单
消息发送 API
  • 发送应用消息
  • 接收消息
  • 发送消息到群聊会话
    • 创建群聊会话
    • 修改群聊会话
    • 获取群聊会话
    • 应用推送消息
消息类型
  • 文本消息
  • 图片消息
  • 语音消息
  • 视频消息
  • 文件消息
  • 文本卡片消息
  • 图文消息
  • 图文消息(mpnews)
  • markdown消息
素材管理 API
  • 上传临时素材
  • 上传永久图片
  • 获取临时素材
  • 获取高清语音素材
会话内容存档 API
  • 获取会话内容存档开启成员列表
  • 获取会话同意情况
  • 客户同意进行聊天内容存档事件回调
  • 获取会话内容存档内部群信息

Notes

关于保密消息发送

Markdown 等类型消息目前不支持作为保密消息发送,强行发送会报错。 那么为何发送消息的方法还全部带着 isSafe 参数呢?

一方面,企业微信服务方完全可能在未来支持更多消息类型的保密发送,到时候不希望客户端代码重新编译; 另一方面,反正响应会报错,你也不会留着这种逻辑。因此不改了。

License

Documentation

Index

Examples

Constants

View Source
const (
	// MsgAuditAgreeStatusAgree 同意
	MsgAuditAgreeStatusAgree = "Agree"
	// MsgAuditAgreeStatusDisagree 不同意
	MsgAuditAgreeStatusDisagree = "Disagree"
	// MsgAuditAgreeStatusDefaultAgree 默认同意
	MsgAuditAgreeStatusDefaultAgree = "Default_Agree"
)
View Source
const DefaultQYAPIHost = "https://qyapi.weixin.qq.com"

DefaultQYAPIHost 默认企业微信 API Host

Variables

This section is empty.

Functions

This section is empty.

Types

type ChangeType added in v1.0.0

type ChangeType string

ChangeType 变更类型

const ChangeTypeAddExternalContact ChangeType = "add_external_contact"

ChangeTypeAddExternalContact 添加企业客户事件

const ChangeTypeAddHalfExternalContact ChangeType = "add_half_external_contact"

ChangeTypeAddHalfExternalContact 外部联系人免验证添加成员事件

const ChangeTypeDelExternalContact ChangeType = "del_external_contact"

ChangeTypeDelExternalContact 删除企业客户事件

const ChangeTypeDelFollowUser ChangeType = "del_follow_user"

ChangeTypeDelFollowUser 删除跟进成员事件

const ChangeTypeEditExternalContact ChangeType = "edit_external_contact"

ChangeTypeEditExternalContact 编辑企业客户事件

const ChangeTypeTransferFail ChangeType = "transfer_fail"

ChangeTypeTransferFail 客户接替失败事件

type ChatInfo

type ChatInfo struct {
	// ChatID 群聊唯一标志
	ChatID string `json:"chatid"`
	// Name 群聊名
	Name string `json:"name"`
	// OwnerUserID 群主id
	OwnerUserID string `json:"owner"`
	// MemberUserIDs 群成员id列表
	MemberUserIDs []string `json:"userlist"`
}

ChatInfo 群聊信息

type CheckMsgAuditRoomAgreeInfo added in v1.0.0

type CheckMsgAuditRoomAgreeInfo struct {
	// StatusChangeTime 同意状态改变的具体时间
	StatusChangeTime time.Time
	// AgreeStatus 同意:”Agree”,不同意:”Disagree”,默认同意:”Default_Agree”
	AgreeStatus MsgAuditAgreeStatus
	// ExternalOpenID 群内外部联系人的externalopenid
	ExternalOpenID string
}

CheckMsgAuditRoomAgreeInfo 获取会话同意情况(群聊)同意信息

type CheckMsgAuditSingleAgreeInfo added in v1.0.0

type CheckMsgAuditSingleAgreeInfo struct {
	CheckMsgAuditSingleAgreeUserInfo
	// AgreeStatus 同意:”Agree”,不同意:”Disagree”,默认同意:”Default_Agree”
	AgreeStatus MsgAuditAgreeStatus
	// StatusChangeTime 同意状态改变的具体时间
	StatusChangeTime time.Time
}

CheckMsgAuditSingleAgreeInfo 获取会话同意情况(单聊)同意信息

type CheckMsgAuditSingleAgreeUserInfo added in v1.0.0

type CheckMsgAuditSingleAgreeUserInfo struct {
	// UserID 内部成员的userid
	UserID string `json:"userid"`
	// ExternalOpenID 外部成员的externalopenid
	ExternalOpenID string `json:"exteranalopenid"`
}

CheckMsgAuditSingleAgreeUserInfo 获取会话同意情况(单聊)内外成员

type CtorOption

type CtorOption interface {
	// contains filtered or unexported methods
}

CtorOption 客户端对象构造参数

func WithHTTPClient

func WithHTTPClient(client *http.Client) CtorOption

WithHTTPClient 使用给定的 http.Client 作为 HTTP 客户端

func WithQYAPIHost

func WithQYAPIHost(host string) CtorOption

WithQYAPIHost 覆盖默认企业微信 API 域名

type DeptInfo

type DeptInfo struct {
	// ID 部门 ID
	ID int64 `json:"id"`
	// Name 部门名称
	Name string `json:"name"`
	// ParentID 父亲部门id。根部门为1
	ParentID int64 `json:"parentid"`
	// Order 在父部门中的次序值。order值大的排序靠前。值范围是[0, 2^32)
	Order uint32 `json:"order"`
}

DeptInfo 部门信息

type EventAddExternalContact added in v1.0.0

type EventAddExternalContact interface {

	// GetUserID 企业服务人员的UserID
	GetUserID() string

	// GetExternalUserID 外部联系人的userid,注意不是企业成员的帐号
	GetExternalUserID() string

	// GetState 添加此用户的「联系我」方式配置的state参数,可用于识别添加此用户的渠道
	GetState() string

	// GetWelcomeCode 欢迎语code,可用于发送欢迎语
	GetWelcomeCode() string
	// contains filtered or unexported methods
}

EventAddExternalContact 添加企业客户事件的参数。

type EventAddHalfExternalContact added in v1.0.0

type EventAddHalfExternalContact interface {

	// GetUserID 企业服务人员的UserID
	GetUserID() string

	// GetExternalUserID 外部联系人的userid,注意不是企业成员的帐号
	GetExternalUserID() string

	// GetState 添加此用户的「联系我」方式配置的state参数,可用于识别添加此用户的渠道
	GetState() string
	// contains filtered or unexported methods
}

EventAddHalfExternalContact 外部联系人免验证添加成员事件。

type EventChangeExternalChat added in v1.0.0

type EventChangeExternalChat interface {

	// GetChatID 群ID
	GetChatID() string

	// GetToUserName 企业微信CorpID
	GetToUserName() string

	// GetFromUserName 此事件该值固定为sys,表示该消息由系统生成
	GetFromUserName() string

	// GetFailReason 接替失败的原因, customer_refused-客户拒绝, customer_limit_exceed-接替成员的客户数达到上限
	GetFailReason() string
	// contains filtered or unexported methods
}

EventChangeExternalChat 客户群变更事件

type EventDelExternalContact added in v1.0.0

type EventDelExternalContact interface {

	// GetUserID 企业服务人员的UserID
	GetUserID() string

	// GetExternalUserID 外部联系人的userid,注意不是企业成员的帐号
	GetExternalUserID() string
	// contains filtered or unexported methods
}

EventDelExternalContact 删除企业客户事件

type EventDelFollowUser added in v1.0.0

type EventDelFollowUser interface {

	// GetUserID 企业服务人员的UserID
	GetUserID() string

	// GetExternalUserID 外部联系人的userid,注意不是企业成员的帐号
	GetExternalUserID() string
	// contains filtered or unexported methods
}

EventDelFollowUser 删除跟进成员事件

type EventEditExternalContact added in v1.0.0

type EventEditExternalContact interface {

	// GetUserID 企业服务人员的UserID
	GetUserID() string

	// GetExternalUserID 外部联系人的userid,注意不是企业成员的帐号
	GetExternalUserID() string

	// GetState 添加此用户的「联系我」方式配置的state参数,可用于识别添加此用户的渠道
	GetState() string
	// contains filtered or unexported methods
}

EventEditExternalContact 编辑企业客户事件的参数。

type EventTransferFail added in v1.0.0

type EventTransferFail interface {

	// GetUserID 企业服务人员的UserID
	GetUserID() string

	// GetExternalUserID 外部联系人的userid,注意不是企业成员的帐号
	GetExternalUserID() string

	// GetFailReason 接替失败的原因, customer_refused-客户拒绝, customer_limit_exceed-接替成员的客户数达到上限
	GetFailReason() string
	// contains filtered or unexported methods
}

EventTransferFail 客户接替失败事件

type EventType added in v1.0.0

type EventType string

EventType 事件类型

const EventTypeChangeExternalChat EventType = "change_external_chat"

EventTypeChangeExternalChat 客户群变更事件

const EventTypeChangeExternalContact EventType = "change_external_contact"

EventTypeChangeExternalContact 企业客户事件

type ExternalAttr added in v1.0.0

type ExternalAttr struct {
	// Type 属性类型: 0-文本 1-网页 2-小程序
	Type int `json:"type"`
	// Name 属性名称: 需要先确保在管理端有创建该属性,否则会忽略
	Name string `json:"name"`
	// Text 文本类型的属性 ,type为0时必填
	Text ExternalAttrText `json:"text"`
	// Web 网页类型的属性,url和title字段要么同时为空表示清除该属性,要么同时不为空 ,type为1时必填
	Web ExternalAttrWeb `json:"web"`
	// Miniprogram 小程序类型的属性,appid和title字段要么同时为空表示清除改属性,要么同时不为空 ,type为2时必填
	Miniprogram ExternalAttrMiniprogram `json:"miniprogram"`
}

ExternalAttr 属性列表,目前支持文本、网页、小程序三种类型

type ExternalAttrMiniprogram added in v1.0.0

type ExternalAttrMiniprogram struct {
	// Appid 小程序appid,必须是有在本企业安装授权的小程序,否则会被忽略
	Appid string `json:"appid"`
	// Pagepath 小程序的页面路径
	Pagepath string `json:"pagepath"`
	// Title 企业对外简称,需从已认证的企业简称中选填。可在“我的企业”页中查看企业简称认证状态。
	Title string `json:"title"`
}

ExternalAttrMiniprogram 小程序类型的属性,appid和title字段要么同时为空表示清除改属性,要么同时不为空 ,type为2时必填

type ExternalAttrText added in v1.0.0

type ExternalAttrText struct {
	// Value 文本属性内容,长度限制12个UTF8字符
	Value string `json:"value"`
}

ExternalAttrText 文本类型的属性

type ExternalAttrWeb added in v1.0.0

type ExternalAttrWeb struct {
	// Url 网页的url,必须包含http或者https头
	Url string `json:"url"`
	// Title 网页的展示标题,长度限制12个UTF8字符
	Title string `json:"title"`
}

ExternalAttrWeb 网页类型的属性,url和title字段要么同时为空表示清除该属性,要么同时不为空 ,type为1时必填

type ExternalContact added in v1.0.0

type ExternalContact struct {
	// ExternalUserid 外部联系人的userid
	ExternalUserid string `json:"external_userid"`
	// Name 外部联系人的名称,如果外部联系人为微信用户,则返回外部联系人的名称为其微信昵称;如果外部联系人为企业微信用户,则会按照以下优先级顺序返回:此外部联系人或管理员设置的昵称、认证的实名和账号名称。
	Name string `json:"name"`
	// Position 外部联系人的职位,如果外部企业或用户选择隐藏职位,则不返回,仅当联系人类型是企业微信用户时有此字段
	Position string `json:"position"`
	// Avatar 外部联系人头像,第三方不可获取
	Avatar string `json:"avatar"`
	// CorpName 外部联系人所在企业的简称,仅当联系人类型是企业微信用户时有此字段
	CorpName string `json:"corp_name"`
	// Type 外部联系人的类型,1表示该外部联系人是微信用户,2表示该外部联系人是企业微信用户
	Type ExternalUserType `json:"type"`
	// Gender 外部联系人性别 0-未知 1-男性 2-女性
	Gender UserGender `json:"gender"`
	// Unionid 外部联系人在微信开放平台的唯一身份标识(微信unionid),通过此字段企业可将外部联系人与公众号/小程序用户关联起来。仅当联系人类型是微信用户,且企业或第三方服务商绑定了微信开发者ID有此字段。查看绑定方法 关于返回的unionid,如果是第三方应用调用该接口,则返回的unionid是该第三方服务商所关联的微信开放者帐号下的unionid。也就是说,同一个企业客户,企业自己调用,与第三方服务商调用,所返回的unionid不同;不同的服务商调用,所返回的unionid也不同。
	Unionid string `json:"unionid"`
	// ExternalProfile 成员对外信息
	ExternalProfile ExternalProfile `json:"external_profile"`
}

ExternalContact 外部联系人

type ExternalContactCorpTag added in v1.0.0

type ExternalContactCorpTag struct {
	// ID 标签id
	ID string `json:"id"`
	// Name 标签名称
	Name string `json:"name"`
	// CreateTime 标签创建时间
	CreateTime int `json:"create_time"`
	// Order 标签排序的次序值,order值大的排序靠前。有效的值范围是[0, 2^32)
	Order uint32 `json:"order"`
	// Deleted 标签是否已经被删除,只在指定tag_id进行查询时返回
	Deleted bool `json:"deleted"`
}

ExternalContactCorpTag 企业客户标签

type ExternalContactCorpTagGroup added in v1.0.0

type ExternalContactCorpTagGroup struct {
	// GroupID 标签组id
	GroupID string `json:"group_id"`
	// GroupName 标签组名称
	GroupName string `json:"group_name"`
	// CreateTime 标签组创建时间
	CreateTime int `json:"create_time"`
	// Order 标签组排序的次序值,order值大的排序靠前。有效的值范围是[0, 2^32)
	Order uint32 `json:"order"`
	// Deleted 标签组是否已经被删除,只在指定tag_id进行查询时返回
	Deleted bool `json:"deleted"`
	// Tag 标签组内的标签列表
	Tag []ExternalContactCorpTag `json:"tag"`
}

ExternalContactCorpTagGroup 企业客户标签

type ExternalContactGroupChatTransferFailed added in v1.0.0

type ExternalContactGroupChatTransferFailed struct {
	// ChatID 没能成功继承的群ID
	ChatID string `json:"chat_id"`
	// ErrCode 没能成功继承的群,错误码
	ErrCode int `json:"errcode"`
	// ErrMsg 没能成功继承的群,错误描述
	ErrMsg string `json:"errmsg"`
}

ExternalContactGroupChatTransferFailed 离职成员的群再分配失败

type ExternalContactInfo added in v1.0.0

type ExternalContactInfo struct {
	ExternalContact ExternalContact `json:"external_contact"`
	FollowUser      []FollowUser    `json:"follow_user"`
}

type ExternalContactMarkTag added in v1.0.0

type ExternalContactMarkTag struct {
	// UserID 添加外部联系人的userid
	UserID string `json:"userid"`
	// ExternalUserID 外部联系人userid
	ExternalUserID string `json:"external_userid"`
	// AddTag 要标记的标签列表
	AddTag []string `json:"add_tag"`
	// RemoveTag 要移除的标签列表
	RemoveTag []string `json:"remove_tag"`
}

ExternalContactMarkTag 企业标记客户标签

type ExternalContactRemark added in v1.0.0

type ExternalContactRemark struct {
	// Userid 企业成员的userid
	Userid string `json:"userid"`
	// ExternalUserid 外部联系人userid
	ExternalUserid string `json:"external_userid"`
	// Remark 此用户对外部联系人的备注,最多20个字符,remark,description,remark_company,remark_mobiles和remark_pic_mediaid不可同时为空。
	Remark string `json:"remark"`
	// Description 此用户对外部联系人的描述,最多150个字符
	Description string `json:"description"`
	// RemarkCompany 此用户对外部联系人备注的所属公司名称,最多20个字符,remark_company只在此外部联系人为微信用户时有效。
	RemarkCompany string `json:"remark_company"`
	// RemarkMobiles 此用户对外部联系人备注的手机号,如果填写了remark_mobiles,将会覆盖旧的备注手机号。如果要清除所有备注手机号,请在remark_mobiles填写一个空字符串(“”)。
	RemarkMobiles []string `json:"remark_mobiles"`
	// RemarkPicMediaid 备注图片的mediaid,remark_pic_mediaid可以通过素材管理接口获得。
	RemarkPicMediaid string `json:"remark_pic_mediaid"`
}

ExternalContactRemark 客户备注信息

type ExternalContactTransferResult added in v1.0.0

type ExternalContactTransferResult struct {
	// Status 接替状态, 1-接替完毕 2-等待接替 3-客户拒绝 4-接替成员客户达到上限 5-无接替记录
	Status ExternalContactTransferStatus
	// TakeoverTime 接替客户的时间,如果是等待接替状态,则为未来的自动接替时间
	TakeoverTime time.Time
}

ExternalContactTransferResult 客户接替结果

type ExternalContactTransferStatus added in v1.0.0

type ExternalContactTransferStatus uint8

ExternalContactTransferStatus 客户接替结果状态

const (
	// ExternalContactTransferStatusSuccess 1-接替完毕
	ExternalContactTransferStatusSuccess ExternalContactTransferStatus = 1
	// ExternalContactTransferStatusWait 2-等待接替
	ExternalContactTransferStatusWait ExternalContactTransferStatus = 2
	// ExternalContactTransferStatusRefused 3-客户拒绝
	ExternalContactTransferStatusRefused ExternalContactTransferStatus = 3
	// ExternalContactTransferStatusExhausted 4-接替成员客户达到上限
	ExternalContactTransferStatusExhausted ExternalContactTransferStatus = 4
	// ExternalContactTransferStatusNoData 5-无接替记录
	ExternalContactTransferStatusNoData ExternalContactTransferStatus = 5
)

type ExternalContactUnassigned added in v1.0.0

type ExternalContactUnassigned struct {
	// HandoverUserID 离职成员的userid
	HandoverUserID string
	// ExternalUserID 外部联系人userid
	ExternalUserID string
	// DemissionTime 成员离职时间
	DemissionTime time.Time
}

ExternalContactUnassigned 离职成员的客户

type ExternalContactUnassignedList added in v1.0.0

type ExternalContactUnassignedList struct {
	// Info 离职成员的客户
	Info []ExternalContactUnassigned `json:"info"`
	// IsLast 是否是最后一条记录
	IsLast bool `json:"is_last"`
	// NextCursor 分页查询游标,已经查完则返回空("")
	NextCursor string `json:"next_cursor"`
}

ExternalContactUnassignedList 离职成员的客户列表

type ExternalProfile added in v1.0.0

type ExternalProfile struct {
	// ExternalCorpName 企业简称
	ExternalCorpName string `json:"external_corp_name"`
	// ExternalAttr 属性列表,目前支持文本、网页、小程序三种类型
	ExternalAttr []ExternalAttr `json:"external_attr"`
}

ExternalProfile 成员对外信息

type ExternalUserType added in v1.0.0

type ExternalUserType int

ExternalUserType 外部联系人的类型

1表示该外部联系人是微信用户 2表示该外部联系人是企业微信用户

const (
	// ExternalUserTypeWeChat 微信用户
	ExternalUserTypeWeChat ExternalUserType = 1
	// ExternalUserTypeWorkWeChat 企业微信用户
	ExternalUserTypeWorkWeChat ExternalUserType = 2
)

type FollowUser added in v1.0.0

type FollowUser struct {
	// Userid 外部联系人的userid
	Userid string `json:"userid"`
	// Remark 该成员对此外部联系人的备注
	Remark string `json:"remark"`
	// Description 该成员对此外部联系人的描述
	Description string `json:"description"`
	// Createtime 该成员添加此外部联系人的时间
	Createtime int `json:"createtime"`
	// Tags 该成员添加此外部联系人所打标签
	Tags []FollowUserTag `json:"tags"`
	// RemarkCorpName 该成员对此客户备注的企业名称
	RemarkCorpName string `json:"remark_corp_name"`
	// RemarkMobiles 该成员对此客户备注的手机号码,第三方不可获取
	RemarkMobiles []string `json:"remark_mobiles"`
	// AddWay 该成员添加此客户的来源
	AddWay FollowUserAddWay `json:"add_way"`
	// State 企业自定义的state参数,用于区分客户具体是通过哪个「联系我」添加,由企业通过创建「联系我」方式指定
	State string `json:"state"`
}

FollowUser 添加了外部联系人的企业成员

type FollowUserAddWay added in v1.0.0

type FollowUserAddWay int

FollowUserAddWay 该成员添加此客户的来源

具体含义详见[来源定义](https://work.weixin.qq.com/api/doc/90000/90135/92114#13878/%E6%9D%A5%E6%BA%90%E5%AE%9A%E4%B9%89)

const (
	// 未知来源
	FollowUserAddWayUnknown FollowUserAddWay = 0
	// 扫描二维码
	FollowUserAddWayQRCode FollowUserAddWay = 1
	// 搜索手机号
	FollowUserAddWayMobile FollowUserAddWay = 2
	// 名片分享
	FollowUserAddWayCard FollowUserAddWay = 3
	// 群聊
	FollowUserAddWayGroupChat FollowUserAddWay = 4
	// 手机通讯录
	FollowUserAddWayAddressBook FollowUserAddWay = 5
	// 微信联系人
	FollowUserAddWayWeChatContact FollowUserAddWay = 6
	// 来自微信的添加好友申请
	FollowUserAddWayWeChatFriendApply FollowUserAddWay = 7
	// 安装第三方应用时自动添加的客服人员
	FollowUserAddWayThirdParty FollowUserAddWay = 8
	// 搜索邮箱
	FollowUserAddWayEmail FollowUserAddWay = 9
	// 内部成员共享
	FollowUserAddWayInternalShare FollowUserAddWay = 201
	// 管理员/负责人分配
	FollowUserAddWayAdmin FollowUserAddWay = 202
)

type FollowUserTag added in v1.0.0

type FollowUserTag struct {
	// GroupName 该成员添加此外部联系人所打标签的分组名称(标签功能需要企业微信升级到2.7.5及以上版本)
	GroupName string `json:"group_name"`
	// TagName 该成员添加此外部联系人所打标签名称
	TagName string `json:"tag_name"`
	// Type 该成员添加此外部联系人所打标签类型, 1-企业设置, 2-用户自定义
	Type FollowUserTagType `json:"type"`
}

FollowUserTag 该成员添加此外部联系人所打标签

type FollowUserTagType added in v1.0.0

type FollowUserTagType int

FollowUserTagType 该成员添加此外部联系人所打标签类型

1-企业设置 2-用户自定义

const (
	// 企业设置
	FollowUserTagTypeWork FollowUserTagType = 1
	// 用户自定义
	FollowUserTagTypeUser FollowUserTagType = 2
)

type HTTPHandler added in v1.0.0

type HTTPHandler struct {
	// contains filtered or unexported fields
}

func NewHTTPHandler added in v1.0.0

func NewHTTPHandler(
	token string,
	encodingAESKey string,
	rxMessageHandler RxMessageHandler,
) (*HTTPHandler, error)

func (*HTTPHandler) ServeHTTP added in v1.0.0

func (h *HTTPHandler) ServeHTTP(rw http.ResponseWriter, r *http.Request)

type ImageMessageExtras added in v1.0.0

type ImageMessageExtras interface {

	// GetPicURL 返回图片消息的图片链接 URL。
	GetPicURL() string

	// GetMediaID 返回图片消息的图片媒体文件 ID。
	//
	// 可以调用【获取媒体文件】接口拉取,仅三天内有效。
	GetMediaID() string
	// contains filtered or unexported methods
}

ImageMessageExtras 图片消息的参数。

type JSCodeSession added in v1.0.0

type JSCodeSession struct {
	CorpID     string `json:"corpid"`
	UserID     string `json:"userid"`
	SessionKey string `json:"session_key"`
}

JSCodeSession 临时登录凭证

type LinkMessageExtras added in v1.0.0

type LinkMessageExtras interface {

	// GetTitle 返回链接消息的标题。
	GetTitle() string

	// GetDescription 返回链接消息的描述。
	GetDescription() string

	// GetURL 返回链接消息的跳转 URL。
	GetURL() string

	// GetPicURL 返回链接消息的封面缩略图 URL。
	GetPicURL() string
	// contains filtered or unexported methods
}

LinkMessageExtras 链接消息的参数。

type LocationMessageExtras added in v1.0.0

type LocationMessageExtras interface {

	// GetLatitude 返回位置消息的纬度(角度值;北纬为正)。
	GetLatitude() float64

	// GetLongitude 返回位置消息的经度(角度值;东经为正)。
	GetLongitude() float64

	// GetScale 返回位置消息的地图缩放大小。
	GetScale() int

	// GetLabel 返回位置消息的地理位置信息。
	GetLabel() string
	// contains filtered or unexported methods
}

LocationMessageExtras 位置消息的参数。

type Media

type Media struct {
	// contains filtered or unexported fields
}

Media 欲上传的素材

NOTE: 由于 Go `mime/multipart` 包的实现细节原因, 暂时不开放 Content-Type 定制,全部传 `application/octet-stream`。 如有需求,请去 GitHub 提 issue。

func NewMediaFromBuffer

func NewMediaFromBuffer(filename string, buf []byte) (*Media, error)

NewMediaFromBuffer 从内存创建一个欲上传的素材对象

func NewMediaFromFile

func NewMediaFromFile(f *os.File) (*Media, error)

NewMediaFromFile 从操作系统级文件创建一个欲上传的素材对象

type MediaUploadResult

type MediaUploadResult struct {
	// Type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file)
	Type string
	// MediaID 媒体文件上传后获取的唯一标识,3天内有效
	MediaID string
	// CreatedAt 媒体文件上传时间戳
	CreatedAt time.Time
}

MediaUploadResult 临时素材上传结果

type MessageType added in v1.0.0

type MessageType string

MessageType 消息类型

const MessageTypeEvent MessageType = "event"

MessageTypeEvent 事件消息

const MessageTypeImage MessageType = "image"

MessageTypeImage 图片消息

const MessageTypeLink MessageType = "link"

MessageTypeLink 链接消息

const MessageTypeLocation MessageType = "location"

MessageTypeLocation 位置消息

const MessageTypeText MessageType = "text"

MessageTypeText 文本消息

const MessageTypeVideo MessageType = "video"

MessageTypeVideo 视频消息

const MessageTypeVoice MessageType = "voice"

MessageTypeVoice 语音消息

type MsgAuditAgreeStatus added in v1.0.0

type MsgAuditAgreeStatus string

MsgAuditAgreeStatus 会话中外部成员的同意状态

type MsgAuditEdition added in v1.0.0

type MsgAuditEdition uint8

MsgAuditEdition 会话内容存档版本

const (
	// MsgAuditEditionOffice 会话内容存档办公版
	MsgAuditEditionOffice MsgAuditEdition = 1
	// MsgAuditEditionService 会话内容存档服务版
	MsgAuditEditionService MsgAuditEdition = 2
	// MsgAuditEditionEnterprise 会话内容存档企业版
	MsgAuditEditionEnterprise MsgAuditEdition = 3
)

type MsgAuditGroupChat added in v1.0.0

type MsgAuditGroupChat struct {
	// Members roomid对应的群成员列表
	Members []MsgAuditGroupChatMember
	// RoomName roomid对应的群名称
	RoomName string
	// Creator roomid对应的群创建者,userid
	Creator string
	// RoomCreateTime roomid对应的群创建时间
	RoomCreateTime time.Time
	// Notice roomid对应的群公告
	Notice string
}

MsgAuditGroupChat 获取会话内容存档内部群信息

type MsgAuditGroupChatMember added in v1.0.0

type MsgAuditGroupChatMember struct {
	// MemberID roomid群成员的id,userid
	MemberID int
	// JoinTime roomid群成员的入群时间
	JoinTime time.Time
}

MsgAuditGroupChatMember 获取会话内容存档内部群成员

type Recipient

type Recipient struct {
	// UserIDs 成员ID列表(消息接收者),最多支持1000个
	UserIDs []string
	// PartyIDs 部门ID列表,最多支持100个。
	PartyIDs []string
	// TagIDs 标签ID列表,最多支持100个
	TagIDs []string
	// ChatID 应用关联群聊ID,仅用于【发送消息到群聊会话】
	ChatID string
}

Recipient 消息收件人定义

type RxMessage added in v1.0.0

type RxMessage struct {
	// FromUserID 发送者的 UserID
	FromUserID string
	// SendTime 消息发送时间
	SendTime time.Time
	// MsgType 消息类型
	MsgType MessageType
	// MsgID 消息 ID
	MsgID int64
	// AgentID 企业应用 ID,可在应用的设置页面查看
	AgentID int64
	// Event 事件类型 MsgType为event存在
	Event EventType
	// ChangeType 变更类型 Event为change_external_contact存在
	ChangeType ChangeType
	// contains filtered or unexported fields
}

RxMessage 一条接收到的消息

func (*RxMessage) EventAddExternalContact added in v1.0.0

func (m *RxMessage) EventAddExternalContact() (EventAddExternalContact, bool)

EventAddExternalContact 如果消息为添加企业客户事件,则拿出相应的消息参数,否则返回 nil, false

func (*RxMessage) EventAddHalfExternalContact added in v1.0.0

func (m *RxMessage) EventAddHalfExternalContact() (EventAddHalfExternalContact, bool)

EventAddHalfExternalContact 如果消息为外部联系人免验证添加成员事件,则拿出相应的消息参数,否则返回 nil, false

func (*RxMessage) EventChangeExternalChat added in v1.0.0

func (m *RxMessage) EventChangeExternalChat() (EventChangeExternalChat, bool)

EventChangeExternalChat 如果消息为客户群变更事件,则拿出相应的消息参数,否则返回 nil, false

func (*RxMessage) EventDelExternalContact added in v1.0.0

func (m *RxMessage) EventDelExternalContact() (EventDelExternalContact, bool)

EventDelExternalContact 如果消息为删除企业客户事件,则拿出相应的消息参数,否则返回 nil, false

func (*RxMessage) EventDelFollowUser added in v1.0.0

func (m *RxMessage) EventDelFollowUser() (EventDelFollowUser, bool)

EventDelFollowUser 如果消息为删除跟进成员事件,则拿出相应的消息参数,否则返回 nil, false

func (*RxMessage) EventEditExternalContact added in v1.0.0

func (m *RxMessage) EventEditExternalContact() (EventEditExternalContact, bool)

EventEditExternalContact 如果消息为编辑企业客户事件,则拿出相应的消息参数,否则返回 nil, false

func (*RxMessage) EventTransferFail added in v1.0.0

func (m *RxMessage) EventTransferFail() (EventTransferFail, bool)

EventTransferFail 如果消息为客户接替失败事件,则拿出相应的消息参数,否则返回 nil, false

func (*RxMessage) Image added in v1.0.0

func (m *RxMessage) Image() (ImageMessageExtras, bool)

Image 如果消息为图片类型,则拿出相应的消息参数,否则返回 nil, false

func (m *RxMessage) Link() (LinkMessageExtras, bool)

Link 如果消息为链接类型,则拿出相应的消息参数,否则返回 nil, false

func (*RxMessage) Location added in v1.0.0

func (m *RxMessage) Location() (LocationMessageExtras, bool)

Location 如果消息为位置类型,则拿出相应的消息参数,否则返回 nil, false

func (*RxMessage) String added in v1.0.0

func (m *RxMessage) String() string

func (*RxMessage) Text added in v1.0.0

func (m *RxMessage) Text() (TextMessageExtras, bool)

Text 如果消息为文本类型,则拿出相应的消息参数,否则返回 nil, false

func (*RxMessage) Video added in v1.0.0

func (m *RxMessage) Video() (VideoMessageExtras, bool)

Video 如果消息为视频类型,则拿出相应的消息参数,否则返回 nil, false

func (*RxMessage) Voice added in v1.0.0

func (m *RxMessage) Voice() (VoiceMessageExtras, bool)

Voice 如果消息为语音类型,则拿出相应的消息参数,否则返回 nil, false

type RxMessageHandler added in v1.0.0

type RxMessageHandler interface {
	// OnIncomingMessage 一条消息到来时的回调。
	OnIncomingMessage(msg *RxMessage) error
}

RxMessageHandler 用来接收消息的接口。

type TextMessageExtras added in v1.0.0

type TextMessageExtras interface {

	// GetContent 返回文本消息的内容。
	GetContent() string
	// contains filtered or unexported methods
}

TextMessageExtras 文本消息的参数。

type UserDeptInfo

type UserDeptInfo struct {
	// DeptID 部门 ID
	DeptID int64
	// Order 部门内的排序值,默认为0,数值越大排序越前面
	Order uint32
	// IsLeader 在所在的部门内是否为上级
	IsLeader bool
}

UserDeptInfo 用户部门信息

type UserGender

type UserGender int

UserGender 用户性别

const (
	// UserGenderUnspecified 性别未定义
	UserGenderUnspecified UserGender = 0
	// UserGenderMale 男性
	UserGenderMale UserGender = 1
	// UserGenderFemale 女性
	UserGenderFemale UserGender = 2
)

type UserIdentityInfo added in v1.0.0

type UserIdentityInfo struct {
	// UserID 成员UserID。若需要获得用户详情信息,可调用通讯录接口:读取成员。如果是互联企业,则返回的UserId格式如:CorpId/userid
	UserID string `json:"UserId"`
	// OpenID 非企业成员的标识,对当前企业唯一。不超过64字节
	OpenID string `json:"OpenId"`
	// DeviceID 手机设备号(由企业微信在安装时随机生成,删除重装会改变,升级不受影响)
	DeviceID string `json:"DeviceId"`
}

UserIdentityInfo 访问用户身份信息

type UserInfo

type UserInfo struct {
	// UserID 成员UserID
	//
	// 对应管理端的账号,企业内必须唯一。不区分大小写,长度为1~64个字节
	UserID string
	// Name 成员名称
	Name string
	// Position 职务信息;第三方仅通讯录应用可获取
	Position string
	// Departments 成员所属部门信息
	Departments []UserDeptInfo
	// Mobile 手机号码;第三方仅通讯录应用可获取
	Mobile string
	// Gender 性别
	Gender UserGender
	// Email 邮箱;第三方仅通讯录应用可获取
	Email string
	// AvatarURL 头像 URL;第三方仅通讯录应用可获取
	//
	// NOTE:如果要获取小图将url最后的”/0”改成”/100”即可。
	AvatarURL string
	// Telephone 座机;第三方仅通讯录应用可获取
	Telephone string
	// IsEnabled 成员的启用状态
	IsEnabled bool
	// Alias 别名;第三方仅通讯录应用可获取
	Alias string
	// Status 成员激活状态
	Status UserStatus
	// QRCodeURL 员工个人二维码;第三方仅通讯录应用可获取
	//
	// 扫描可添加为外部联系人
	QRCodeURL string
}

UserInfo 用户信息

type UserStatus

type UserStatus int

UserStatus 用户激活信息

已激活代表已激活企业微信或已关注微工作台(原企业号)。 未激活代表既未激活企业微信又未关注微工作台(原企业号)。

const (
	// UserStatusActivated 已激活
	UserStatusActivated UserStatus = 1
	// UserStatusDeactivated 已禁用
	UserStatusDeactivated UserStatus = 2
	// UserStatusUnactivated 未激活
	UserStatusUnactivated UserStatus = 4
)

type VideoMessageExtras added in v1.0.0

type VideoMessageExtras interface {

	// GetMediaID 返回视频消息的视频媒体文件 ID。
	//
	// 可以调用【获取媒体文件】接口拉取,仅三天内有效。
	GetMediaID() string

	// GetThumbMediaID 返回视频消息缩略图的媒体 ID。
	//
	// 可以调用【获取媒体文件】接口拉取,仅三天内有效。
	GetThumbMediaID() string
	// contains filtered or unexported methods
}

VideoMessageExtras 视频消息的参数。

type VoiceMessageExtras added in v1.0.0

type VoiceMessageExtras interface {

	// GetMediaID 返回语音消息的语音媒体文件 ID。
	//
	// 可以调用【获取媒体文件】接口拉取,仅三天内有效。
	GetMediaID() string

	// GetFormat 返回语音消息的语音格式,如 "amr"、"speex" 等。
	GetFormat() string
	// contains filtered or unexported methods
}

VoiceMessageExtras 语音消息的参数。

type Workwx

type Workwx struct {

	// CorpID 企业 ID,必填
	CorpID string
	// contains filtered or unexported fields
}

Workwx 企业微信客户端

Example
corpID := "your_corpid"
corpSecret := "your_corpsecret"
agentID := int64(1234567)

client := workwx.New(corpID)

// there're advanced options
_ = workwx.New(
	corpID,
	workwx.WithQYAPIHost("http://localhost:8888"),
	workwx.WithHTTPClient(&http.Client{}),
)

// work with individual apps
app := client.WithApp(corpSecret, agentID)
app.SpawnAccessTokenRefresher()

// see other examples for more details

func New

func New(corpID string, opts ...CtorOption) *Workwx

New 构造一个 Workwx 客户端对象,需要提供企业 ID

func (*Workwx) WithApp

func (c *Workwx) WithApp(corpSecret string, agentID int64) *WorkwxApp

WithApp 构造本企业下某自建 app 的客户端

type WorkwxApp

type WorkwxApp struct {
	*Workwx

	// CorpSecret 应用的凭证密钥,必填
	CorpSecret string
	// AgentID 应用 ID,必填
	AgentID int64
	// contains filtered or unexported fields
}

WorkwxApp 企业微信客户端(分应用)

func (*WorkwxApp) AddExternalContactCorpTag added in v1.0.0

func (c *WorkwxApp) AddExternalContactCorpTag(req ExternalContactCorpTagGroup) ([]ExternalContactCorpTagGroup, error)

AddExternalContactCorpTag 添加企业客户标签

func (*WorkwxApp) CheckMsgAuditRoomAgree added in v1.0.0

func (c *WorkwxApp) CheckMsgAuditRoomAgree(roomId string) ([]CheckMsgAuditRoomAgreeInfo, error)

CheckMsgAuditRoomAgree 获取会话同意情况(群聊)

func (*WorkwxApp) CheckMsgAuditSingleAgree added in v1.0.0

func (c *WorkwxApp) CheckMsgAuditSingleAgree(infos []CheckMsgAuditSingleAgreeUserInfo) ([]CheckMsgAuditSingleAgreeInfo, error)

CheckMsgAuditSingleAgree 获取会话同意情况(单聊)

func (*WorkwxApp) CreateAppchat

func (c *WorkwxApp) CreateAppchat(chatInfo *ChatInfo) (chatid string, err error)

CreateAppchat 创建群聊会话

func (*WorkwxApp) DelExternalContactCorpTag added in v1.0.0

func (c *WorkwxApp) DelExternalContactCorpTag(tagID, groupID []string) error

DelExternalContactCorpTag 删除企业客户标签

func (*WorkwxApp) EditExternalContactCorpTag added in v1.0.0

func (c *WorkwxApp) EditExternalContactCorpTag(id, name string, order uint32) error

EditExternalContactCorpTag 编辑企业客户标签

func (*WorkwxApp) GetAppchat

func (c *WorkwxApp) GetAppchat(chatid string) (*ChatInfo, error)

GetAppchat 获取群聊会话

func (*WorkwxApp) GetExternalContact added in v1.0.0

func (c *WorkwxApp) GetExternalContact(externalUserid string) (*ExternalContactInfo, error)

GetExternalContact 获取客户详情

func (*WorkwxApp) GetJSAPITicket added in v1.0.0

func (c *WorkwxApp) GetJSAPITicket() (string, error)

GetJSAPITicket 获取 JSAPI_ticket

func (*WorkwxApp) GetJSAPITicketAgentConfig added in v1.0.0

func (c *WorkwxApp) GetJSAPITicketAgentConfig() (string, error)

GetJSAPITicketAgentConfig 获取 JSAPI_ticket_agent_config

func (*WorkwxApp) GetMsgAuditGroupChat added in v1.0.0

func (c *WorkwxApp) GetMsgAuditGroupChat(roomID string) (*MsgAuditGroupChat, error)

GetMsgAuditGroupChat 获取会话内容存档内部群信息

func (*WorkwxApp) GetTransferExternalContactResult added in v1.0.0

func (c *WorkwxApp) GetTransferExternalContactResult(externalUserID, handoverUserID, takeoverUserID string) (*ExternalContactTransferResult, error)

GetTransferExternalContactResult 查询客户接替结果

func (*WorkwxApp) GetUser

func (c *WorkwxApp) GetUser(userid string) (*UserInfo, error)

GetUser 读取成员

func (*WorkwxApp) GetUserIDByMobile added in v1.0.0

func (c *WorkwxApp) GetUserIDByMobile(mobile string) (string, error)

GetUserIDByMobile 通过手机号获取 userid

func (*WorkwxApp) GetUserInfoByCode added in v1.0.0

func (c *WorkwxApp) GetUserInfoByCode(code string) (*UserIdentityInfo, error)

GetUserInfoByCode 获取访问用户身份,根据code获取成员信息

func (*WorkwxApp) JSCode2Session added in v1.0.0

func (c *WorkwxApp) JSCode2Session(jscode string) (*JSCodeSession, error)

JSCode2Session 临时登录凭证校验

func (*WorkwxApp) ListAllDepts

func (c *WorkwxApp) ListAllDepts() ([]*DeptInfo, error)

ListAllDepts 获取全量组织架构。

func (*WorkwxApp) ListDepts

func (c *WorkwxApp) ListDepts(id int64) ([]*DeptInfo, error)

ListDepts 获取指定部门及其下的子部门。

func (*WorkwxApp) ListExternalContact added in v1.0.0

func (c *WorkwxApp) ListExternalContact(userID string) ([]string, error)

ListExternalContact 获取客户列表

func (*WorkwxApp) ListExternalContactCorpTags added in v1.0.0

func (c *WorkwxApp) ListExternalContactCorpTags(tagIDs ...string) ([]ExternalContactCorpTagGroup, error)

ListExternalContactCorpTags 获取企业标签库

func (*WorkwxApp) ListMsgAuditPermitUser added in v1.0.0

func (c *WorkwxApp) ListMsgAuditPermitUser(msgAuditEdition MsgAuditEdition) ([]string, error)

ListMsgAuditPermitUser 获取会话内容存档开启成员列表

func (*WorkwxApp) ListUnassignedExternalContact added in v1.0.0

func (c *WorkwxApp) ListUnassignedExternalContact(pageID, pageSize uint32, cursor string) (*ExternalContactUnassignedList, error)

ListUnassignedExternalContact 获取离职成员的客户列表

func (*WorkwxApp) ListUsersByDeptID

func (c *WorkwxApp) ListUsersByDeptID(deptID int64, fetchChild bool) ([]*UserInfo, error)

ListUsersByDeptID 获取部门成员详情

func (*WorkwxApp) MarkExternalContactTag added in v1.0.0

func (c *WorkwxApp) MarkExternalContactTag(userID, externalUserID string, addTag, removeTag []string) error

MarkExternalContactTag 标记客户企业标签

func (*WorkwxApp) RemarkExternalContact added in v1.0.0

func (c *WorkwxApp) RemarkExternalContact(req *ExternalContactRemark) error

RemarkExternalContact 修改客户备注信息

func (*WorkwxApp) SendFileMessage

func (c *WorkwxApp) SendFileMessage(
	recipient *Recipient,
	mediaID string,
	isSafe bool,
) error

SendFileMessage 发送文件消息

收件人参数如果仅设置了 `ChatID` 字段,则为【发送消息到群聊会话】接口调用; 否则为单纯的【发送应用消息】接口调用。

func (*WorkwxApp) SendImageMessage

func (c *WorkwxApp) SendImageMessage(
	recipient *Recipient,
	mediaID string,
	isSafe bool,
) error

SendImageMessage 发送图片消息

收件人参数如果仅设置了 `ChatID` 字段,则为【发送消息到群聊会话】接口调用; 否则为单纯的【发送应用消息】接口调用。

func (*WorkwxApp) SendMPNewsMessage

func (c *WorkwxApp) SendMPNewsMessage(
	recipient *Recipient,
	title string,
	thumbMediaID string,
	author string,
	sourceContentURL string,
	content string,
	digest string,
	isSafe bool,
) error

SendMPNewsMessage 发送 mpnews 类型的图文消息

收件人参数如果仅设置了 `ChatID` 字段,则为【发送消息到群聊会话】接口调用; 否则为单纯的【发送应用消息】接口调用。

func (*WorkwxApp) SendMarkdownMessage

func (c *WorkwxApp) SendMarkdownMessage(
	recipient *Recipient,
	content string,
	isSafe bool,
) error

SendMarkdownMessage 发送 Markdown 消息

仅支持 Markdown 的子集,详见[官方文档](https://work.weixin.qq.com/api/doc#90002/90151/90854/%E6%94%AF%E6%8C%81%E7%9A%84markdown%E8%AF%AD%E6%B3%95)。

收件人参数如果仅设置了 `ChatID` 字段,则为【发送消息到群聊会话】接口调用; 否则为单纯的【发送应用消息】接口调用。

func (*WorkwxApp) SendNewsMessage

func (c *WorkwxApp) SendNewsMessage(
	recipient *Recipient,
	title string,
	description string,
	url string,
	picURL string,
	isSafe bool,
) error

SendNewsMessage 发送图文消息

收件人参数如果仅设置了 `ChatID` 字段,则为【发送消息到群聊会话】接口调用; 否则为单纯的【发送应用消息】接口调用。

func (*WorkwxApp) SendTextCardMessage

func (c *WorkwxApp) SendTextCardMessage(
	recipient *Recipient,
	title string,
	description string,
	url string,
	buttonText string,
	isSafe bool,
) error

SendTextCardMessage 发送文本卡片消息

收件人参数如果仅设置了 `ChatID` 字段,则为【发送消息到群聊会话】接口调用; 否则为单纯的【发送应用消息】接口调用。

func (*WorkwxApp) SendTextMessage

func (c *WorkwxApp) SendTextMessage(
	recipient *Recipient,
	content string,
	isSafe bool,
) error

SendTextMessage 发送文本消息

收件人参数如果仅设置了 `ChatID` 字段,则为【发送消息到群聊会话】接口调用; 否则为单纯的【发送应用消息】接口调用。

Example
corpID := "your_corpid"
corpSecret := "your_corpsecret"
agentID := int64(1234567)

client := workwx.New(corpID)

app := client.WithApp(corpSecret, agentID)
// preferably do this at app initialization
app.SpawnAccessTokenRefresher()

// send to user(s)
to1 := workwx.Recipient{
	UserIDs: []string{"testuser"},
}
_ = app.SendTextMessage(&to1, "send to user(s)", false)

// "safe" message
to2 := workwx.Recipient{
	UserIDs: []string{"testuser"},
}
_ = app.SendTextMessage(&to2, "safe message", true)

// send to party(parties)
to3 := workwx.Recipient{
	PartyIDs: []string{"testdept"},
}
_ = app.SendTextMessage(&to3, "send to party(parties)", false)

// send to tag(s)
to4 := workwx.Recipient{
	TagIDs: []string{"testtag"},
}
_ = app.SendTextMessage(&to4, "send to tag(s)", false)

// send to chatid
to5 := workwx.Recipient{
	ChatID: "testchat",
}
_ = app.SendTextMessage(&to5, "send to chatid", false)

func (*WorkwxApp) SendVideoMessage

func (c *WorkwxApp) SendVideoMessage(
	recipient *Recipient,
	mediaID string,
	description string,
	title string,
	isSafe bool,
) error

SendVideoMessage 发送视频消息

收件人参数如果仅设置了 `ChatID` 字段,则为【发送消息到群聊会话】接口调用; 否则为单纯的【发送应用消息】接口调用。

func (*WorkwxApp) SendVoiceMessage

func (c *WorkwxApp) SendVoiceMessage(
	recipient *Recipient,
	mediaID string,
	isSafe bool,
) error

SendVoiceMessage 发送语音消息

收件人参数如果仅设置了 `ChatID` 字段,则为【发送消息到群聊会话】接口调用; 否则为单纯的【发送应用消息】接口调用。

func (*WorkwxApp) SpawnAccessTokenRefresher

func (c *WorkwxApp) SpawnAccessTokenRefresher()

SpawnAccessTokenRefresher 启动该 app 的 access token 刷新 goroutine

NOTE: 该 goroutine 本身没有 keep-alive 逻辑,需要自助保活

func (*WorkwxApp) SpawnAccessTokenRefresherWithContext added in v1.0.0

func (c *WorkwxApp) SpawnAccessTokenRefresherWithContext(ctx context.Context)

SpawnAccessTokenRefresherWithContext 启动该 app 的 access token 刷新 goroutine 可以通过 context cancellation 停止此 goroutine

NOTE: 该 goroutine 本身没有 keep-alive 逻辑,需要自助保活

func (*WorkwxApp) SpawnJSAPITicketAgentConfigRefresher added in v1.0.0

func (c *WorkwxApp) SpawnJSAPITicketAgentConfigRefresher()

SpawnJSAPITicketAgentConfigRefresher 启动该 app 的 JSAPI_ticket_agent_config 刷新 goroutine

NOTE: 该 goroutine 本身没有 keep-alive 逻辑,需要自助保活

func (*WorkwxApp) SpawnJSAPITicketAgentConfigRefresherWithContext added in v1.0.0

func (c *WorkwxApp) SpawnJSAPITicketAgentConfigRefresherWithContext(ctx context.Context)

SpawnJSAPITicketAgentConfigRefresherWithContext 启动该 app 的 JSAPI_ticket_agent_config 刷新 goroutine 可以通过 context cancellation 停止此 goroutine

NOTE: 该 goroutine 本身没有 keep-alive 逻辑,需要自助保活

func (*WorkwxApp) SpawnJSAPITicketRefresher added in v1.0.0

func (c *WorkwxApp) SpawnJSAPITicketRefresher()

SpawnJSAPITicketRefresher 启动该 app 的 JSAPI_ticket 刷新 goroutine

NOTE: 该 goroutine 本身没有 keep-alive 逻辑,需要自助保活

func (*WorkwxApp) SpawnJSAPITicketRefresherWithContext added in v1.0.0

func (c *WorkwxApp) SpawnJSAPITicketRefresherWithContext(ctx context.Context)

SpawnJSAPITicketRefresherWithContext 启动该 app 的 JSAPI_ticket 刷新 goroutine 可以通过 context cancellation 停止此 goroutine

NOTE: 该 goroutine 本身没有 keep-alive 逻辑,需要自助保活

func (*WorkwxApp) TransferExternalContact added in v1.0.0

func (c *WorkwxApp) TransferExternalContact(externalUserID, handoverUserID, takeoverUserID, transferSuccessMsg string) error

TransferExternalContact 分配成员的客户

func (*WorkwxApp) TransferGroupChatExternalContact added in v1.0.0

func (c *WorkwxApp) TransferGroupChatExternalContact(chatIDList []string, newOwner string) ([]ExternalContactGroupChatTransferFailed, error)

TransferGroupChatExternalContact 离职成员的群再分配

func (*WorkwxApp) UploadPermanentImageMedia

func (c *WorkwxApp) UploadPermanentImageMedia(media *Media) (url string, err error)

UploadPermanentImageMedia 上传永久图片素材

func (*WorkwxApp) UploadTempFileMedia

func (c *WorkwxApp) UploadTempFileMedia(media *Media) (*MediaUploadResult, error)

UploadTempFileMedia 上传临时文件素材

func (*WorkwxApp) UploadTempImageMedia

func (c *WorkwxApp) UploadTempImageMedia(media *Media) (*MediaUploadResult, error)

UploadTempImageMedia 上传临时图片素材

func (*WorkwxApp) UploadTempVideoMedia

func (c *WorkwxApp) UploadTempVideoMedia(media *Media) (*MediaUploadResult, error)

UploadTempVideoMedia 上传临时视频素材

func (*WorkwxApp) UploadTempVoiceMedia

func (c *WorkwxApp) UploadTempVoiceMedia(media *Media) (*MediaUploadResult, error)

UploadTempVoiceMedia 上传临时语音素材

type WorkwxClientError added in v1.0.0

type WorkwxClientError struct {
	// Code 错误码,0表示成功,非0表示调用失败。
	//
	// 开发者需根据errcode是否为0判断是否调用成功(errcode意义请见全局错误码)。
	Code errcodes.ErrCode
	// Msg 错误信息,调用失败会有相关的错误信息返回。
	//
	// 仅作参考,后续可能会有变动,因此不可作为是否调用成功的判据。
	Msg string
}

WorkwxClientError 企业微信客户端 SDK 的响应错误

func (*WorkwxClientError) Error added in v1.0.0

func (e *WorkwxClientError) Error() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL