应用集成平台服务端
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

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
}