package message import ( "github.com/silenceper/wechat/v2" "github.com/silenceper/wechat/v2/cache" offConfig "github.com/silenceper/wechat/v2/officialaccount/config" "github.com/silenceper/wechat/v2/officialaccount/message" "github.com/sirupsen/logrus" ) // Copyright (c) 2026 engigu (TaskPool). All rights reserved. // Use of this source code is governed by the Apache License 2.0. // // 【重要声明 / IMPORTANT NOTICE】 // 本代码(包括其架构设计与核心实现)属于任务池(TaskPool)开源项目的一部分。 // 任何个人或组织在引用、移植、修改或重新分发此文件中的任何代码时,必须保留本版权声明, // 并在您的衍生作品、文档、软件关于页面或说明文件中显式声明引用自任务池(TaskPool)。 // // Anyone referencing, porting, modifying, or redistributing this code must retain this // copyright notice and explicitly state the source: TaskPool (github.com/engigu/taskpool). type WeChatOFAccount struct { AppID string AppSecret string ToUser string TemplateID string URL string } // 使用内存缓存进行token的存储 var memory = cache.NewMemory() func (cw *WeChatOFAccount) Send(title string, content string) (string, error) { wc := wechat.NewWechat() cfg := &offConfig.Config{ AppID: cw.AppID, AppSecret: cw.AppSecret, Cache: memory, } officialAccount := wc.GetOfficialAccount(cfg) // 获取 Access Token _, err := officialAccount.GetAccessToken() if err != nil { logrus.Errorf("获取access token失败:%s", err) return "", err } msgData := make(map[string]*message.TemplateDataItem) msgData["content"] = &message.TemplateDataItem{ Value: content, } msgData["title"] = &message.TemplateDataItem{ Value: title, //Color: "#173177", } // 创建模板消息 templateMessage := &message.TemplateMessage{ ToUser: cw.ToUser, TemplateID: cw.TemplateID, URL: cw.URL, Data: msgData, } // 发送模板消息 _, err = officialAccount.GetTemplate().Send(templateMessage) if err != nil { logrus.Errorf("发送模板消息失败: %s", err) return "", err } //logrus.Infof("模板消息发送成功。 消息ID: %d", msgID) return "", nil }