You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
328 lines
7.6 KiB
328 lines
7.6 KiB
package workWechat
|
|
|
|
import (
|
|
"appPlatform/overall"
|
|
"appPlatform/overall/publicmethod"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2024-12-09 16:37:10
|
|
@ 功能: 发送消息
|
|
@ 参数
|
|
|
|
#
|
|
|
|
@ 返回值
|
|
|
|
#
|
|
|
|
@ 方法原型
|
|
|
|
#
|
|
*/
|
|
func (a *ApiMethod) SendMsg(c *gin.Context) {
|
|
var requestData SendMessage
|
|
c.ShouldBindJSON(&requestData)
|
|
// var sendText SendMessage
|
|
// sendText.Touser = "KaiXinGuo"
|
|
// sendText.Msgtype = "template_card"
|
|
// sendText.Agentid = 1000108
|
|
// sendText.TemplateCard.TaskId = strconv.FormatInt(publicmethod.GetUUid(1), 10)
|
|
// sendText.TemplateCard.CardType = requestData.Name
|
|
// sendText.TemplateCard.TextTemplate.CardAction.Type = 1
|
|
// sendText.TemplateCard.TextTemplate.CardAction.Url = "https://www.baidu.com"
|
|
msgid, err := requestData.SendMsg("stzl", 1)
|
|
fmt.Printf("sendText: %v\n\n\n%v\n\n\n", msgid, err)
|
|
if err != nil {
|
|
publicmethod.Result(1, requestData, c, "消息发送失败!")
|
|
} else {
|
|
publicmethod.Result(0, err, c)
|
|
}
|
|
|
|
}
|
|
|
|
func (m *SendMapMsg) SendMsg(systemApp string, calss int) (msgid string, err error) {
|
|
sendUrl, _, err := GetSendMsgTokenUrl(systemApp, 1)
|
|
if err != nil {
|
|
return
|
|
}
|
|
sendMsgData, _ := json.Marshal(m.Send)
|
|
callBackByte := publicmethod.CurlPostJosn(sendUrl, sendMsgData)
|
|
var callBackMap interface{}
|
|
err = json.Unmarshal(callBackByte, &callBackMap)
|
|
fmt.Printf("jsonCont==>%v\n\n\n\n", string(sendMsgData))
|
|
fmt.Printf("\n\n\n\n企业微信返回数据==>%v\n\n\n\n", string(callBackByte))
|
|
resendIsRun := false
|
|
if val, isOk := callBackMap.(map[string]interface{}); isOk {
|
|
if mapVal, isOk := val["errcode"]; isOk {
|
|
errcode, err := publicmethod.StringToInt64(mapVal)
|
|
if err != nil {
|
|
resendIsRun = true
|
|
} else {
|
|
// fmt.Printf("errcode==>%v\n\n\n\n", errcode)
|
|
if errcode == 0 {
|
|
resendIsRun = false
|
|
} else {
|
|
resendIsRun = true
|
|
}
|
|
}
|
|
} else {
|
|
resendIsRun = true
|
|
}
|
|
if msgidVal, isOk := val["msgid"]; isOk {
|
|
msgid = publicmethod.TypeToInterface(msgidVal)
|
|
}
|
|
} else {
|
|
resendIsRun = true
|
|
}
|
|
if resendIsRun {
|
|
m.Number++
|
|
msgid, err = m.ResendSendMsg(systemApp, calss)
|
|
// fmt.Scanln()
|
|
// m.SendMsg(systemApp, calss)
|
|
return
|
|
}
|
|
// fmt.Printf("callBackMap==>%v\n\n-->%T\n\n", callBackMap, callBackMap)
|
|
// fmt.Printf("token==>%v\n\n\n\n", token)
|
|
return
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2024-12-11 09:56:18
|
|
@ 功能: 为得到正确信息是重复发送请求,最多发送三次
|
|
*/
|
|
func (m *SendMapMsg) ResendSendMsg(systemApp string, calss int) (msgid string, err error) {
|
|
fmt.Printf("执行第几次--->%v\n", m.Number)
|
|
if m.Number <= 3 {
|
|
go func() {
|
|
time.Sleep(time.Duration(5) * time.Second)
|
|
// fmt.Println("这条信息将在几秒后显示。")
|
|
msgid, err = m.SendMsg(systemApp, calss)
|
|
}()
|
|
} else {
|
|
fmt.Printf("超过最大补发次数!消息作废!--->%v\n", m.Number)
|
|
err = errors.New("超过最大补发次数!消息作废!")
|
|
}
|
|
return
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2024-12-10 16:28:43
|
|
@ 功能: 企业微信发送应用消息URL组装
|
|
@ 参数
|
|
|
|
#systemApp 系统
|
|
#class 类型 1:发送;2:更新;3:撤回
|
|
|
|
@ 返回值
|
|
|
|
#sendUrl 发送应用消息URL
|
|
#token token
|
|
#err 系统信息
|
|
|
|
@ 方法原型
|
|
|
|
#
|
|
*/
|
|
func GetSendMsgTokenUrl(systemApp string, class int) (sendUrl string, token string, err error) {
|
|
//获取token
|
|
token, err = GainWechatToken(systemApp, "sendWorkWechat", 2)
|
|
if err != nil {
|
|
return
|
|
}
|
|
switch class {
|
|
case 2:
|
|
sendUrl = fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/message/update_template_card?access_token=%v", token)
|
|
case 3:
|
|
sendUrl = fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/message/recall?access_token=%v", token)
|
|
default:
|
|
sendUrl = fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%v", token)
|
|
}
|
|
return
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2024-12-11 10:19:18
|
|
@ 功能:
|
|
*/
|
|
func (s *SendMessage) MsgInit() {
|
|
if s.Msgtype == "" {
|
|
s.Msgtype = "template_card"
|
|
}
|
|
if s.Agentid == 0 || s.Agentid == 1 {
|
|
s.Agentid, _ = strconv.Atoi(overall.CONSTANT_CONFIG.ShuTongZhiLian.Agentid)
|
|
}
|
|
if s.DuplicateCheckInterval == 0 {
|
|
s.DuplicateCheckInterval = 1800
|
|
}
|
|
if s.TemplateCard.CardType == "" {
|
|
s.TemplateCard.CardType = "text_notice"
|
|
}
|
|
if s.TemplateCard.Source.IconUrl == "" {
|
|
s.TemplateCard.Source.IconUrl = "https://docu.hxgk.group/images/2022_01/3f7a1120a559e9bee3991b85eb34d103.png"
|
|
}
|
|
if s.TemplateCard.Source.Desc == "" {
|
|
s.TemplateCard.Source.Desc = "数通智联化工云平台"
|
|
} else {
|
|
s.TemplateCard.Source.Desc = fmt.Sprintf("数通智联化工云平台 - %v", s.TemplateCard.Source.Desc)
|
|
}
|
|
if s.TemplateCard.Source.DescColor == 0 {
|
|
s.TemplateCard.Source.DescColor = 1
|
|
}
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2024-12-10 13:55:14
|
|
@ 功能: 通用发送消息
|
|
@ 参数
|
|
|
|
#
|
|
|
|
@ 返回值
|
|
|
|
#
|
|
|
|
@ 方法原型
|
|
|
|
#
|
|
*/
|
|
func (s *SendMessage) SendMsg(systemApp string, class int) (msgid string, err error) {
|
|
s.MsgInit()
|
|
topMapAry, err := s.MsgCommon.MsgCommon()
|
|
fmt.Printf("\n\n-A-3---》%v---》%v\n\n", s.Msgtype, err)
|
|
if err != nil {
|
|
return
|
|
}
|
|
msgCommonFooter := s.MsgCommonFooter.MsgCommonFooter(s.Msgtype)
|
|
var mapAry SendMapMsg
|
|
mapAry.Send = topMapAry
|
|
for i, v := range msgCommonFooter {
|
|
mapAry.Send[i] = v
|
|
}
|
|
|
|
switch s.Msgtype {
|
|
case "text":
|
|
mapAry.Send["text"], err = s.TextMethod()
|
|
if err != nil {
|
|
return
|
|
}
|
|
case "image":
|
|
mapAry.Send["image"], err = s.ImageMethod()
|
|
if err != nil {
|
|
return
|
|
}
|
|
case "voice":
|
|
mapAry.Send["voice"], err = s.VoiceMethod()
|
|
if err != nil {
|
|
return
|
|
}
|
|
case "video": //视频消息
|
|
mapAry.Send["video"], err = s.VideoMethod()
|
|
if err != nil {
|
|
return
|
|
}
|
|
case "file": //文件消息
|
|
mapAry.Send["file"], err = s.FileMethod()
|
|
if err != nil {
|
|
return
|
|
}
|
|
case "textcard": //文本卡片消息
|
|
mapAry.Send["textcard"], err = s.TextcardMethod()
|
|
if err != nil {
|
|
return
|
|
}
|
|
case "news": //图文消息
|
|
mapAry.Send["news"], err = s.NewsMethod()
|
|
fmt.Printf("\n\n-A-5---》%v\n\n", err, mapAry)
|
|
if err != nil {
|
|
return
|
|
}
|
|
case "mpnews": //图文消息(mpnews)
|
|
mapAry.Send["mpnews"], err = s.MpnewsMethod()
|
|
if err != nil {
|
|
return
|
|
}
|
|
case "markdown": //markdown消息
|
|
mapAry.Send["markdown"], err = s.MarkdownMethod()
|
|
if err != nil {
|
|
return
|
|
}
|
|
case "miniprogram_notice": //小程序通知消息
|
|
mapAry.Send["content_item"], err = s.MiniprogramNoticeMethod()
|
|
if err != nil {
|
|
return
|
|
}
|
|
case "template_card":
|
|
mapAry.Send["template_card"], err = s.TemplateCardMethod()
|
|
if err != nil {
|
|
return
|
|
}
|
|
default:
|
|
err = errors.New("没有消息类型!不可发送信息")
|
|
return
|
|
}
|
|
fmt.Printf("\n\n-A-4---》%v\n\n", mapAry)
|
|
// mapAry.Send["template_card"] = templateCard
|
|
msgid, err = mapAry.SendMsg(systemApp, class)
|
|
|
|
fmt.Printf("\n\n通用发送消息-----》%v-----》%v\n\n", msgid, err)
|
|
return
|
|
}
|
|
|
|
/*
|
|
*
|
|
@ 作者: 秦东
|
|
@ 时间: 2025-04-01 10:50:40
|
|
@ 功能: 撤回已发送的信息
|
|
@ 参数
|
|
|
|
#
|
|
|
|
@ 返回值
|
|
|
|
#
|
|
|
|
@ 方法原型
|
|
|
|
#
|
|
*/
|
|
func RecallWorkWechatMsg(systemApp, msgId string) bool {
|
|
sendUrl, _, err := GetSendMsgTokenUrl(systemApp, 3)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
sendInfo := publicmethod.MapOut[string]()
|
|
sendInfo["msgid"] = msgId
|
|
sendMsgData, _ := json.Marshal(sendInfo)
|
|
callBackByte := publicmethod.CurlPostJosn(sendUrl, sendMsgData)
|
|
var callBackMap interface{}
|
|
err = json.Unmarshal(callBackByte, &callBackMap)
|
|
fmt.Printf("jsonCont==>%v\n\n\n\n", string(sendMsgData))
|
|
fmt.Printf("\n\n\n\n企业微信返回数据==>%v\n\n\n\n", string(callBackByte))
|
|
if val, isOk := callBackMap.(map[string]interface{}); isOk {
|
|
if mapVal, isOk := val["errcode"]; isOk {
|
|
val, _ := publicmethod.StringToInt64(mapVal)
|
|
if val == 0 {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|