From 2a5764f00fec69f175e1202512a829832c14df08 Mon Sep 17 00:00:00 2001 From: JustSong Date: Fri, 18 Nov 2022 17:41:27 +0800 Subject: [PATCH] feat: channel WeChat corp account is done --- channel/main.go | 1 + channel/token-store.go | 5 ++-- channel/wechat-corp-account.go | 54 ++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/channel/main.go b/channel/main.go index e2b1b33..9dfe29c 100644 --- a/channel/main.go +++ b/channel/main.go @@ -30,6 +30,7 @@ func (message *Message) Send(user *model.User) error { case TypeWeChatTestAccount: return SendWeChatTestMessage(message, user) case TypeWeChatCorpAccount: + return SendWeChatCorpMessage(message, user) case TypeLark: case TypeDingTalk: case TypeTelegram: diff --git a/channel/token-store.go b/channel/token-store.go index 42511e9..47664b4 100644 --- a/channel/token-store.go +++ b/channel/token-store.go @@ -48,8 +48,9 @@ func TokenStoreInit() { } } s.Mutex.RLock() - for _, item := range items { - s.Map[item.Key()] = &item + for i := range items { + // s.Map[item.Key()] = &item // This is wrong, you are getting the address of a local variable! + s.Map[items[i].Key()] = &items[i] } s.Mutex.RUnlock() for { diff --git a/channel/wechat-corp-account.go b/channel/wechat-corp-account.go index eda0092..40c90f0 100644 --- a/channel/wechat-corp-account.go +++ b/channel/wechat-corp-account.go @@ -1,9 +1,12 @@ package channel import ( + "bytes" "encoding/json" + "errors" "fmt" "message-pusher/common" + "message-pusher/model" "net/http" "time" ) @@ -60,3 +63,54 @@ func (i *WeChatCorpAccountTokenStoreItem) Refresh() { i.AccessToken = res.AccessToken common.SysLog("access token refreshed") } + +type wechatCorpMessageRequest struct { + MessageType string `json:"msgtype"` + ToUser string `json:"touser"` + AgentId string `json:"agentid"` + TextCard struct { + Title string `json:"title"` + Description string `json:"description"` + URL string `json:"url"` + } `json:"textcard"` +} + +type wechatCorpMessageResponse struct { + ErrorCode int `json:"errcode"` + ErrorMessage string `json:"errmsg"` +} + +func SendWeChatCorpMessage(message *Message, user *model.User) error { + if user.WeChatCorpAccountId == "" { + return errors.New("未配置微信企业号消息推送方式") + } + values := wechatCorpMessageRequest{ + MessageType: "textcard", + ToUser: user.WeChatCorpAccountUserId, + AgentId: user.WeChatCorpAccountAgentId, + } + values.TextCard.Title = message.Title + values.TextCard.Description = message.Description + // TODO: render content and set URL + values.TextCard.URL = common.ServerAddress + jsonData, err := json.Marshal(values) + if err != nil { + return err + } + key := fmt.Sprintf("%s%s%s", user.WeChatCorpAccountId, user.WeChatCorpAccountAgentId, user.WeChatCorpAccountSecret) + accessToken := TokenStoreGetToken(key) + resp, err := http.Post(fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s", accessToken), "application/json", + bytes.NewBuffer(jsonData)) + if err != nil { + return err + } + var res wechatCorpMessageResponse + err = json.NewDecoder(resp.Body).Decode(&res) + if err != nil { + return err + } + if res.ErrorCode != 0 { + return errors.New(res.ErrorMessage) + } + return nil +}