使用 Golang 開發的微信 SDK
WeChat SDK for Go
使用Golang開發的微信SDK,簡單、易用。
快速開始
以下是一個處理消息接收以及回復的例子:
//配置微信參數
config := &wechat.Config{
AppID: "xxxx",
AppSecret: "xxxx",
Token: "xxxx",
EncodingAESKey: "xxxx",
Cache: memCache
}
wc := wechat.NewWechat(config)
// 傳入request和responseWriter
server := wc.GetServer(request, responseWriter)
server.SetMessageHandler(func(msg message.MixMessage) *message.Reply {
//回復消息:演示回復用戶發送的消息
text := message.NewText(msg.Content)
return &message.Reply{message.MsgText, text}
})
server.Serve()
server.Send()</code></pre>
和主流框架配合使用
主要是request和responseWriter在不同框架中獲取方式可能不一樣:
- Beego: ./examples/beego/beego.go
- Gin Framework: ./examples/gin/gin.go
基本配置
memcache := cache.NewMemcache("127.0.0.1:11211")
wcConfig := &wechat.Config{
AppID: cfg.AppID,
AppSecret: cfg.AppSecret,
Token: cfg.Token,
EncodingAESKey: cfg.EncodingAESKey,//消息加解密時用到
Cache: memcache,
}</code></pre>
Cache 設置
Cache主要用來保存全局access_token以及js-sdk中的ticket: 默認采用memcache存儲。當然也可以直接實現 cache/cache.go 中的接口
基本API使用
- 消息管理
- 接收普通消息
- 接收事件推送
- 被動回復消息
- 回復文本消息
- 回復圖片消息
- 回復視頻消息
- 回復音樂消息
- 回復圖文消息
</li>
</ul> </li>
- 自定義菜單
- 自定義菜單創建接口
- 自定義菜單查詢接口
- 自定義菜單刪除接口
- 自定義菜單事件推送
- 個性化菜單接口
- 添加個性化菜單
- 刪除個性化菜單
- 測試個性化菜單匹配結果
</ul> </li>
- 獲取公眾號菜單配置
</ul> </li>
- 微信網頁開發
- Oauth2 授權
- 發起授權
- 通過code換取access_token
- 拉取用戶信息
- 刷新access_token
- 檢驗access_token是否有效
</ul> </li>
- 獲取js-sdk配置
</ul> </li>
- 素材管理
</ul>
消息管理
通過 wechat.GetServer(request,responseWriter) 獲取到server對象之后
調用 SetMessageHandler(func(msg message.MixMessage){}) 設置消息的處理函數,函數參數為message.MixMessage 結構如下:
//MixMessage 存放所有微信發送過來的消息和事件
type MixMessage struct {
CommonToken
//基本消息
MsgID int64 `xml:"MsgId"`
Content string `xml:"Content"`
PicURL string `xml:"PicUrl"`
MediaID string `xml:"MediaId"`
Format string `xml:"Format"`
ThumbMediaID string `xml:"ThumbMediaId"`
LocationX float64 `xml:"Location_X"`
LocationY float64 `xml:"Location_Y"`
Scale float64 `xml:"Scale"`
Label string `xml:"Label"`
Title string `xml:"Title"`
Description string `xml:"Description"`
URL string `xml:"Url"`
//事件相關
Event string `xml:"Event"`
EventKey string `xml:"EventKey"`
Ticket string `xml:"Ticket"`
Latitude string `xml:"Latitude"`
Longitude string `xml:"Longitude"`
Precision string `xml:"Precision"`
MenuID string `xml:"MenuId"`
//掃碼事件
ScanCodeInfo struct {
ScanType string `xml:"ScanType"`
ScanResult string `xml:"ScanResult"`
} `xml:"ScanCodeInfo"`
//發圖事件
SendPicsInfo struct {
Count int32 `xml:"Count"`
PicList []EventPic `xml:"PicList>item"`
} `xml:"SendPicsInfo"`
//發送地理位置事件
SendLocationInfo struct {
LocationX float64 `xml:"Location_X"`
LocationY float64 `xml:"Location_Y"`
Scale float64 `xml:"Scale"`
Label string `xml:"Label"`
Poiname string `xml:"Poiname"`
}
}</code></pre>
接收普通消息
server.SetMessageHandler(func(v message.MixMessage) *message.Reply {
switch v.MsgType {
//文本消息
case message.MsgTypeText:
//do something
//圖片消息
case message.MsgTypeImage:
//do something
//語音消息
case message.MsgTypeVoice:
//do something
//視頻消息
case message.MsgTypeVideo:
//do something
//小視頻消息
case message.MsgTypeShortVideo:
//do something
//地理位置消息
case message.MsgTypeLocation:
//do something
//鏈接消息
case message.MsgTypeLink:
//do something
//事件推送消息
case message.MsgTypeEvent:
}
}</code></pre>
接收事件推送
//事件推送消息
case message.MsgTypeEvent:
switch v.Event {
//EventSubscribe 訂閱
case message.EventSubscribe:
//do something
//取消訂閱
case message.EventUnsubscribe:
//do something
//用戶已經關注公眾號,則微信會將帶場景值掃描事件推送給開發者
case message.EventScan:
//do something
// 上報地理位置事件
case message.EventLocation:
//do something
// 點擊菜單拉取消息時的事件推送
case message.EventClick:
//do something
// 點擊菜單跳轉鏈接時的事件推送
case message.EventView:
//do something
// 掃碼推事件的事件推送
case message.EventScancodePush:
//do something
// 掃碼推事件且彈出“消息接收中”提示框的事件推送
case message.EventScancodeWaitmsg:
//do something
// 彈出系統拍照發圖的事件推送
case message.EventPicSysphoto:
//do something
// 彈出拍照或者相冊發圖的事件推送
case message.EventPicPhotoOrAlbum:
//do something
// 彈出微信相冊發圖器的事件推送
case message.EventPicWeixin:
//do something
// 彈出地理位置選擇器的事件推送
case message.EventLocationSelect:
//do something
}</code></pre>
被動回復消息
回復消息需要返回 *message.Reply 對象結構體如下:
type Reply struct {
MsgType MsgType //消息類型
MsgData interface{} //消息結構
}
注意: retrun nil 表示什么也不做
回復文本消息
text := message.NewText("回復文本消息")
return &message.Reply{message.MsgTypeText, text}
回復圖片消息
//mediaID 可通過素材管理-上上傳多媒體文件獲得
image :=message.NewVideo("mediaID")
return &message.Reply{message.MsgTypeVideo, image}
回復視頻消息
video := message.NewVideo("mediaID", "視頻標題", "視頻描述")
return &message.Reply{message.MsgTypeVideo, video}
回復音樂消息
music := message.NewMusic("title", "description", "musicURL", "hQMusicURL", "thumbMediaID")
return &message.Reply{message.MsgTypeMusic,music}
字段說明:
Title:音樂標題
Description:音樂描述
MusicURL:音樂鏈接
HQMusicUrl:高質量音樂鏈接,WIFI環境優先使用該鏈接播放音樂
ThumbMediaId:縮略圖的媒體id,通過素材管理接口上傳多媒體文件,得到的id
回復圖文消息
articles := make([]*message.Article, 1)
article := new(message.Article)
article.Title = "標題"
article.Description = "描述信息信息信息"
article.PicURL = "mu := wc.GetMenu(c.Request, c.Writer)
buttons := make([]*menu.Button, 1)
btn := new(menu.Button)
//創建click類型菜單
btn.SetClickButton("name", "key123")
buttons[0] = btn
//設置btn為二級菜單
btn2 := new(menu.Button)
btn2.SetSubButton("subButton", buttons)
buttons2 := make([]*menu.Button, 1)
buttons2[0] = btn2
//發送請求
err := mu.SetMenu(buttons2)
if err != nil {
fmt.Printf("err= %v", err)
return
}</code></pre>
創建其他類型的菜單:
//SetViewButton view類型
func (btn *Button) SetViewButton(name, url string)
// SetScanCodePushButton 掃碼推事件
func (btn *Button) SetScanCodePushButton(name, key string)
//SetScanCodeWaitMsgButton 設置 掃碼推事件且彈出"消息接收中"提示框
func (btn *Button) SetScanCodeWaitMsgButton(name, key string)
//SetPicSysPhotoButton 設置彈出系統拍照發圖按鈕
func (btn *Button) SetPicSysPhotoButton(name, key string)
//SetPicPhotoOrAlbumButton 設置彈出拍照或者相冊發圖類型按鈕
func (btn *Button) SetPicPhotoOrAlbumButton(name, key string) {
// SetPicWeixinButton 設置彈出微信相冊發圖器類型按鈕
func (btn *Button) SetPicWeixinButton(name, key string)
// SetLocationSelectButton 設置 彈出地理位置選擇器 類型按鈕
func (btn *Button) SetLocationSelectButton(name, key string)
//SetMediaIDButton 設置 下發消息(除文本消息) 類型按鈕
func (btn *Button) SetMediaIDButton(name, mediaID string)
//SetViewLimitedButton 設置 跳轉圖文消息URL 類型按鈕
func (btn Button) SetViewLimitedButton(name, mediaID string) {</code></pre>
自定義菜單查詢接口
mu := wc.GetMenu(c.Request, c.Writer)
resMenu,err:=mu.GetMenu()
返回結果 resMenu 結構參考 ./menu/menu.go 中ResMenu 結構體
自定義菜單刪除接口
mu := wc.GetMenu(c.Request, c.Writer)
err:=mu.DeleteMenu()
自定義菜單事件推送
請參考 消息管理 - 事件推送
個性化菜單接口
添加個性化菜單
func (menu
Menu) AddConditional(buttons []Button, matchRule MatchRule) error</code></pre>
刪除個性化菜單
//刪除個性化菜單
func (menu *Menu) DeleteConditional(menuID int64) error
測試個性化菜單匹配結果
//菜單匹配
func (menu *Menu) MenuTryMatch(userID string) (buttons []Button, err error) {
獲取公眾號菜單配置
//獲取自定義菜單配置接口
func (menu *Menu) GetCurrentSelfMenuInfo() (resSelfMenuInfo ResSelfMenuInfo, err error)
微信網頁開發
Oauth2 授權
具體授權流程請參考微信文檔: 網頁授權
1.發起授權
oauth := wc.GetOauth(c.Request, c.Writer)
err := oauth.Redirect("跳轉的絕對地址", "snsapi_userinfo", "123dd123")
if err != nil {
fmt.Println(err)
}
如果不希望直接跳轉,可通過 oauth.GetRedirectURL 獲取跳轉的url
2.通過code換取access_token
code := c.Query("code")
resToken, err := oauth.GetUserAccessToken(code)
if err != nil {
fmt.Println(err)
return
}
3.拉取用戶信息(需scope為 snsapi_userinfo)
//getUserInfo
userInfo, err := oauth.GetUserInfo(resToken.AccessToken, resToken.OpenID)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(userInfo)
刷新access_token
func (oauth *Oauth) RefreshAccessToken(refreshToken string) (result ResAccessToken, err error)
檢驗access_token是否有效
func (oauth *Oauth) CheckAccessToken(accessToken, openID string) (b bool, err error)
獲取js-sdk配置
js := wc.GetJs(c.Request, c.Writer)
cfg, err := js.GetConfig("傳入需要的調用js-sdk的url地址")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(cfg)
其中返回的cfg結構體如下:
type Config struct {
AppID string
TimeStamp int64
NonceStr string
Signature string
}
素材管理
來自:https://github.com/silenceper/wechat