golang實現企業微信API,以第三方服務商角度整理的API,支援手動生成企業微信新API或新回撥程式碼

ZsmHub發表於2021-11-09

企業微信第三方應用開發 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
}

如果部署到K8S多個副本

1. 可以將 access_token 的重新整理程式碼抽離出來,用一個定時任務單獨處理,並存在快取中,提供給多個K8S副本讀取 access_token。
2. 專案執行中,會有新的企業安裝我們的第三方應用,此時多個K8S副本需要同步新的企業資料並例項化,避免 sdk 呼叫失敗。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
程式設計就像呼吸,學會那天起一日不敢荒廢。

相關文章