Wechat Work/Wecom/企业微信 Golang SDK
- 支持自建应用开发 - AccessToken
- 支持第三方应用开发 - AuthCorpAccessToken
- 支持缓存所有带时效的信息 - AccessToken, JsTicket, AgentTicket, SuiteToken, AuthCorpAccessToken, PreAuthCode, ProviderAccessToken
- 缓存支持自定义存储 - 默认内存存储
- 支持从自定义的存储获取 密钥 信息 - SuiteTicket, PermanentCode
- 支持机器人 webhook
- 没有内部状态和 goroutine
- 自动尝试提前获取相应的 Token 和 Ticket - 有效期的 80%
- 实现逻辑清晰 - 没有实现的接口可直接调用
- wwcrypt - 企业微信回调加密实现 - 作用同 sbzhu/weworkapi_golang
- 数据模型大多基于官方接口文档生成 - 包含注释说明
- 包含 API+Event Mock 测试
- 支持拉取会话存档
package wecom_test
import (
"fmt"
"os"
"github.com/wenerme/go-req"
"github.com/wenerme/go-wecom/wecom"
)
func ExampleNewClient() {
// token store - 默认内存 Map - 可以使用数据库实现
store := &wecom.SyncMapStore{}
// 加载缓存 - 复用之前的 Token
if bytes, err := os.ReadFile("wecom-cache.json"); err == nil {
_ = store.Restore(bytes)
}
// 当 Token 变化时生成缓存文件
store.OnChange = func(s *wecom.SyncMapStore) {
_ = os.WriteFile("wecom-cache.json", s.Dump(), 0o600)
}
client := wecom.NewClient(wecom.Conf{
CorpID: "",
AgentID: 0,
CorpSecret: "",
// 不配置默认使用 内存缓存
TokenProvider: &wecom.TokenCache{
Store: store,
},
})
// 访问接口会自动获取或使用当前缓存
token, err := client.AccessToken()
if err != nil {
panic(err)
}
fmt.Println("Token", token)
ticket, err := client.JsAPITicket()
if err != nil {
panic(err)
}
fmt.Println("Ticket", ticket)
// 访问没有实现的接口
dto := wecom.IPListResponse{}
err = client.Request.With(req.Request{
URL: "/cgi-bin/get_api_domain_ip",
Options: []interface{}{
// 如果不需要 access_token
// wecom.WithoutAccessToken,
},
}).Fetch(&dto)
if err != nil {
panic(err)
}
fmt.Println("response", dto)
}
wecom.WebhookSend(&wecom.WebhookSendRequest{
Key: "KEY",
Content: wecom.SendTextContent{Content: "Hello"},
// debug for test only
Request: req.Request{
Options: []interface{}{req.DebugHook(&req.DebugOptions{
Body: true,
})},
},
})
- 根据使用的接口不同,用到的信息也会不同
client := wecom.NewClient(wecom.Conf{
CorpID: "",
ProviderSecret: "",
AuthCorpID: "",
AuthCorpPermanentCode: "",
SuiteID: "",
SuiteSecret: "",
SuiteTicket: "",
})
- 通讯录管理
- 客户联系
- 微信客服
- 身份验证
- 应用管理
- 消息推送
- 素材管理
- OA
- [-] 效率工具
- 企业支付
- 会话内容存档
- 企业互联
- 电子发票
应用授权 - 100%
- 获取第三方应用凭证
- 获取预授权码
- 设置授权配置
- 获取企业永久授权码
- 获取企业永久授权码
- 获取企业授权信息
- 获取企业凭证
- 获取应用的管理员列表
- 回调接口
通讯录管理 - 100%
- 成员管理
- 创建成员
- 读取成员
- 更新成员
- 删除成员
- 批量删除成员
- 获取部门成员
- 获取部门成员详情
- userid与openid互换
- 二次验证
- 邀请成员
- 部门管理
- 创建部门
- 更新部门
- 删除部门
- 获取部门列表
- 标签管理
- 创建标签
- 更新标签名字
- 删除标签
- 获取标签成员
- 增加标签成员
- 删除标签成员
- 获取标签列表
- 异步批量接口
- 增量更新成员
- 全量覆盖成员
- 全量覆盖部门
- 获取异步任务结果
- 通讯录回调通知
- 成员变更通知
- 部门变更通知
- 标签变更通知
- 异步任务完成通知
客户联系 - 100%
- 成员对外信息
- 客户管理
- 获取客户列表
- 获取客户详情
- 批量获取客户详情
- 修改客户备注信息
- 客户标签管理
- 管理企业标签
- 编辑客户企业标签
- 客户分配
- 获取离职成员列表
- 分配在职或离职成员的客户
- 查询客户接替结果
- 分配离职成员的客户群
- 变更回调通知
- 添加企业客户事件
- 编辑企业客户事件
- 外部联系人免验证添加成员事件
- 删除企业客户事件
- 删除跟进成员事件
- 客户接替失败事件
- 客户群变更事件
身份验证 - 100%
- 获取访问用户身份
推广二维码
- 获取注册码
- 查询注册状态
- 设置授权应用可见范围
- 设置通讯录同步完成
- 注册完成回调事件
应用管理 - 100%
- 获取应用
- 设置应用
- 自定义菜单
- 创建菜单
- 获取菜单
- 删除菜单
消息推送 - 100%
- 发送应用消息
- 接收消息
- 发送消息到群聊会话
- 创建群聊会话
- 修改群聊会话
- 获取群聊会话
- 应用推送消息
- 文本消息
- 图片消息
- 语音消息
- 视频消息
- 文件消息
- 文本卡片消息
- 图文消息
- 图文消息(mpnews)
- markdown消息
- 任务卡片消息
素材管理
- 上传临时素材
- 上传永久图片
- 获取临时素材
- 获取高清语音素材
OA
- 打卡
- 获取企业所有打卡规则
- 获取员工打卡规则
- 获取打卡记录数据
- 获取打卡日报数据
- 获取打卡月报数据
- 获取打卡人员排班信息
- 为打卡人员排班
- 录入打卡人员人脸信息
- 审批
- 获取审批模板详情
- 提交审批申请
- 审批申请状态变化回调通知
- 批量获取审批单号
- 获取审批申请详情
- 获取企业假期管理配置
- 修改成员假期余额
- 汇报
- 批量获取汇报记录单号
- 获取汇报记录详情
- 获取汇报统计数据
- 自建应用
- 审批流程引擎
- 会议室
- 会议室管理
- 会议室预定管理
- 紧急通知应用
- 发起语音电话
- 获取接听状态
效率工具 - 20%
- 日程
- 日历接口
- 日程接口
- 回调事件
- 会议
- 创建预约会议
- 修改预约会议
- 取消预约会议
- 获取成员会议ID列表
- 获取会议详情
- 直播
- 微盘
- 空间管理
- 空间权限
- 文件管理
- 文件权限
- 公费电话
- 获取公费电话拨打记录
企业支付
- 企业红包
- 向员工付款
- 向员工收款
- 对外收款
- 签名算法
企业互联
- 获取应用共享信息
- 获取下级企业的access_token
- 获取下级企业的小程序session
会话内容存档 - 100%
- 获取会话内容存档开启成员列表
- 获取会话同意情况
- 客户同意进行聊天内容存档事件回调
- 获取会话内容存档内部群信息
电子发票
- 查询电子发票
- 更新发票状态
- 批量更新发票状态
- 批量查询电子发票
- TBD
- 将企业管理员添加为外部联系人 https://work.weixin.qq.com/api/doc/13613
- change_external_tag shuffle
- 批量安装应用 https://open.work.weixin.qq.com/api/doc/20990
Note
- 会话存档保存 5 天
- 从 Sequence+1 拉取,不包含 Sequence
- limit 最大 1000
- 图片 jpg, 音频 amr, 视频 mp4
- MediaData 的 MD5 可能匹配不上,可以一直重试
- MediaData 单次最多返回 512K
- libWeWorkFinanceSdk_C.so
- 依赖 GLIBC
- 使用了 libcurl
- https_proxy 能生效
- 实际请求 qyapi.weixin.qq.com
- RSA2048 key
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem
- wwfinance-libs 内嵌了 libWeWorkFinanceSdk_C.so,可以解压出来
- wwfinance-poller 提供基础的验证工具
- 拉取所有数据到 sqlite wwfinance.db
命令行工具
make bin
# 配置
cp .env.example .env
# extract lib
./bin/wwfinance-libs
LD_LIBRARY_PATH=/tmp/wwf/libs ./bin/wwfinance-poller
# Docker 运行
docker run --rm -it -v $PWD/.env:/app/.env -v $PWD/data:/app/data wener/go-wecom
# 开发测试
LD_LIBRARY_PATH=$PWD/WeWorkFinanceSDK/libs go run ./cmd/wwfinance-poller/main.go
代码调用
package main
import (
"fmt"
dotenv "github.com/joho/godotenv"
"github.com/wenerme/go-wecom/WeWorkFinanceSDK"
)
func main() {
_ = dotenv.Load()
client, err := WeWorkFinanceSDK.NewClientFromEnv()
if err != nil {
panic(err)
}
data, err := client.GetChatData(WeWorkFinanceSDK.GetChatDataOptions{
Limit: 10,
Timeout: 5,
})
if err != nil {
panic(err)
}
for _, v := range data {
fmt.Println(v.Message)
}
}
- 支持代理
- https_proxy=127.0.0.1:1080
- wenerme/go-req
- 接口底层库
- xen0n/go-workwx
- 比较成熟的 Golang 企业微信 SDK
- 没有 第三方接口、服务商接口、会话存档
- NICEXAI/WeWorkFinanceSDK
- 封装 WeWorkFinanceSDK
- sbzhu/weworkapi_golang
- 官方 Golang 加密库