go实现企业微信API,以第三方服务商角度整理的API,支持手动生成企业微信新API或新回调代码

zsmhub · 2021-11-11 19:53:19 · 1276 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-11-11 19:53:19 的主题,其中的信息可能已经有所发展或是发生改变。

企业微信第三方应用开发 go sdk

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

Github源码:https://github.com/zsmhub/workweixin

自动生成sdk代码命令

支持手动生成企业微信新API或新回调代码

  • 生成api代码

    make api doc=https://open.work.weixin.qq.com/api/doc/90001/90143/90600

  • 生成callback代码

    make callback doc=https://open.work.weixin.qq.com/api/doc/90001/90143/92277

sdk 调用示例

回调sdk调用示例

// 企微回调设置初始化
func InitCallbackHandler() error {
    // 服务商回调解析
  if err := workweixin.Sdk.NewProviderCallbackHandler(config.CorpCallbackToken, config.CorpCallbackEncodingAESKey); err != nil {
        return err
    }

    // 第三方应用回调解析
  if err := workweixin.Sdk.NewAppSuiteCallbackHandler(config.AppSuiteCallbackToken, config.AppSuiteCallbackEncodingAESKey); err != nil {
        return err
    }

    // 第三方小程序回调解析【可选】
  if err := workweixin.Sdk.NewMiniSuiteCallbackHandler(config.MiniSuiteCallbackToken, config.MiniSuiteCallbackEncodingAESKey); err != nil {
        return err
    }

    return nil
}

// 服务商-解析并获取回调信息
workweixin.Sdk.ProviderCallback.GetCallBackMsg(r *http.Request)

// 第三方应用-解析并获取回调信息
workweixin.Sdk.AppSuiteCallback.GetCallBackMsg(r *http.Request)

// 第三方小程序-解析并获取回调信息
workweixin.Sdk.MiniSuiteCallback.GetCallBackMsg(r *http.Request)

// 第三方应用回调完整示例
func HandleAppPostRequest(c echo.Context) error {
    msg, err := workweixin.Sdk.AppSuiteCallback.GetCallBackMsg(c.Request())
    if err != nil {
        return err
    }

    switch msg.MsgType {

    case callbacks.MessageTypeThird: // 第三方应用回调
      switch msg.EventType {

            case callbacks.InfoTypeSuiteTicket: // 每十分钟推送一次suite_ticket
  ticket := msg.Extras.(callbacks.ThirdSuiteTicket).SuiteTicket.Text
                workweixin.Sdk.ThirdAppClient.RefreshSuiteTicket(ticket)

                retryer := backoff.WithContext(backoff.NewExponentialBackOff(), context.Background())
                err := backoff.Retry(func() error {
                    // todo 将 suite_ticket 存储在数据库或其他地方
  return nil
                }, retryer)

                return err

    }

    return nil
}

api sdk调用示例

// 企微API客户端初始化
func InitApiHandler() error {
    // 服务商API客户端初始化
    workweixin.Sdk.NewProviderApiClient(config.CorpId, config.CorpProviderSecret)

    // 第三方应用API客户端初始化
  suiteTicket := "xxx" // 从数据库等地方获取已得到的suite_ticket
    workweixin.Sdk.NewThirdAppApiClient(config.CorpId, config.AppSuiteId, config.AppSuiteSecret, suiteTicket)

    // 授权企业API客户端初始化
  authCorpList := xxx.GetAuthCorpList() // 从数据库获取已授权企业
  for _, corp := range authCorpList {
        workweixin.Sdk.NewAuthCorpApiClient(corp.CorpId, corp.PermanentCode, workweixin.Sdk.ThirdAppClient)
    }

    return nil
}

// 获取企业永久授权码
resp, err := workweixin.Sdk.ThirdAppClient.ExecGetPermanentCodeService(apis.ReqGetPermanentCodeService{AuthCode: authCode})

// 企微 error code 处理
if err != nil {
    apiError, _ := err.(*apis.ClientError)
    if apiError.Code == apis.ErrCode60011 {
        return nil, errors.New("无权限访问")
    }
    return nil, err
}

// 推送消息到第三方应用
apiClient, err := workweixin.Sdk.GetAuthCorpAPPClient(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)
}

如果部署到K8S多个副本

  1. 可以将 access_token 的刷新代码抽离出来,用一个定时任务单独处理,并存在缓存中,提供给多个K8S副本读取 access_token。
  2. 项目运行中,会有新的企业安装我们的第三方应用,此时多个K8S副本需要同步新的企业数据并实例化,避免 sdk 调用失败。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1276 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传