{"id":13600312,"url":"https://github.com/wenerme/go-wecom","last_synced_at":"2025-08-27T02:10:05.862Z","repository":{"id":37089652,"uuid":"398604494","full_name":"wenerme/go-wecom","owner":"wenerme","description":"Wechat Work/Wecom/企业微信 Golang SDK","archived":false,"fork":false,"pushed_at":"2023-05-26T07:45:43.000Z","size":5221,"stargazers_count":84,"open_issues_count":2,"forks_count":19,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-08-23T02:03:35.126Z","etag":null,"topics":["golang","sdk","wechat","wechat-work","wecom","weixin"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wenerme.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-08-21T16:22:38.000Z","updated_at":"2025-08-18T15:50:43.000Z","dependencies_parsed_at":"2024-06-18T17:11:38.169Z","dependency_job_id":"59548539-aa13-4f66-b2e7-1e1f7e8ed9b2","html_url":"https://github.com/wenerme/go-wecom","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/wenerme/go-wecom","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenerme%2Fgo-wecom","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenerme%2Fgo-wecom/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenerme%2Fgo-wecom/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenerme%2Fgo-wecom/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wenerme","download_url":"https://codeload.github.com/wenerme/go-wecom/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenerme%2Fgo-wecom/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272279660,"owners_count":24905954,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-27T02:00:09.397Z","response_time":76,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["golang","sdk","wechat","wechat-work","wecom","weixin"],"created_at":"2024-08-01T18:00:35.797Z","updated_at":"2025-08-27T02:10:05.788Z","avatar_url":"https://github.com/wenerme.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# go-wecom\n\n[![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![Go Report Card][report-card-img]][report-card]\n\n[doc-img]: https://img.shields.io/badge/go.dev-reference-007d9c?logo=go\u0026logoColor=white\u0026style=flat-square\n[doc]: https://pkg.go.dev/github.com/wenerme/go-wecom?tab=doc\n[ci-img]: https://github.com/wenerme/go-wecom/actions/workflows/ci.yml/badge.svg\n[ci]: https://github.com/wenerme/go-wecom/actions/workflows/ci.yml\n[cov-img]: https://codecov.io/gh/wenerme/go-wecom/branch/main/graph/badge.svg\n[cov]: https://codecov.io/gh/wenerme/go-wecom/branch/main\n[report-card-img]: https://goreportcard.com/badge/github.com/wenerme/go-wecom\n[report-card]: https://goreportcard.com/report/github.com/wenerme/go-wecom\n\nWechat Work/Wecom/企业微信 Golang SDK\n\n## 特性\n\n- 支持自建应用开发 - AccessToken\n- 支持第三方应用开发 - AuthCorpAccessToken\n- 支持缓存所有带时效的信息 - AccessToken, JsTicket, AgentTicket, SuiteToken, AuthCorpAccessToken, PreAuthCode, ProviderAccessToken\n  - 缓存支持自定义存储 - 默认内存存储\n- 支持从自定义的存储获取 密钥 信息 - SuiteTicket, PermanentCode\n- 支持机器人 webhook\n- 没有内部状态和 goroutine\n- 自动尝试提前获取相应的 Token 和 Ticket - 有效期的 80%\n- 实现逻辑清晰 - 没有实现的接口可直接调用\n- wwcrypt - 企业微信回调加密实现 - 作用同 sbzhu/weworkapi_golang\n- 数据模型大多基于官方接口文档生成 - 包含注释说明\n- 包含 API+Event Mock 测试\n- 支持拉取会话存档\n\n```go\npackage wecom_test\n\nimport (\n  \"fmt\"\n  \"os\"\n\n  \"github.com/wenerme/go-req\"\n  \"github.com/wenerme/go-wecom/wecom\"\n)\n\nfunc ExampleNewClient() {\n\t// token store - 默认内存 Map - 可以使用数据库实现\n\tstore := \u0026wecom.SyncMapStore{}\n\t// 加载缓存 - 复用之前的 Token\n\tif bytes, err := os.ReadFile(\"wecom-cache.json\"); err == nil {\n\t\t_ = store.Restore(bytes)\n\t}\n\t// 当 Token 变化时生成缓存文件\n\tstore.OnChange = func(s *wecom.SyncMapStore) {\n\t\t_ = os.WriteFile(\"wecom-cache.json\", s.Dump(), 0o600)\n\t}\n\n\tclient := wecom.NewClient(wecom.Conf{\n\t\tCorpID:     \"\",\n\t\tAgentID:    0,\n\t\tCorpSecret: \"\",\n\t\t// 不配置默认使用 内存缓存\n\t\tTokenProvider: \u0026wecom.TokenCache{\n\t\t\tStore: store,\n\t\t},\n\t})\n\n\t// 访问接口会自动获取或使用当前缓存\n\ttoken, err := client.AccessToken()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(\"Token\", token)\n\tticket, err := client.JsAPITicket()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(\"Ticket\", ticket)\n\n\t// 访问没有实现的接口\n\tdto := wecom.IPListResponse{}\n\terr = client.Request.With(req.Request{\n\t\tURL:     \"/cgi-bin/get_api_domain_ip\",\n\t\tOptions: []interface{}{\n\t\t\t// 如果不需要 access_token\n\t\t\t// wecom.WithoutAccessToken,\n\t\t},\n\t}).Fetch(\u0026dto)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(\"response\", dto)\n}\n```\n\n### Webhook 开发\n\n```go\nwecom.WebhookSend(\u0026wecom.WebhookSendRequest{\n  Key:     \"KEY\",\n  Content: wecom.SendTextContent{Content: \"Hello\"},\n  // debug for test only\n  Request: req.Request{\n    Options: []interface{}{req.DebugHook(\u0026req.DebugOptions{\n      Body: true,\n    })},\n  },\n})\n```\n\n### 第三方应用开发配置\n- 根据使用的接口不同，用到的信息也会不同\n\n```go\nclient := wecom.NewClient(wecom.Conf{\n  CorpID:   \"\",\n  ProviderSecret: \"\",\n  AuthCorpID:   \"\",\n  AuthCorpPermanentCode: \"\",\n  SuiteID:      \"\",\n  SuiteSecret:  \"\",\n  SuiteTicket:  \"\",\n})\n```\n\n## 接口支持情况\n\n* [x] 通讯录管理\n* [x] 客户联系\n* [ ] 微信客服\n* [x] 身份验证\n* [x] 应用管理\n* [x] 消息推送\n* [ ] 素材管理\n* [ ] OA\n* [-] 效率工具\n* [ ] 企业支付\n* [x] 会话内容存档\n* [ ] 企业互联\n* [ ] 电子发票\n\n\u003cdetails\u003e\n\u003csummary\u003e应用授权 - 100%\u003c/summary\u003e\n\n* [x] 获取第三方应用凭证\n* [x] 获取预授权码\n* [x] 设置授权配置\n* [x] 获取企业永久授权码\n* [x] 获取企业永久授权码\n* [x] 获取企业授权信息\n* [x] 获取企业凭证\n* [x] 获取应用的管理员列表\n* [x] 回调接口\n\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003e通讯录管理 - 100%\u003c/summary\u003e\n\n* [x] 成员管理\n  - [x] 创建成员\n  - [x] 读取成员\n  - [x] 更新成员\n  - [x] 删除成员\n  - [x] 批量删除成员\n  - [x] 获取部门成员\n  - [x] 获取部门成员详情\n  - [x] userid与openid互换\n  - [x] 二次验证\n  - [x] 邀请成员\n* [x] 部门管理\n  - [x] 创建部门\n  - [x] 更新部门\n  - [x] 删除部门\n  - [x] 获取部门列表\n* [x] 标签管理\n  - [x] 创建标签\n  - [x] 更新标签名字\n  - [x] 删除标签\n  - [x] 获取标签成员\n  - [x] 增加标签成员\n  - [x] 删除标签成员\n  - [x] 获取标签列表\n* [x] 异步批量接口\n  - [x] 增量更新成员\n  - [x] 全量覆盖成员\n  - [x] 全量覆盖部门\n  - [x] 获取异步任务结果\n* [x] 通讯录回调通知\n  - [x] 成员变更通知\n  - [x] 部门变更通知\n  - [x] 标签变更通知\n  - [x] 异步任务完成通知\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e客户联系 - 100%\u003c/summary\u003e\n\n* [x] 成员对外信息\n* [x] 客户管理\n  - [x] 获取客户列表\n  - [x] 获取客户详情\n  - [x] 批量获取客户详情\n  - [x] 修改客户备注信息\n* [x] 客户标签管理\n  - [x] 管理企业标签\n  - [x] 编辑客户企业标签\n* [x] 客户分配\n  - [x] 获取离职成员列表\n  - [x] 分配在职或离职成员的客户\n  - [x] 查询客户接替结果\n  - [x] 分配离职成员的客户群\n* [x] 变更回调通知\n  - [x] 添加企业客户事件\n  - [x] 编辑企业客户事件\n  - [x] 外部联系人免验证添加成员事件\n  - [x] 删除企业客户事件\n  - [x] 删除跟进成员事件\n  - [x] 客户接替失败事件\n  - [x] 客户群变更事件\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e身份验证 - 100%\u003c/summary\u003e\n\n* [x] 获取访问用户身份\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e推广二维码\u003c/summary\u003e\n\n* [ ] 获取注册码\n* [ ] 查询注册状态\n* [ ] 设置授权应用可见范围\n* [ ] 设置通讯录同步完成\n* [ ] 注册完成回调事件\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e应用管理 - 100%\u003c/summary\u003e\n\n* [x] 获取应用\n* [x] 设置应用\n* [x] 自定义菜单\n  - [x] 创建菜单\n  - [x] 获取菜单\n  - [x] 删除菜单\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e消息推送 - 100%\u003c/summary\u003e\n\n* [x] 发送应用消息\n* [x] 接收消息\n* [x] 发送消息到群聊会话\n  - [x] 创建群聊会话\n  - [x] 修改群聊会话\n  - [x] 获取群聊会话\n  - [x] 应用推送消息\n\n### 消息类型\n\n* [x] 文本消息\n* [x] 图片消息\n* [x] 语音消息\n* [x] 视频消息\n* [x] 文件消息\n* [x] 文本卡片消息\n* [x] 图文消息\n* [x] 图文消息（mpnews）\n* [x] markdown消息\n* [x] 任务卡片消息\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e素材管理\u003c/summary\u003e\n\n* [ ] 上传临时素材\n* [ ] 上传永久图片\n* [ ] 获取临时素材\n* [ ] 获取高清语音素材\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eOA\u003c/summary\u003e\n\n* [ ] 打卡\n  - [ ] 获取企业所有打卡规则\n  - [ ] 获取员工打卡规则\n  - [ ] 获取打卡记录数据\n  - [ ] 获取打卡日报数据\n  - [ ] 获取打卡月报数据\n  - [ ] 获取打卡人员排班信息\n  - [ ] 为打卡人员排班\n  - [ ] 录入打卡人员人脸信息\n* [ ] 审批\n  - [ ] 获取审批模板详情\n  - [ ] 提交审批申请\n  - [ ] 审批申请状态变化回调通知\n  - [ ] 批量获取审批单号\n  - [ ] 获取审批申请详情\n  - [ ] 获取企业假期管理配置\n  - [ ] 修改成员假期余额\n* [ ] 汇报\n  - [ ] 批量获取汇报记录单号\n  - [ ] 获取汇报记录详情\n  - [ ] 获取汇报统计数据\n* [ ] 自建应用\n  - [ ] 审批流程引擎\n* [ ] 会议室\n  - [ ] 会议室管理\n  - [ ] 会议室预定管理\n* [ ] 紧急通知应用\n  - [ ] 发起语音电话\n  - [ ] 获取接听状态\n\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003e效率工具 - 20%\u003c/summary\u003e\n\n* [x] 日程\n  - [x] 日历接口\n  - [x] 日程接口\n  - [x] 回调事件\n* [ ] 会议\n  - [ ] 创建预约会议\n  - [ ] 修改预约会议\n  - [ ] 取消预约会议\n  - [ ] 获取成员会议ID列表\n  - [ ] 获取会议详情\n* [ ] 直播\n* [ ] 微盘\n  - [ ] 空间管理\n  - [ ] 空间权限\n  - [ ] 文件管理\n  - [ ] 文件权限\n* [ ] 公费电话\n  - [ ] 获取公费电话拨打记录\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e企业支付\u003c/summary\u003e\n\n* [ ] 企业红包\n* [ ] 向员工付款\n* [ ] 向员工收款\n* [ ] 对外收款\n* [ ] 签名算法\n\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003e企业互联\u003c/summary\u003e\n\n* [ ] 获取应用共享信息\n* [ ] 获取下级企业的access_token\n* [ ] 获取下级企业的小程序session\n\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003e会话内容存档 - 100%\u003c/summary\u003e\n\n* [x] 获取会话内容存档开启成员列表\n* [x] 获取会话同意情况\n* [x] 客户同意进行聊天内容存档事件回调\n* [x] 获取会话内容存档内部群信息\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e电子发票\u003c/summary\u003e\n\n* [ ] 查询电子发票\n* [ ] 更新发票状态\n* [ ] 批量更新发票状态\n* [ ] 批量查询电子发票\n\n\u003c/details\u003e\n\n- TBD\n  - 将企业管理员添加为外部联系人 https://work.weixin.qq.com/api/doc/13613\n  - change_external_tag shuffle\n  - 批量安装应用 https://open.work.weixin.qq.com/api/doc/20990\n\n## 会话存档\n\n\n\n\u003e **Note**\n\u003e\n\u003e 1. 会话存档保存 **5** 天\n\u003e 1. 从 Sequence+1 拉取，不包含 Sequence\n\u003e 1. limit 最大 1000\n\u003e 1. 图片 jpg, 音频 amr, 视频 mp4\n\u003e 1. MediaData 的 MD5 可能匹配不上，可以一直重试\n\u003e 1. MediaData 单次最多返回 512K\n\n- libWeWorkFinanceSdk_C.so\n  - 依赖 GLIBC\n  - 使用了 libcurl\n    - https_proxy 能生效\n- 实际请求 qyapi.weixin.qq.com\n- RSA2048 key\n  - `openssl genrsa -out private.pem 2048`\n  - `openssl rsa -in private.pem -pubout -out public.pem`\n- wwfinance-libs 内嵌了 libWeWorkFinanceSdk_C.so，可以解压出来\n- wwfinance-poller 提供基础的验证工具\n  - 拉取所有数据到 sqlite wwfinance.db\n\n**命令行工具**\n\n```bash\nmake bin\n\n# 配置\ncp .env.example .env\n# extract lib\n./bin/wwfinance-libs\n\nLD_LIBRARY_PATH=/tmp/wwf/libs ./bin/wwfinance-poller\n\n# Docker 运行\ndocker run --rm -it -v $PWD/.env:/app/.env -v $PWD/data:/app/data wener/go-wecom\n\n# 开发测试\nLD_LIBRARY_PATH=$PWD/WeWorkFinanceSDK/libs go run ./cmd/wwfinance-poller/main.go\n```\n\n**代码调用**\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\tdotenv \"github.com/joho/godotenv\"\n\t\"github.com/wenerme/go-wecom/WeWorkFinanceSDK\"\n)\n\nfunc main() {\n\t_ = dotenv.Load()\n\n\tclient, err := WeWorkFinanceSDK.NewClientFromEnv()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tdata, err := client.GetChatData(WeWorkFinanceSDK.GetChatDataOptions{\n\t\tLimit:   10,\n\t\tTimeout: 5,\n\t})\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfor _, v := range data {\n\t\tfmt.Println(v.Message)\n\t}\n}\n\n```\n\n- 支持代理\n  - https_proxy=127.0.0.1:1080\n\n## Reference\n\n- [wenerme/go-req](https://github.com/wenerme/go-req)\n  - 接口底层库\n- [xen0n/go-workwx](https://github.com/xen0n/go-workwx)\n  - 比较成熟的 Golang 企业微信 SDK\n  - 没有 第三方接口、服务商接口、会话存档\n- [NICEXAI/WeWorkFinanceSDK](https://github.com/NICEXAI/WeWorkFinanceSDK)\n  - 封装 WeWorkFinanceSDK\n- [sbzhu/weworkapi_golang](https://github.com/sbzhu/weworkapi_golang)\n  - 官方 Golang 加密库\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwenerme%2Fgo-wecom","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwenerme%2Fgo-wecom","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwenerme%2Fgo-wecom/lists"}