Skip to content

wenerme/go-wecom

Repository files navigation

go-wecom

GoDoc Build Status Coverage Status Go Report Card

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)
}

Webhook 开发

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%
  • 获取会话内容存档开启成员列表
  • 获取会话同意情况
  • 客户同意进行聊天内容存档事件回调
  • 获取会话内容存档内部群信息
电子发票
  • 查询电子发票
  • 更新发票状态
  • 批量更新发票状态
  • 批量查询电子发票

会话存档

Note

  1. 会话存档保存 5
  2. 从 Sequence+1 拉取,不包含 Sequence
  3. limit 最大 1000
  4. 图片 jpg, 音频 amr, 视频 mp4
  5. MediaData 的 MD5 可能匹配不上,可以一直重试
  6. 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

Reference