feat: channel WeChat corp account is done

This commit is contained in:
JustSong
2022-11-18 17:41:27 +08:00
parent a308ddfd8b
commit 2a5764f00f
3 changed files with 58 additions and 2 deletions
+1
View File
@@ -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:
+3 -2
View File
@@ -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 {
+54
View File
@@ -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
}