这是一个使用Go语言对微信公众平台的封装。参考了微信公众平台API文档
通过执行下列语句就可以完成安装
go get github.com/wizjin/weixin
注册微信公众平台,填写验证微信公众平台的Token
package main import ( "github.com/wizjin/weixin" "net/http" ) // 文本消息的处理函数 func Echo(w weixin.ResponseWriter, r *weixin.Request) { txt := r.Content // 获取用户发送的消息 w.ReplyText(txt) // 回复一条文本消息 w.PostText("Post:" + txt) // 发送一条文本消息 } // 关注事件的处理函数 func Subscribe(w weixin.ResponseWriter, r *weixin.Request) { w.ReplyText("欢迎关注") // 有新人关注,返回欢迎消息 } func main() { // my-token 验证微信公众平台的Token // app-id, app-secret用于高级API调用。 // 如果仅使用接收/回复消息,则可以不填写,使用下面语句 // mux := weixin.New("my-token", "", "") mux := weixin.New("my-token", "app-id", "app-secret") // 设置AES密钥,如果不使用AES可以省略这行代码 mux.SetEncodingAESKey("encoding-AES-key") // 注册文本消息的处理函数 mux.HandleFunc(weixin.MsgTypeText, Echo) // 注册关注事件的处理函数 mux.HandleFunc(weixin.MsgTypeEventSubscribe, Subscribe) http.Handle("/", mux) // 注册接收微信服务器数据的接口URI http.ListenAndServe(":80", nil) // 启动接收微信数据服务器 }
微信公众平台要求在收到消息后5秒内回复消息(Reply接口) 如果时间操作很长,则可以使用Post接口发送消息 如果只使用Post接口发送消息,则需要先调用ReplyOK来告知微信不用等待回复。
处理函数的定义可以使用下面的形式
func Func(w weixin.ResponseWriter, r *weixin.Request) { ... }
可以注册的处理函数类型有以下几种
weixin.MsgTypeText接收文本消息weixin.MsgTypeImage接收图片消息weixin.MsgTypeVoice接收语音消息weixin.MsgTypeVideo接收视频消息weixin.MsgTypeShortVideo接收小视频消息weixin.MsgTypeLocation接收地理位置消息weixin.MsgTypeLink接收链接消息weixin.MsgTypeEventSubscribe接收关注事件weixin.MsgTypeEventUnsubscribe接收取消关注事件weixin.MsgTypeEventScan接收扫描二维码事件weixin.MsgTypeEventView接收点击菜单跳转链接时的事件weixin.MsgTypeEventClick接收自定义菜单事件weixin.MsgTypeEventLocation接收上报地理位置事件weixin.MsgTypeEventTemplateSent接收模版消息发送结果
需要发送被动响应消息,可通过weixin.ResponseWriter的下列方法完成
ReplyOK()无同步消息回复ReplyText(text)回复文本消息ReplyImage(mediaId)回复图片消息ReplyVoice(mediaId)回复语音消息ReplyVideo(mediaId, title, description)回复视频消息ReplyMusic(music)回复音乐消息ReplyNews(articles)回复图文消息
PostText(text)发送文本消息PostImage(mediaId)发送图片消息PostVoice(mediaId)发送语音消息PostVideo(mediaId, title, description)发送视频消息PostMusic(music)发送音乐消息PostNews(articles)发送图文消息
如需要发送模版消息,需要先获取模版ID,之后再根据ID发送。
func GetTemplateId(wx *weixin.Weixin) { tid, err := wx.AddTemplate("TM00015") if err != nil { fmt.Println(err) } else { fmt.Println(ips) // 模版ID } }
随后可以发送模版消息了。
func SendTemplateMessage(w weixin.ResponseWriter, r *weixin.Request) { templateId := ... url := ... msgid, err := w.PostTemplateMessage(templateId, url, weixin.TmplData{ "first": weixin.TmplItem{"Hello World!", "#173177"}}) if err != nil { fmt.Println(err) } else { fmt.Println(msgid) } }
在模版消息发送成功后,还会通过类型为MsgTypeEventTemplateSent的消息推送获得发送结果。
TemplateSentStatusSuccess发送成功TemplateSentStatusUserBlock发送失败,用户拒绝接收TemplateSentStatusSystemFailed发送失败,系统原因
使用如下函数可以用来上传多媒体文件:
UploadMediaFromFile(mediaType string, filepath string)
示例 (用一张本地图片来返回图片消息):
func ReciveMessage(w weixin.ResponseWriter, r *weixin.Request) { // 上传本地文件并获取MediaID mediaId, err := w.UploadMediaFromFile(weixin.MediaTypeImage, "/my-file-path") if err != nil { w.ReplyText("上传图片失败") } else { w.ReplyImage(mediaId) // 利用获取的MediaId来返回图片消息 } }
使用如下函数可以用来下载多媒体文件:
DownloadMediaToFile(mediaId string, filepath string)
示例 (收到一条图片消息,然后保存图片到本地文件):
func ReciveImageMessage(w weixin.ResponseWriter, r *weixin.Request) { // 下载文件并保存到本地 err := w.DownloadMediaToFile(r.MediaId, "/my-file-path") if err != nil { w.ReplyText("保存图片失败") } else { w.ReplyText("保存图片成功") } }
示例,获取微信服务器IP地址列表
func GetIpList(wx *weixin.Weixin) { ips, err := wx.GetIpList() if err != nil { fmt.Println(err) } else { fmt.Println(ips) // Ip地址列表 } }
示例,获取AccessToken
func GetAccessToken(wx *weixin.Weixin) { a := wx.GetAccessToken if time.Until(token.Expires).Seconds() > 0 { fmt.Println(a.Token) // AccessToken } else { fmt.Println("Timeout") // 超时 } }
示例,创建临时二维码
func CreateQRScene(wx *weixin.Weixin) { // 二维码ID - 1000 // 过期时间 - 1800秒 qr, err := wx.CreateQRScene(1000, 1800) if err != nil { fmt.Println(err) } else { url := qr.ToURL() // 获取二维码的URL fmt.Println(url) } }
示例,创建永久二维码
func CreateQRScene(wx *weixin.Weixin) { // 二维码ID - 1001 qr, err := wx.CreateQRLimitScene(1001) if err != nil { fmt.Println(err) } else { url := qr.ToURL() // 获取二维码的URL fmt.Println(url) } }
func ShortURL(wx *weixin.Weixin) { // 长链接转短链接 url, err := wx.ShortURL("http://mp.weixin.qq.com/wiki/10/165c9b15eddcfbd8699ac12b0bd89ae6.html") if err != nil { fmt.Println(err) } else { fmt.Println(url) } }
示例,创建自定义菜单
func CreateMenu(wx *weixin.Weixin) { menu := &weixin.Menu{make([]weixin.MenuButton, 2)} menu.Buttons[0].Name = "我的菜单" menu.Buttons[0].Type = weixin.MenuButtonTypeUrl menu.Buttons[0].Url = "https://mp.weixin.qq.com" menu.Buttons[1].Name = "我的子菜单" menu.Buttons[1].SubButtons = make([]weixin.MenuButton, 1) menu.Buttons[1].SubButtons[0].Name = "测试" menu.Buttons[1].SubButtons[0].Type = weixin.MenuButtonTypeKey menu.Buttons[1].SubButtons[0].Key = "MyKey001" err := wx.CreateMenu(menu) if err != nil { fmt.Println(err) } }
自定义菜单的类型有如下几种
weixin.MenuButtonTypeKey点击推事件weixin.MenuButtonTypeUrl跳转URLweixin.MenuButtonTypeScancodePush扫码推事件weixin.MenuButtonTypeScancodeWaitmsg扫码推事件且弹出"消息接收中"提示框weixin.MenuButtonTypePicSysphoto弹出系统拍照发图weixin.MenuButtonTypePicPhotoOrAlbum弹出拍照或者相册发图weixin.MenuButtonTypePicWeixin弹出微信相册发图器weixin.MenuButtonTypeLocationSelect弹出地理位置选择器weixin.MenuButtonTypeMediaId下发消息(除文本消息)weixin.MenuButtonTypeViewLimited跳转图文消息URL
示例,获取自定义菜单
func DeleteMenu(wx *weixin.Weixin) { menu, err := wx.GetMenu() if err != nil { fmt.Println(err) } else { fmt.Println(menu) } }
示例,删除自定义菜单
func DeleteMenu(wx *weixin.Weixin) { err := wx.DeleteMenu() if err != nil { fmt.Println(err) } }
示例,生成JSSDK签名
func SignJSSDK(wx *weixin.Weixin, url string) { timestamp := time.Now().Unix() noncestr := fmt.Sprintf("%d", c.randreader.Int()) sign, err := wx.JsSignature(url, timestamp, noncestr) if err != nil { fmt.Println(err) } else { fmt.Println(sign) } }
示例,生成重定向URL
func CreateRedirect(wx *weixin.Weixin, url string) { redirect := wx.CreateRedirectURL(url, weixin.RedirectURLScopeBasic, "") }
URL的类型有如下几种:
RedirectURLScopeBasic基本授权,仅用来获取OpenId或UnionIdRedirectURLScopeUserInfo高级授权,可以用于获取用户基本信息,需要用户同意
示例,获取用户OpenId和UnionId
func GetUserId(wx *weixin.Weixin, code string) { user, err := wx.GetUserAccessToken(code) if err != nil { fmt.Println(err) } else { fmt.Println(user.OpenId) fmt.Println(user.UnionId) } }
示例,获取用户信息
func GetUserInfo(wx *weixin.Weixin, openid string) { user, err := wx.GetUserInfo(openid) if err != nil { fmt.Println(err) } else { fmt.Println(user.Nickname) fmt.Println(user.Sex) fmt.Println(user.City) fmt.Println(user.Country) fmt.Println(user.Province) fmt.Println(user.HeadImageUrl) fmt.Println(user.SubscribeTime) fmt.Println(user.Remark) } }
This project is licensed under the MIT license, see LICENSE.
- 用户管理
- 支持AES
- 添加模版消息送
- 添加JSSDK签名生成
- 添加重定向URL生成
- 添加获取用户OpenId和UnionId
- 添加获取授权用户信息
- 获取微信服务器IP地址
- 接收小视频消息
- 自定义菜单
- 长链接转短链接
- 添加将消息转发到多客服功能
- 创建/换取二维码
- 多媒体文件处理:上传/下载多媒体文件
- 发送客服消息:文本消息,图片消息,语音消息,视频消息,音乐消息,图文消息
- Token验证URL有效性
- 接收普通消息:文本消息,图片消息,语音消息,视频消息,地理位置消息,链接消息
- 接收事件推送:关注/取消关注,扫描二维码事件,上报地理位置,自定义菜单
- 发送被动响应消息:文本消息,图片消息,语音消息,视频消息,音乐消息,图文消息