Pārlūkot izejas kodu

feat: channel WeChat corp account is done

JustSong 2 gadi atpakaļ
vecāks
revīzija
2a5764f00f
3 mainītis faili ar 58 papildinājumiem un 2 dzēšanām
  1. 1 0
      channel/main.go
  2. 3 2
      channel/token-store.go
  3. 54 0
      channel/wechat-corp-account.go

+ 1 - 0
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:

+ 3 - 2
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 {

+ 54 - 0
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
+}