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 }