企业微信第三方服务商 Go SDK

Go语言实现企业微信sdk,a sensible Work Weixin SDK for Go。

以第三方服务商角度整理的sdk,集成了第三方应用sdk和自建应用代开发的sdk,支持一键生成新sdk代码,使用简单,扩展灵活。

  • 支持一键生成sdk代码,包括api和回调事件
  • 用缓存方案实现分布式 access_token/jsapi_ticket,保证在多个服务中只有一个服务能成功调用企微API请求 access_token/jsapi_ticket,减少API调用次数和服务重启需要重新获取的情况
    • 缓存方案支持自定义存储,默认内存存储
    • 默认缓存2小时,主动式触发获取,企业取消授权后支持缓存清理
  • 用缓存方案实现读取/更新suite_ticket,保证多个服务能读取到最新的suite_ticket(suite_ticket每十分钟更新一次)
    • 缓存方案支持自定义存储,默认内存存储
  • 支持自定义日志存储,提供Logger interface:用于自行实现日志记录器,便于收集日志
    • 默认 log.Printf 输出
  • 获取授权企业ApiClient时,支持自定义闭包从数据库等读取企业数据,eg: Sdk.GetThirdAuthCorpApiClient

安装命令

go get github.com/zsmhub/workweixin

点击前往github查看源码

一键生成sdk代码命令

注意:部分复杂的页面需要手动整理下sdk,如消息推送>发送应用消息接口。

  • 生成企微api代码(tip: 生成GET方式的接口,请求参数的数据类型需要手动调整下)

    make api doc=https://developer.work.weixin.qq.com/document/path/90600

  • 生成企微回调事件代码

    make callback doc=https://developer.work.weixin.qq.com/document/path/92277

sdk调用示例

强烈建议去 ./demo 文件夹查看完整示例!

点击查看完整demo

企微回调事件sdk调用示例

