feat: channel WeChat test account is done
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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 ""
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user