feat: channel WeChat test account is done

This commit is contained in:
JustSong
2022-11-18 17:17:53 +08:00
parent 2d133bf2c3
commit a308ddfd8b
4 changed files with 65 additions and 2 deletions
+1
View File
@@ -28,6 +28,7 @@ func (message *Message) Send(user *model.User) error {
case TypeEmail:
return SendEmailMessage(message, user)
case TypeWeChatTestAccount:
return SendWeChatTestMessage(message, user)
case TypeWeChatCorpAccount:
case TypeLark:
case TypeDingTalk:
+7 -2
View File
@@ -25,7 +25,7 @@ func TokenStoreInit() {
s.Map = make(map[string]*TokenStoreItem)
s.ExpirationSeconds = 2 * 60 * 60
go func() {
users, err := model.GetAllUsers()
users, err := model.GetAllUsersWithSecrets()
if err != nil {
common.FatalLog(err.Error())
}
@@ -93,5 +93,10 @@ func TokenStoreRemoveItem(item *TokenStoreItem) {
func TokenStoreGetToken(key string) string {
s.Mutex.RLock()
defer s.Mutex.RUnlock()
return (*s.Map[key]).Token()
item, ok := s.Map[key]
if ok {
return (*item).Token()
}
common.SysError("token for " + key + " is blank!")
return ""
}
+52
View File
@@ -1,9 +1,12 @@
package channel
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"message-pusher/common"
"message-pusher/model"
"net/http"
"time"
)
@@ -59,3 +62,52 @@ func (i *WeChatTestAccountTokenStoreItem) Refresh() {
i.AccessToken = res.AccessToken
common.SysLog("access token refreshed")
}
type wechatTestMessageRequest struct {
ToUser string `json:"touser"`
TemplateId string `json:"template_id"`
URL string `json:"url"`
Data struct {
Text struct {
Value string `json:"value"`
} `json:"text"`
} `json:"data"`
}
type wechatTestMessageResponse struct {
ErrorCode int `json:"errcode"`
ErrorMessage string `json:"errmsg"`
}
func SendWeChatTestMessage(message *Message, user *model.User) error {
if user.WeChatTestAccountId == "" {
return errors.New("未配置微信测试号消息推送方式")
}
values := wechatTestMessageRequest{
ToUser: user.WeChatTestAccountOpenId,
TemplateId: user.WeChatTestAccountTemplateId,
URL: "",
}
// TODO: render content and set URL
values.Data.Text.Value = message.Description
jsonData, err := json.Marshal(values)
if err != nil {
return err
}
key := fmt.Sprintf("%s%s", user.WeChatTestAccountId, user.WeChatTestAccountSecret)
accessToken := TokenStoreGetToken(key)
resp, err := http.Post(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s", accessToken), "application/json",
bytes.NewBuffer(jsonData))
if err != nil {
return err
}
var res wechatTestMessageResponse
err = json.NewDecoder(resp.Body).Decode(&res)
if err != nil {
return err
}
if res.ErrorCode != 0 {
return errors.New(res.ErrorMessage)
}
return nil
}
+5
View File
@@ -40,6 +40,11 @@ func GetAllUsers() (users []*User, err error) {
return users, err
}
func GetAllUsersWithSecrets() (users []*User, err error) {
err = DB.Find(&users).Error
return users, err
}
func SearchUsers(keyword string) (users []*User, err error) {
err = DB.Select([]string{"id", "username", "display_name", "role", "status", "email"}).Where("id = ? or username LIKE ? or email LIKE ? or display_name LIKE ?", keyword, keyword+"%", keyword+"%", keyword+"%").Find(&users).Error
return users, err