message send

This commit is contained in:
jiangyong27 2024-01-23 12:05:34 +08:00
parent 2d5f373bea
commit dfca7748b5
1 changed files with 170 additions and 0 deletions

View File

@ -1,6 +1,7 @@
package qyweixin package qyweixin
import ( import (
"bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@ -11,7 +12,12 @@ import (
"gitlab.batiao8.com/open/gosdk/wechat/cache" "gitlab.batiao8.com/open/gosdk/wechat/cache"
"gitlab.batiao8.com/open/gosdk/wechat/message" "gitlab.batiao8.com/open/gosdk/wechat/message"
wutil "gitlab.batiao8.com/open/gosdk/wechat/util" wutil "gitlab.batiao8.com/open/gosdk/wechat/util"
"io"
"io/ioutil"
"mime/multipart"
"net/http" "net/http"
"os"
"path/filepath"
"strings" "strings"
"time" "time"
) )
@ -19,6 +25,36 @@ import (
var ( var (
wechatCache cache.Cache = cache.NewMemory() wechatCache cache.Cache = cache.NewMemory()
) )
var (
urlQiyeSend = "https://qyapi.weixin.qq.com/cgi-bin/message/send"
)
type MessageRequest struct {
ToUser string `json:"touser"`
ToParty string `json:"toparty"`
ToTag string `json:"totag"`
MstType string `json:"msgtype"`
AgentId string `json:"agentid"`
Text struct {
Content string `json:"content"`
} `json:"text"`
Image struct {
MediaID string `json:"media_id"`
} `json:"image"`
Video struct {
MediaID string `json:"media_id"`
Title string `json:"title"`
Desc string `json:"description"`
} `json:"video"`
}
type BaseResponse struct {
ErrCode int `json:"errcode"`
ErrMsg string `json:"errmsg"`
}
type AppConfig struct { type AppConfig struct {
Corpid string Corpid string
@ -113,6 +149,140 @@ func (q *App) GetDepartmentUserid(departmentId int) ([]string, error) {
return userids, nil return userids, nil
} }
func (a *App) SendText(receiver []string, content string) error {
reqUrl := fmt.Sprintf("%s?access_token=%s", urlQiyeSend, a.GetToken())
req := new(MessageRequest)
req.MstType = "text"
req.AgentId = a.config.Agent
req.Text.Content = content
req.ToUser = strings.Join(receiver, "|")
data, _ := json.Marshal(req)
result, err := util.HttpPostJson(reqUrl, nil, data)
if err != nil {
return err
}
var rsp BaseResponse
err = json.Unmarshal([]byte(result), &rsp)
if err != nil {
return err
}
if rsp.ErrCode != 0 {
return fmt.Errorf("%d:%s", rsp.ErrCode, rsp.ErrMsg)
}
return nil
}
func (a *App) SendImage(receiver []string, meidiaId string) error {
url := fmt.Sprintf("%s?access_token=%s", urlQiyeSend, a.GetToken())
req := new(MessageRequest)
req.MstType = "image"
req.AgentId = a.config.Agent
req.ToUser = strings.Join(receiver, "|")
req.Image.MediaID = meidiaId
data, _ := json.Marshal(req)
result, err := util.HttpPostJson(url, nil, data)
if err != nil {
return err
}
var rsp BaseResponse
err = json.Unmarshal([]byte(result), &rsp)
if err != nil {
return err
}
if rsp.ErrCode != 0 {
return fmt.Errorf("%d:%s", rsp.ErrCode, rsp.ErrMsg)
}
return nil
}
func (a *App) SendVideo(receiver []string, meidiaId, title, desc string) error {
url := fmt.Sprintf("%s?access_token=%s", urlQiyeSend, a.GetToken())
req := new(MessageRequest)
req.MstType = "video"
req.AgentId = a.config.Agent
req.ToUser = strings.Join(receiver, "|")
req.Video.MediaID = meidiaId
req.Video.Title = title
req.Video.Desc = desc
data, _ := json.Marshal(req)
result, err := util.HttpPostJson(url, nil, data)
if err != nil {
return err
}
var rsp BaseResponse
err = json.Unmarshal([]byte(result), &rsp)
if err != nil {
return err
}
if rsp.ErrCode != 0 {
return fmt.Errorf("%d:%s", rsp.ErrCode, rsp.ErrMsg)
}
return nil
}
func (a *App) Upload(path, kind string) (string, error) {
fh, err := os.Open(path)
if err != nil {
return "", err
}
defer fh.Close()
bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)
fileWriter, err := bodyWriter.CreateFormFile(kind, filepath.Base(path))
if err != nil {
return "", err
}
_, err = io.Copy(fileWriter, fh)
if err != nil {
return "", err
}
bodyWriter.Close()
url := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s", a.GetToken(), kind)
req, err := http.NewRequest("POST", url, bodyBuf)
req.Header.Add("Content-Type", bodyWriter.FormDataContentType())
urlQuery := req.URL.Query()
if err != nil {
return "", err
}
req.URL.RawQuery = urlQuery.Encode()
client := http.Client{}
res, err := client.Do(req)
if err != nil {
return "", err
}
defer res.Body.Close()
jsonbody, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
result := make(map[string]interface{})
if err := json.Unmarshal(jsonbody, &result); err != nil {
return "", err
}
if cast.ToInt(result["errcode"]) != 0 {
return "", fmt.Errorf("%d:%s", cast.ToInt(result["errcode"]), cast.ToString(result["errmsg"]))
}
return cast.ToString(result["media_id"]), nil
}
func (q *App) Callback(ctx *gin.Context) { func (q *App) Callback(ctx *gin.Context) {
//配置微信参数 //配置微信参数