{"id":37987666,"url":"https://github.com/zsmhub/workweixin","last_synced_at":"2026-01-16T18:40:36.908Z","repository":{"id":49756451,"uuid":"426112200","full_name":"zsmhub/workweixin","owner":"zsmhub","description":"Go语言实现企业微信sdk（第三方服务商维度），集成了第三方应用sdk和自建应用代开发的sdk，支持一键生成新sdk代码，使用简单，扩展灵活。","archived":false,"fork":false,"pushed_at":"2024-10-24T06:51:30.000Z","size":23265,"stargazers_count":54,"open_issues_count":0,"forks_count":14,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-10-25T02:08:51.390Z","etag":null,"topics":["golang","qiwei","sdk","wechat","weixin","wework","workweixin","workwx"],"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/zsmhub.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-11-09T06:10:36.000Z","updated_at":"2024-10-24T06:47:56.000Z","dependencies_parsed_at":"2023-02-09T15:31:09.828Z","dependency_job_id":"0b285641-7cee-4bd9-9391-dbd80b62cec8","html_url":"https://github.com/zsmhub/workweixin","commit_stats":null,"previous_names":[],"tags_count":48,"template":false,"template_full_name":null,"purl":"pkg:github/zsmhub/workweixin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zsmhub%2Fworkweixin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zsmhub%2Fworkweixin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zsmhub%2Fworkweixin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zsmhub%2Fworkweixin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zsmhub","download_url":"https://codeload.github.com/zsmhub/workweixin/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zsmhub%2Fworkweixin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28481084,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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","qiwei","sdk","wechat","weixin","wework","workweixin","workwx"],"created_at":"2026-01-16T18:40:36.835Z","updated_at":"2026-01-16T18:40:36.896Z","avatar_url":"https://github.com/zsmhub.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 企业微信 Go SDK\n\n[官方接口文档-\u003e](https://developer.work.weixin.qq.com/document/)\n\nGo语言实现企业微信sdk，a sensible Work Weixin SDK for Go。\n\n以第三方服务商维度整理的sdk，集成了第三方应用sdk和自建应用代开发的sdk，支持一键生成新sdk代码，使用简单，扩展灵活。\n\n- 支持一键生成sdk代码，包括api和回调事件\n- 用缓存方案实现分布式 access_token/jsapi_ticket，保证在多个服务中只有一个服务能成功调用企微API请求 access_token/jsapi_ticket，减少API调用次数和服务重启需要重新获取的情况\n    + 缓存方案支持自定义存储，默认内存存储\n    + 默认缓存2小时，主动式触发获取，企业取消授权后支持缓存清理\n- 用缓存方案实现读取/更新suite_ticket，保证多个服务能读取到最新的suite_ticket（suite_ticket每十分钟更新一次）\n    + 缓存方案支持自定义存储，默认内存存储\n- 支持自定义日志存储，提供Logger interface：用于自行实现日志记录器，便于收集日志\n    + 默认 log.Printf 输出\n- 获取授权企业ApiClient时，支持自定义闭包从数据库等读取企业数据，eg: Sdk.GetThirdAuthCorpApiClient\n\n[点击查看企业微信第三方应用开发博文](https://zsmhub.github.io/post/%E5%AE%9E%E6%88%98%E6%A1%88%E4%BE%8B/%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91/)\n\n### 安装命令\n\n```sh\ngo get github.com/zsmhub/workweixin\n```\n\n### 一键生成sdk代码命令(`需手动格式化代码；企微页面调整后一键生成代码可能失效`)\n\n- 生成企微回调事件代码\n\n    ```sh\n    make callback doc=企微文档链接 [prefix=生成文件名前缀]\n\n    # example\n    make callback doc=https://developer.work.weixin.qq.com/document/path/92277 prefix=客户联系\n    ```\n\n    \u003e tip：如果发现callbacks/callback_constant.go没有这个回调事件的常量定义，则需手动补上\n\n- 生成企微api代码\n\n    ```sh\n    make api doc=企微文档链接 [prefix=生成文件名前缀]\n\n    # example\n    make api doc=https://developer.work.weixin.qq.com/document/path/90600 prefix=应用授权\n    ```\n\n    \u003e tip：\n    \u003e 1. 生成GET方式的接口，请求参数的数据类型需要手动调整下\n    \u003e 2. 部分接口文档的请求/响应 json 示例，如果缺少部分字段，需手动补上\n    \u003e 3. 部分复杂的页面需要手动整理下sdk，如消息推送\u003e发送应用消息接口。\n\n### sdk调用示例\n\n**强烈建议去 ./demo 文件夹查看完整示例！**\n\n[点击查看完整demo](https://github.com/zsmhub/workweixin/tree/master/demo)\n\n#### 企微回调事件sdk调用示例\n\n```go\n// 企微回调设置初始化\nfunc InitCallbackHandler() error {\n    // 服务商回调解析\n    if err := workweixin.Sdk.NewProviderCallbackHandler(config.CorpCallbackToken, config.CorpCallbackEncodingAESKey); err != nil {\n        return err\n    }\n\n    // 第三方应用回调解析【可选】\n    if err := workweixin.Sdk.NewThirdAppCallbackHandler(config.AppSuiteCallbackToken, config.AppSuiteCallbackEncodingAESKey); err != nil {\n        return err\n    }\n\n    // 第三方小程序回调解析【可选】\n    if err := workweixin.Sdk.NewMiniSuiteCaNewThirdMiniCallbackHandlerllbackHandler(config.MiniSuiteCallbackToken, config.MiniSuiteCallbackEncodingAESKey); err != nil {\n        return err\n    }\n\n    // 自建应用代开发回调解析【可选】\n    if err := workweixin.Sdk.NewCustomizedTemplateCallbackHandler(config.CustomizedCallbackToken, config.CustomizedCallbackEncodingAESKey); err != nil {\n        return err\n    }\n\n    return nil\n}\n\n// 服务商-解析并获取回调信息\nworkweixin.Sdk.ProviderCallback.GetCallBackMsg(r *http.Request)\n\n// 第三方应用-解析并获取回调信息\nworkweixin.Sdk.ThirdAppCallback.GetCallBackMsg(r *http.Request)\n\n// 第三方小程序-解析并获取回调信息\nworkweixin.Sdk.ThirdMiniCallback.GetCallBackMsg(r *http.Request)\n\n// 自建应用代开发--解析并获取回调信息\nworkweixin.Sdk.CustomizedTemplateCallback.GetCallBackMsg(r *http.Request)\n\n// 第三方应用回调完整示例\nfunc HandleAppPostRequest(c echo.Context) error {\n    msg, err := workweixin.Sdk.ThirdAppCallback.GetCallBackMsg(c.Request())\n    if err != nil {\n        return err\n    }\n\n    switch msg.MsgType {\n    case callbacks.MessageTypeThird: // 第三方应用回调\n        switch msg.EventType {\n            // 推送suite_ticket，每十分钟推送一次suite_ticket\n            case callbacks.InfoTypeSuiteTicket:\n                extras, ok := msg.Extras.(callbacks.ThirdSuiteTicket)\n                if !ok {\n                    return errors.New(\"suite_ticket get failed\")\n                }\n\n                ticket := extras.SuiteTicket.Text\n                workweixin.Sdk.ThirdAppClient.RefreshSuiteTicket(ticket, time.Hour)\n\n                // todo: 此处可将 suite_ticket 保存进数据库\n\n            // 企业取消授权通知\n            case callbacks.InfoTypeCancelAuth:\n                  workweixin.Sdk.RemoveThirdAuthCorp(corpId)\n        }\n    }\n\n    return nil\n}\n```\n\n#### 企微 api sdk 调用示例\n\n```go\nimport \"xxx/workweixin/demo\"\n\n// 企微API客户端初始化\nfunc InitApiHandler() error {\n    // 初始化企微sdk参数\n    workweixin.Sdk.InitOptions(apis.Options{\n        DcsToken:                     demo.DcsTokenByRedis{},\n        DcsAppSuiteTicket:            demo.DcsAppSuiteTicketByRedis{},\n        GetThirdAppAuthCorpFunc:      demo.GetThirdAppAuthCorpToSdk,\n        GetCustomizedAppAuthCorpFunc: demo.GetCustomizedAppAuthCorpToSdk,\n        Logger:                       demo.Logger{},\n    })\n\n    // 服务商API客户端初始化\n    workweixin.Sdk.NewProviderApiClient(config.CorpId, config.CorpProviderSecret)\n\n    // 第三方应用API客户端初始化【可选】\n    suiteTicket := dao.ConfigDao.GetByUniqueIndex(global.ConfigKeySuiteTicket)\n    workweixin.Sdk.NewThirdAppApiClient(config.CorpId, config.AppSuiteId, config.AppSuiteSecret, suiteTicket.V)\n\n    // 自建应用代开发API客户端初始化【可选】\n    customizedTicket := dao.ConfigDao.GetByUniqueIndex(global.ConfigKeyCustomizedTicket)\n    workweixin.Sdk.NewCustomizedApiClient(config.CorpId, config.CustomizedAppSuiteId, config.CustomizedAppSuiteSecret, customizedTicket.V)\n\n    // 由于本地开发环境和预发布无法接收企微回调事件，故需定时刷新suite_ticket\n    if config.IsLocal() || config.IsUat() {\n        go func(suiteTicket, customizedTicket model.Config) {\n            defer recover()\n            ticker := time.NewTicker(10 * time.Minute)\n            defer ticker.Stop()\n            for {\n                // 更新第三方应用ticket\n                _ = suiteTicket.DelCache() // 清除本地缓存\n                suiteTicket = dao.ConfigDao.GetByUniqueIndex(global.ConfigKeySuiteTicket)\n                workweixin.Sdk.ThirdAppClient.RefreshSuiteTicket(suiteTicket.V, 30*time.Minute)\n\n                // 更新自建应用代开发ticket\n                _ = customizedTicket.DelCache() // 清除本地缓存\n                customizedTicket = dao.ConfigDao.GetByUniqueIndex(global.ConfigKeyCustomizedTicket)\n                workweixin.Sdk.CustomizedAppClient.RefreshSuiteTicket(customizedTicket.V, 30*time.Minute)\n\n                \u003c-ticker.C\n            }\n        }(suiteTicket, customizedTicket)\n    }\n\n    return nil\n}\n\n// 服务商级别API调用接口示例：获取接口调用许可订单详情\norderDetail, err := workweixin.Sdk.ProviderClient.ExecGetOrderLicense(apis.ReqGetOrderLicense{OrderID: orderId})\n\n// 应用级别API调用接口示例：获取企业永久授权码\nresp, err := workweixin.Sdk.ThirdAppClient.ExecGetPermanentCodeService(apis.ReqGetPermanentCodeService{AuthCode: authCode})\n\n// 授权企业级别API调用接口示例：获取部门列表\napiClient, err := workweixin.Sdk.GetThirdAuthCorpApiClient(v.CorpId)\nif err != nil {\n    fmt.Println(err)\n}\ndepartment, err := apiClient.ExecListDepartment(apis.ReqListDepartment{})\n\n// 获取provider_access_token\naccessToken, err := workweixin.Sdk.ProviderClient.GetToken()\n\n// 获取suite_access_token\naccessToken, err := workweixin.Sdk.ThirdAppClient.GetToken()\n\n// 获取授权企业access_token\naccessToken, err := apiClient.GetToken()\n\n// 构造oauth2链接\noauthUrl := workweixin.Sdk.ThirdAppClient.GetThirdOauthUrl(apis.GetThirdOauthUrlReq{\n    RedirectUri: \"xxx\",\n    Scope:       \"xx\",\n    State:       \"xx\",\n})\n\n// 企微 error code 类型强制转换\nif err != nil {\n    if apiError, ok := err.(*apis.ClientError); ok \u0026\u0026 apiError.Code == apis.ErrCode60011 {\n        return errors.New(\"无权限访问\")\n    }\n    return nil, err\n}\n\n// 推送消息到第三方应用\nreqSentMessageCard := apis.ReqSentMessageCard{\n    ToUser:  v.InstallUserId,\n    MsgType: \"news\",\n    AgentId: v.AgentId,\n    News: apis.ReqSentMessageCardNewsBody{\n        Articles: []apis.ReqSentMessageCardNewsArticleBody{\n            {\n                Title:       \"新模块【xxx】已上线\",\n                Description: \"快进入【管理后台】把它配置到你的【侧边栏】中！\",\n                Url:         \"https://xxx\",\n                UrlImg:      \"https://xxx/workbench-config.jpg\",\n            },\n        },\n    },\n}\nif _, err = apiClient.ExecSentMessageCard(reqSentMessageCard); err != nil {\n    fmt.Println(err)\n}\n\n// 帮前端获取 wx.config/wx.agentConfig 的签名配置\n// 步骤1：获取授权企业的jsapi_ticket，wx.config注入的是企业的身份与权限，而wx.agentConfig注入的是应用的身份与权限\n// 步骤2：JS-SDK使用权限签名算法\ntype QyapiGetJssdkConfigResp struct {\n    CorpJsapiTicket apis.GetJsSdkSignResp `json:\"corp_jsapi_ticket\"`\n    AppJsapiTicket  apis.GetJsSdkSignResp `json:\"app_jsapi_ticket\"`\n}\nfunc (qyapiRepo) GetJssdkConfig(req form.QyapiGetJssdkConfigReq) (*QyapiGetJssdkConfigResp, error) {\n    apiClient, err := workweixin.Sdk.GetThirdAuthCorpApiClient(req.CorpId)\n    if err != nil {\n        return nil, err\n    }\n\n    corpTicket, err := apiClient.GetJSAPITicket()\n    if err != nil {\n        return nil, err\n    }\n\n    appTicket, err := apiClient.GetJSAPITicketAgentConfig()\n    if err != nil {\n        return nil, err\n    }\n\n    agentId := apiClient.AgentId\n    return \u0026QyapiGetJssdkConfigResp{\n        CorpJsapiTicket: apiClient.GetJsSdkSign(req.CorpId, req.Url, corpTicket, 0),\n        AppJsapiTicket:  apiClient.GetJsSdkSign(req.CorpId, req.Url, appTicket, agentId),\n    }, nil\n}\n```\n\n### 目录结构\n\n```sh\n.\n├── api_generate             一键生成企微API代码\n├── apis                     企业微信API整合\n│   └── api.error.go         全局错误码\n├── callback_generate        一键生成企微回调事件代码\n├── callbacks                企业微信回调事件整合\n│   └── callback_constant.go 回调事件常量定义\n├── demo                     sdk调用示例\n├── docs                     企业微信相关文档\n├── internal                 消息加解密库\n└── main.go                  入口文件\n```\n\n### 注意点\n\n- 如果你发现了sdk中，没有某个回调事件或某个api，可以使用一键生成sdk代码命令生成，然后提交下pr\n\n### 推荐开源项目\n\n- [企业微信 GO SDK](https://github.com/zsmhub/workweixin)\n- [抖店开放平台 GO SDK](https://github.com/zsmhub/doudian-sdk)\n- [微信视频号 GO SDK](https://github.com/zsmhub/wx-channels-sdk)\n- [小红书开放平台 GO SDK](https://github.com/zsmhub/xhs-sdk)\n\n### 参考开源项目\n\n- [OpenSCRM](https://github.com/openscrm/api-server)\n\n### Support\n\n[![JetBrains Logo (Main) logo](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg \"logo\")](https://jb.gg/OpenSourceSupport)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzsmhub%2Fworkweixin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzsmhub%2Fworkweixin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzsmhub%2Fworkweixin/lists"}