5
package main
import (
"net/http"
"github.com/esap/wechat" // 微 信 SDK包
)
func main() {
wechat.Debug = true
cfg := &wechat.WxConfig{
Token: "yourToken",
AppId: "yourAppID",
Secret: "yourSecret",
EncodingAESKey: "yourEncodingAesKey",
}
app := wechat.New(cfg)
app.SendText("@all", "Hello,World!")
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
app.VerifyURL(w, r).NewText("客 服 消息 1").Send().NewText("客 服 消息 2").Send().NewText("查询OK").Reply()
})
http.ListenAndServe(":9090", nil)
}
// 创建公 众号实例(服 务号/订阅号 /小 程 序 ) 不 带aesKey则为明文 模 式
cfg := &wechat.WxConfig{
Token: "yourToken",
AppId: "yourAppID",
Secret: "yourSecret",
}
// 创建公 众号实例(服 务号/订阅号 /小 程 序 )
cfg := &wechat.WxConfig{
Token: "yourToken",
AppId: "yourAppID",
Secret: "yourSecret",
EncodingAESKey: "yourEncodingAesKey",
}
// 创建企 业微信 实例
cfg := &wechat.WxConfig{
Token: "yourToken",
AppId: "yourCorpID",
AgentId: "yourAgentId",
Secret: "yourSecret",
EncodingAESKey: "yourEncodingAesKey",
AppType: 1,
}
app.SendText(to, msg)
app.SendImage(to, mediaId)
app.SendVoice(to, mediaId)
app.SendFile(to, mediaId)
app.SendVideo(to, mediaId, title, desc)
app.SendTextcard(to, title, desc, url)
app.SendMusic(to, mediaId, title, desc, musicUrl, qhMusicUrl)
app.SendNews(to, arts...)
app.SendMpNews(to, arts...)
app.SendMpNewsId(to, mediaId)
app.SendMarkDown(to, content)
通常 将 app.VerifyURL(http.ResponseWriter, *http.Request)
嵌入 http handler
该函*wechat.Context
// 混合 用 户消息 ,业务判断 的 主体
WxMsg struct {
XMLName xml.Name `xml:"xml"`
ToUserName
FromUserName
CreateTime 64
MsgId 64
MsgType
Content // text
AgentID // corp
PicUrl // image
MediaId // image/voice/video/shortvideo
Format // voice
Recognition // voice
ThumbMediaId // video
LocationX float32 `xml:"Latitude"` // location
LocationY float32 `xml:"Longitude"` // location
Precision float32 // LOCATION
Scale // location
Label // location
Title // link
Description // link
Url // link
Event // event
EventKey // event
SessionFrom // event|user_enter_tempsession
Ticket
FileKey
FileMd5
FileTotalLen
ScanCodeInfo struct {
ScanType
ScanResult
}
}
- 如果
使用 其他web框 架 ,例 如echo/gin/beego等 ,则把VerifyURL()放 入 controller或 handler
// echo示 例 公 众号回 调接口
func wxApiPost(c echo.Context) error {
ctx := app.VerifyURL(c.Response().Writer, c.Request())
// TODO: 这里是 其他业务操作
return nil
}
-
被 动回复,采 用 XML格式 编码返 回 (Reply); -
客 服 消息 ,采 用 json格式 编码返 回 (Send); -
两种
方式 都 可 先 调用*wechat.Context
对象的 New方法 创建消息 ,然 后 调用Reply()或 Send()。 -
支持 链式调用,但 Reply()只 有 第 一 次 有效 。
ctx.NewText("正 在 查询中 ...").Reply()
ctx.NewText("客 服 消息 1").Send().NewText("客 服 消息 2").Send()
被 动回复可直接 调用Reply(),表示 已 收 到 ,然 后 调用客 服 消息 。
ctx.NewText("content")
// mediaID 可 通 过素材 管理 -上上 传多媒体 文 件 获得
ctx.NewImage("mediaID")
ctx.NewVoice("mediaID")
// 仅企业号支持
ctx.NewFile("mediaID")
ctx.NewVideo("mediaID", "title", "description")
ctx.NewMusic("thumbMediaID","title", "description", "musicURL", "hqMusicURL")
// 先 创建三 个文章
art1 := wechat.NewArticle("拥抱AI,享受 工作 ",
"来 自 村 长的ESAP系 统最新 技 术分享 ",
"http://ylin.wang/img/esap18-1.png",
"http://ylin.wang/2017/07/13/esap18/")
art2 := wechat.NewArticle("用 企 业微信 代替 pda实现扫描入 库",
"来 自 村 长的ESAP系 统最新 技 术分享 ",
"http://ylin.wang/img/esap17-2.png",
"http://ylin.wang/2017/06/23/esap17/")
art3 := wechat.NewArticle("大道 至 简的哲学 ",
"来 自 村 长的工作 日 志 ",
"http://ylin.wang/img/golang.jpg",
"http://ylin.wang/2017/01/29/log7/")
// 打 包 成 新 闻
ctx.NewNews(art1, art2, art3)
tlpdata := map[string]struct {
Value `json:"value"`
Color `json:"color"`
}{
"first": {Value: "我 是 渣渣涛", Color: "#173177"},
"keyword1": {Value: "这是一个你从没有玩过的全新游戏", Color: "#173177"},
"keyword2": {Value: "只 要 你跟着 我 一起 试玩一 下 ", Color: "#173177"},
"keyword3": {Value: "你就会 爱上这款游 戏", Color: "#4B1515"},
"remark": {Value: "是 兄弟 就来砍我", Color: "#071D42"},
}
ctx.SendTemplate(
ctx.Msg.FromUserName,
"tempid", // 模 板 ID
c.Request.Host, // 跳 转url
ctx.AppId, // 跳 转小程 序 ,比 url优先
"", // 小 程 序 页面
tlpdata,
)
MIT