// 企微回调设置初始化
func InitCallbackHandler() error {// 服务商回调解析if err := workweixin.Sdk.NewProviderCallbackHandler(config.CorpCallbackToken, config.CorpCallbackEncodingAESKey); err != nil {return err}// 第三方应用回调解析【可选】if err := workweixin.Sdk.NewThirdAppCallbackHandler(config.AppSuiteCallbackToken, config.AppSuiteCallbackEncodingAESKey); err != nil {return err}// 第三方小程序回调解析【可选】if err := workweixin.Sdk.NewMiniSuiteCaNewThirdMiniCallbackHandlerllbackHandler(config.MiniSuiteCallbackToken, config.MiniSuiteCallbackEncodingAESKey); err != nil {return err}// 自建应用代开发回调解析【可选】if err := workweixin.Sdk.NewCustomizedTemplateCallbackHandler(config.CustomizedCallbackToken, config.CustomizedCallbackEncodingAESKey); err != nil {return err}return nil
}// 服务商-解析并获取回调信息
workweixin.Sdk.ProviderCallback.GetCallBackMsg(r *http.Request)// 第三方应用-解析并获取回调信息
workweixin.Sdk.ThirdAppCallback.GetCallBackMsg(r *http.Request)// 第三方小程序-解析并获取回调信息
workweixin.Sdk.ThirdMiniCallback.GetCallBackMsg(r *http.Request)// 自建应用代开发--解析并获取回调信息
workweixin.Sdk.CustomizedTemplateCallback.GetCallBackMsg(r *http.Request)// 第三方应用回调完整示例
func HandleAppPostRequest(c echo.Context) error {msg, err := workweixin.Sdk.ThirdAppCallback.GetCallBackMsg(c.Request())if err != nil {return err}switch msg.MsgType {case callbacks.MessageTypeThird: // 第三方应用回调switch msg.EventType {case callbacks.InfoTypeSuiteTicket: // 每十分钟推送一次suite_ticketextras, ok := msg.Extras.(callbacks.ThirdSuiteTicket)if !ok {return errors.New("suite_ticket get failed")}ticket := extras.SuiteTicket.Textworkweixin.Sdk.ThirdAppClient.RefreshSuiteTicket(ticket, time.Hour)// todo: 此处可将 suite_ticket 保存进数据库return nil}return nil
}

企微 api sdk 调用示例

import "xxx/workweixin/demo"// 企微API客户端初始化
func InitApiHandler() error {// 初始化企微sdk参数workweixin.Sdk.InitOptions(apis.Options{DcsToken:                     demo.DcsTokenByRedis{},DcsAppSuiteTicket:            demo.DcsAppSuiteTicketByRedis{},GetThirdAppAuthCorpFunc:      demo.GetThirdAppAuthCorpToSdk,GetCustomizedAppAuthCorpFunc: demo.GetCustomizedAppAuthCorpToSdk,Logger:                       demo.Logger{},})// 服务商API客户端初始化workweixin.Sdk.NewProviderApiClient(config.CorpId, config.CorpProviderSecret)// 第三方应用API客户端初始化【可选】suiteTicket := dao.ConfigDao.GetByUniqueIndex(global.ConfigKeySuiteTicket)workweixin.Sdk.NewThirdAppApiClient(config.CorpId, config.AppSuiteId, config.AppSuiteSecret, suiteTicket.V)// 自建应用代开发API客户端初始化【可选】customizedTicket := dao.ConfigDao.GetByUniqueIndex(global.ConfigKeyCustomizedTicket)workweixin.Sdk.NewCustomizedApiClient(config.CorpId, config.CustomizedAppSuiteId, config.CustomizedAppSuiteSecret, customizedTicket.V)// 由于本地开发环境和预发布无法接收企微回调事件,故需定时刷新suite_ticketif config.IsLocal() || config.IsUat() {go func(suiteTicket, customizedTicket model.Config) {defer recover()ticker := time.NewTicker(10 * time.Minute)defer ticker.Stop()for {// 更新第三方应用ticket_ = suiteTicket.DelCache() // 清除本地缓存suiteTicket = dao.ConfigDao.GetByUniqueIndex(global.ConfigKeySuiteTicket)workweixin.Sdk.ThirdAppClient.RefreshSuiteTicket(suiteTicket.V, 30*time.Minute)// 更新自建应用代开发ticket_ = customizedTicket.DelCache() // 清除本地缓存customizedTicket = dao.ConfigDao.GetByUniqueIndex(global.ConfigKeyCustomizedTicket)workweixin.Sdk.CustomizedAppClient.RefreshSuiteTicket(customizedTicket.V, 30*time.Minute)<-ticker.C}}(suiteTicket, customizedTicket)}return nil
}// 获取企业永久授权码
resp, err := workweixin.Sdk.ThirdAppClient.ExecGetPermanentCodeService(apis.ReqGetPermanentCodeService{AuthCode: authCode})// 企微 error code 类型强制转换
if err != nil {apiError, ok := err.(*apis.ClientError)if !ok {return nil, errors.New("转换失败,类型有误")}if apiError.Code == apis.ErrCode60011 {return nil, errors.New("无权限访问")}return nil, err
}// 推送消息到第三方应用
apiClient, err := workweixin.Sdk.GetThirdAuthCorpApiClient(v.CorpId)
if err != nil {fmt.Println(err)
}
reqSentMessageCard := apis.ReqSentMessageCard{ToUser:  v.InstallUserId,MsgType: "news",AgentId: v.AgentId,News: apis.ReqSentMessageCardNewsBody{Articles: []apis.ReqSentMessageCardNewsArticleBody{{Title:       "新模块【xxx】已上线",Description: "快进入【管理后台】把它配置到你的【侧边栏】中!",Url:         "https://xxx",UrlImg:      "https://xxx/workbench-config.jpg",},},},
}
if _, err = apiClient.ExecSentMessageCard(reqSentMessageCard); err != nil {fmt.Println(err)
}

注意点

  • 如果你发现了sdk中,没有某个回调事件或某个api,可以使用一键生成sdk代码命令生成,然后提交下pr

参考开源项目

  • OpenSCRM

Go语言实现企业微信sdk,集成了第三方应用sdk和自建应用代开发的sdk,支持一键生成新sdk相关推荐

  1. H5与企业微信jssdk集成

    H5与企业微信jssdk集成 一.公众号设置 注册企业微信,在应用与小程序栏目中,设置可信域名,配置公众号菜单.可信域名不得不说下,在最初开发时,认为设置并验证后,微信认证接口会实现跨域请求,其实并没 ...

  2. odoo与企业微信深度集成

    odoo与企业微信深度集成 基础数据:部门.员工 考勤:考勤管理.排版管理.出勤管理 休假:休假额度.休假申请 审批:审批模板.审批引擎 * 微信扫码登录 1.基础数据:部门.员工 部门 员工 2.考 ...

  3. 企业微信H5_集成消息解密类,消息推送Get及Post回调处理

    文章目录 一. 验证URL有效性 1. 阅读文档 2. 文档分析 3. 加解密方案说明 4. 下载加解密算法 5. 案例分析 二.实战集成 2.1. 工具类拷贝 2.2. 依赖引入 2.3. 案例1集 ...

  4. 企业微信服务商集成解决方案

    先贴一张企业微信接入场景图,解释下这篇文章的使用场景. 如图所示,本方案是第三方应用开发的demo实现,因为企业内部开发比较简单,不在该篇文章中做过多介绍. 一.准备阶段: 1.申请企业微信号 2.点 ...

  5. 企业微信工作台集成CAS实现单点登录

    需求描述 最近客户有一个需求,希望在企业微信的工作台上放一些业务系统的链接.这些业务系统本身已经完成了和CAS单点的对接,但是放在企业微信工作台上就会出现问题.点击系统链接的时候,会先被CAS拦截下来 ...

  6. AbpZero之企业微信---登录(拓展第三方auth授权登录)---第二步:开始逐步实现企业微信登录...

    上回分解到AbpZero的auth登录机制,这里我们开始着手逐步实现我们的auth登录. 我们新建一个类库XXXX.Web.Authentication.External 在类库下新建一个类QYWec ...

  7. AbpZero之企业微信---登录(拓展第三方auth授权登录)---第一步:查看AbpZero的auth第三方登录的底层机制...

    在AbpZero框架中,auth登录接口位于Web.Core库下的Controllers文件夹的TokenAuthController.cs的ExternalAuthenticate方法 Extern ...

  8. JeecgBoot低代码平台 2.4.5 版本发布,钉钉与企业微信集成版本

    项目介绍 JeecgBoot是一款基于代码生成器的低代码平台!前后端分离架构 SpringBoot2.x,SpringCloud,Ant Design&Vue,Mybatis-plus,Shi ...

  9. NC移动报表H5应用介绍-可以集成钉钉或者企业微信

    移动报表H5应用介绍 目录 移动报表H5应用介绍... 1 1产品介绍... 2 1.1前言... 2 1.1.1简介... 2 1.1.2产品特色:... 2 1.2移动报表APP介绍... 2 1 ...

  10. NC移动报表H5应用介绍可以集成钉钉和企业微信

    移动报表H5应用介绍 目录 移动报表H5应用介绍 1 1产品介绍 2 1.1前言 2 1.1.1简介 2 1.1.2产品特色: 2 1.2移动报表APP介绍 2 1.2.1产品适用NC版本 2 2安装 ...

最新文章

  1. 125万奖金!“中国GPT-3”赛事来了
  2. 雷林鹏分享:PHP 数组
  3. 3Delight NSI: A Streamable Render API
  4. 如何做可靠的分布式锁,Redlock真的可行么
  5. JavaScript中发布/订阅模式的理解
  6. vim配置之snippets代码块
  7. oracle or索引失效,以下Oracle错误意味着什么:无效的列索引
  8. Redis基本操作——队列 List(原理篇)
  9. python+tkinter使用canvas不显示图片的问题
  10. java txt 分段读取_Java 读取TXT文件的多种方式
  11. 双六(挑战程序设计竞赛)
  12. tokenizer.tokenize(), tokenizer.encode() , tokenizer.encode_plus() 方法介绍及其区别
  13. 支付宝支付验证签名失败
  14. 蓝桥杯 ALGO-7 逆序对
  15. 一些概率论所揭示的道理
  16. eeglab下载和配置
  17. C++ - 函数返回多个返回值的方法总结
  18. UE4/5 学习日记*Note2:动画K帧时间轴双击w冲刺,二段跳——2022/5/8
  19. 基于原生PHP完成小程序支付对接踩坑(V2版本)
  20. pytest05、fixture

热门文章

  1. 【Web】lighttpd基础
  2. 三个字组成的字:鑫、淼、焱、众 …………
  3. ie浏览器怎么打开html,ie浏览器在哪里打开
  4. 图片放大后不清楚怎么办?
  5. Nginx+Tomcat负载均衡--win7配置详解
  6. 1、马克思主义哲学是科学的世界观和方法论
  7. oracle手工重建EM步骤
  8. android实现自定义图标,Android开发中用Drawable 实现自定义电池图标
  9. Android 10.0 SystemUI修改状态栏电池图标样式为横屏显示
  10. VS2008显示当前页面的脚本发生错误的处理方法