企業微信第三方應用開發 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 協議》,轉載必須註明作者和本文連結