An open API service indexing awesome lists of open source software.

https://github.com/wenerme/go-wecom

Wechat Work/Wecom/企业微信 Golang SDK
https://github.com/wenerme/go-wecom

golang sdk wechat wechat-work wecom weixin

Last synced: 4 months ago
JSON representation

Wechat Work/Wecom/企业微信 Golang SDK

Awesome Lists containing this project

README

        

# go-wecom

[![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![Go Report Card][report-card-img]][report-card]

[doc-img]: https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square
[doc]: https://pkg.go.dev/github.com/wenerme/go-wecom?tab=doc
[ci-img]: https://github.com/wenerme/go-wecom/actions/workflows/ci.yml/badge.svg
[ci]: https://github.com/wenerme/go-wecom/actions/workflows/ci.yml
[cov-img]: https://codecov.io/gh/wenerme/go-wecom/branch/main/graph/badge.svg
[cov]: https://codecov.io/gh/wenerme/go-wecom/branch/main
[report-card-img]: https://goreportcard.com/badge/github.com/wenerme/go-wecom
[report-card]: https://goreportcard.com/report/github.com/wenerme/go-wecom

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 测试
- 支持拉取会话存档

```go
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 开发

```go
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,
})},
},
})
```

### 第三方应用开发配置
- 根据使用的接口不同,用到的信息也会不同

```go
client := wecom.NewClient(wecom.Conf{
CorpID: "",
ProviderSecret: "",
AuthCorpID: "",
AuthCorpPermanentCode: "",
SuiteID: "",
SuiteSecret: "",
SuiteTicket: "",
})
```

## 接口支持情况

* [x] 通讯录管理
* [x] 客户联系
* [ ] 微信客服
* [x] 身份验证
* [x] 应用管理
* [x] 消息推送
* [ ] 素材管理
* [ ] OA
* [-] 效率工具
* [ ] 企业支付
* [x] 会话内容存档
* [ ] 企业互联
* [ ] 电子发票

应用授权 - 100%

* [x] 获取第三方应用凭证
* [x] 获取预授权码
* [x] 设置授权配置
* [x] 获取企业永久授权码
* [x] 获取企业永久授权码
* [x] 获取企业授权信息
* [x] 获取企业凭证
* [x] 获取应用的管理员列表
* [x] 回调接口

通讯录管理 - 100%

* [x] 成员管理
- [x] 创建成员
- [x] 读取成员
- [x] 更新成员
- [x] 删除成员
- [x] 批量删除成员
- [x] 获取部门成员
- [x] 获取部门成员详情
- [x] userid与openid互换
- [x] 二次验证
- [x] 邀请成员
* [x] 部门管理
- [x] 创建部门
- [x] 更新部门
- [x] 删除部门
- [x] 获取部门列表
* [x] 标签管理
- [x] 创建标签
- [x] 更新标签名字
- [x] 删除标签
- [x] 获取标签成员
- [x] 增加标签成员
- [x] 删除标签成员
- [x] 获取标签列表
* [x] 异步批量接口
- [x] 增量更新成员
- [x] 全量覆盖成员
- [x] 全量覆盖部门
- [x] 获取异步任务结果
* [x] 通讯录回调通知
- [x] 成员变更通知
- [x] 部门变更通知
- [x] 标签变更通知
- [x] 异步任务完成通知

客户联系 - 100%

* [x] 成员对外信息
* [x] 客户管理
- [x] 获取客户列表
- [x] 获取客户详情
- [x] 批量获取客户详情
- [x] 修改客户备注信息
* [x] 客户标签管理
- [x] 管理企业标签
- [x] 编辑客户企业标签
* [x] 客户分配
- [x] 获取离职成员列表
- [x] 分配在职或离职成员的客户
- [x] 查询客户接替结果
- [x] 分配离职成员的客户群
* [x] 变更回调通知
- [x] 添加企业客户事件
- [x] 编辑企业客户事件
- [x] 外部联系人免验证添加成员事件
- [x] 删除企业客户事件
- [x] 删除跟进成员事件
- [x] 客户接替失败事件
- [x] 客户群变更事件

身份验证 - 100%

* [x] 获取访问用户身份

推广二维码

* [ ] 获取注册码
* [ ] 查询注册状态
* [ ] 设置授权应用可见范围
* [ ] 设置通讯录同步完成
* [ ] 注册完成回调事件

应用管理 - 100%

* [x] 获取应用
* [x] 设置应用
* [x] 自定义菜单
- [x] 创建菜单
- [x] 获取菜单
- [x] 删除菜单

消息推送 - 100%

* [x] 发送应用消息
* [x] 接收消息
* [x] 发送消息到群聊会话
- [x] 创建群聊会话
- [x] 修改群聊会话
- [x] 获取群聊会话
- [x] 应用推送消息

### 消息类型

* [x] 文本消息
* [x] 图片消息
* [x] 语音消息
* [x] 视频消息
* [x] 文件消息
* [x] 文本卡片消息
* [x] 图文消息
* [x] 图文消息(mpnews)
* [x] markdown消息
* [x] 任务卡片消息

素材管理

* [ ] 上传临时素材
* [ ] 上传永久图片
* [ ] 获取临时素材
* [ ] 获取高清语音素材

OA

* [ ] 打卡
- [ ] 获取企业所有打卡规则
- [ ] 获取员工打卡规则
- [ ] 获取打卡记录数据
- [ ] 获取打卡日报数据
- [ ] 获取打卡月报数据
- [ ] 获取打卡人员排班信息
- [ ] 为打卡人员排班
- [ ] 录入打卡人员人脸信息
* [ ] 审批
- [ ] 获取审批模板详情
- [ ] 提交审批申请
- [ ] 审批申请状态变化回调通知
- [ ] 批量获取审批单号
- [ ] 获取审批申请详情
- [ ] 获取企业假期管理配置
- [ ] 修改成员假期余额
* [ ] 汇报
- [ ] 批量获取汇报记录单号
- [ ] 获取汇报记录详情
- [ ] 获取汇报统计数据
* [ ] 自建应用
- [ ] 审批流程引擎
* [ ] 会议室
- [ ] 会议室管理
- [ ] 会议室预定管理
* [ ] 紧急通知应用
- [ ] 发起语音电话
- [ ] 获取接听状态

效率工具 - 20%

* [x] 日程
- [x] 日历接口
- [x] 日程接口
- [x] 回调事件
* [ ] 会议
- [ ] 创建预约会议
- [ ] 修改预约会议
- [ ] 取消预约会议
- [ ] 获取成员会议ID列表
- [ ] 获取会议详情
* [ ] 直播
* [ ] 微盘
- [ ] 空间管理
- [ ] 空间权限
- [ ] 文件管理
- [ ] 文件权限
* [ ] 公费电话
- [ ] 获取公费电话拨打记录

企业支付

* [ ] 企业红包
* [ ] 向员工付款
* [ ] 向员工收款
* [ ] 对外收款
* [ ] 签名算法

企业互联

* [ ] 获取应用共享信息
* [ ] 获取下级企业的access_token
* [ ] 获取下级企业的小程序session

会话内容存档 - 100%

* [x] 获取会话内容存档开启成员列表
* [x] 获取会话同意情况
* [x] 客户同意进行聊天内容存档事件回调
* [x] 获取会话内容存档内部群信息

电子发票

* [ ] 查询电子发票
* [ ] 更新发票状态
* [ ] 批量更新发票状态
* [ ] 批量查询电子发票

- TBD
- 将企业管理员添加为外部联系人 https://work.weixin.qq.com/api/doc/13613
- change_external_tag shuffle
- 批量安装应用 https://open.work.weixin.qq.com/api/doc/20990

## 会话存档

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

**命令行工具**

```bash
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
```

**代码调用**

```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

- [wenerme/go-req](https://github.com/wenerme/go-req)
- 接口底层库
- [xen0n/go-workwx](https://github.com/xen0n/go-workwx)
- 比较成熟的 Golang 企业微信 SDK
- 没有 第三方接口、服务商接口、会话存档
- [NICEXAI/WeWorkFinanceSDK](https://github.com/NICEXAI/WeWorkFinanceSDK)
- 封装 WeWorkFinanceSDK
- [sbzhu/weworkapi_golang](https://github.com/sbzhu/weworkapi_golang)
- 官方 Golang 加密库