状态:beta
官方文档:
https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/product/Third_party_platform_appid.html
快速入门
wc := wechat.NewWechat() memory := cache.NewMemory() cfg := &openplatform.Config{ AppID: "xxx", AppSecret: "xxx", Token: "xxx", EncodingAESKey: "xxx", Cache: memory, } //授权的第三方公众号的appID appID := "xxx" // 下面文档中提到的openPlatform都是这个变量 openPlatform := wc.GetOpenPlatform(cfg) officialAccount := openPlatform.GetOfficialAccount(appID) // 传入request和responseWriter server := officialAccount.GetServer(req, rw) //设置接收消息的处理方法 server.SetMessageHandler(func(msg message.MixMessage) *message.Reply { if msg.InfoType == message.InfoTypeVerifyTicket { componentVerifyTicket, err := openPlatform.SetComponentAccessToken(msg.ComponentVerifyTicket) if err != nil { log.Println(err) return nil } //debug fmt.Println(componentVerifyTicket) rw.Write([]byte("success")) return nil } //handle other message // return nil }) //处理消息接收以及回复 err := server.Serve() if err != nil { fmt.Println(err) return } //发送回复的消息 server.Send()
代第三方公众号 - 发起网页授权
//第三方公众号appid appid := "" officialAccount := openPlatform.GetOfficialAccount(appid) oauth := officialAccount.PlatformOauth() //重定向到微信oauth授权登录 oauth.Redirect(rw, req, callback, "snsapi_userinfo", "", appid)
代第三方公众号 - 通过网页授权的code 换取access_token
officialAccount := openPlatform.GetOfficialAccount(appid) componentAccessToken, err := openPlatform.GetComponentAccessToken() if err != nil { fmt.Println(err) } accessToken, err := officialAccount.PlatformOauth().GetUserAccessToken(code, appid, componentAccessToken) if err != nil { fmt.Println(err) } fmt.Println(accessToken) // 通过accessToken获取用户信息请参考微信公众号的业务
维护AuthrToken
AuthrToken是平台代第三方公众号调用微信接口的凭据,通过第三方公众号授权给平台时得到的refreshToken来获取
func CheckAuthrToken(appid, refreshToken string) { // 获取authrToken token, err := openPlatform.GetAuthrAccessToken(appid) if err != nil { fmt.Println(err) } if token == "" { openPlatform.RefreshAuthrToken(appid, refreshToken) } }
代第三方公众号 - 调用微信接口(以发送微信模板消息为例)
平台代第三方公众号调用微信接口,需要在调用前确保AuthrToken有效,其余操作与公众号一致。
import "github.com/silenceper/wechat/v2/officialaccount/message" // 在代第三方公众号调用微信接口的时候,需要确保AuthrToken有效 // 这里的appid是第三方公众号的appid CheckAuthrToken(appid, refreshToken) msg := &message.TemplateMessage{ ToUser: openid, TemplateID: templateID, URL: url, Data: data, } officialAccount := openPlatform.GetOfficialAccount(appid) template := message.NewTemplate(officialAccount.GetContext()) msgID, err := template.Send(msg) if err != nil { fmt.Println(err) } fmt.Println(msgID)
微信的部分接口(如:获取jsconfig信息)区分了第三方平台调用和公众号直接调用的地址,在文档下方单独进行说明。
代第三方公众号 - 获取jsconfig信息
CheckAuthrToken(appid, refreshToken) jsConfig, err := openPlatform.GetOfficialAccount(appid).PlatformJs().GetConfig(uri, appid) if err != nil { fmt.Println(err) } fmt.Println(jsConfig)
全网发布校验
微信第三方平台进行全网发布的时候,会有一个全网发布接入检测的过程。
官方文档
memory := cache.NewMemory()
cfg := &openplatform.Config{
AppID: "xxx",
AppSecret: "xxx",
Token: "xxx",
EncodingAESKey: "xxx",
Cache: memory,
}
//授权的第三方公众号的appID
appID := "xxx"
// 下面文档中提到的openPlatform都是这个变量
openPlatform := wc.GetOpenPlatform(cfg)
officialAccount := openPlatform.GetOfficialAccount(appID)
// 传入request和responseWriter
server := officialAccount.GetServer(req, rw)
//设置接收消息的处理方法
server.SetMessageHandler(func(msg message.MixMessage) *message.Reply {
switch msg.InfoType {
case message.InfoTypeVerifyTicket:
// 在这里处理推送的VerifyTicket
// 测试验证票据推送流程
rw.Write([]byte("success"))
case message.InfoTypeAuthorized:
// 微信会推送测试号的query_auth_code过来,需要在这里获取到测试号的AuthrToken
// 参照开放平台的`维护AuthrToken`小节
}
switch msg.MsgType {
case message.MsgTypeText:
if msg.Content == "TESTCOMPONENT_MSG_TYPE_TEXT" {
// 测试公众号处理用户消息
return &message.Reply{
MsgType: message.MsgTypeText,
MsgData: message.NewText("TESTCOMPONENT_MSG_TYPE_TEXT_callback"),
}
}
// 测试公众号使用客服消息接口处理用户消息
if strings.HasPrefix(msg.Content, "QUERY_AUTH_CODE") {
// 立即回复空串
rw.Write([]byte(""))
var data = strings.Split(msg.Content, ":")
if len(data) == 2 {
// 调用客服接口回复消息
customerMsg := message.NewCustomerTextMessage(string(msg.FromUserName), fmt.Sprintf("%s_from_api", data[1]))
CheckAuthrToken(appid, refreshToken)
officialAccount := openPlatform.GetOfficialAccount(appid)
msgManager := message.NewMessageManager(officialAccount.GetContext())
msgManager.Send(msg)
}
}
}
return nil
})
//处理消息接收以及回复
err := server.Serve()
if err != nil {
fmt.Println(err)
return
}
//发送回复的消息
server.Send()
公众号授权流程
小程序或者公众号授权给第三方平台的流程
官方文档
扫码授权
// 获取公众号扫码授权页面链接 loginPageURL, err := openPlatform.GetComponentLoginPage(redirectURI, authType, "") // ...引导用户扫码授权 // 注意: 这里微信会校验跳转到授权页的referer,必须与第三方平台后台设置的`登录授权的发起页域名`一致 // --------- // 通过授权回调获取到的authCode换取公众号或小程序的接口调用凭据和授权信息 authInfo, err := openPlatform.QueryAuthCode(authCode) // ...处理公众号授权后的逻辑, 存储refreshToken