这是一个使用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有效性
- 接收普通消息:文本消息,图片消息,语音消息,视频消息,地理位置消息,链接消息
- 接收事件推送:关注/取消关注,扫描二维码事件,上报地理位置,自定义菜单
- 发送被动响应消息:文本消息,图片消息,语音消息,视频消息,音乐消息,图文消息