component

package
v0.0.0-...-aad7e29 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 18, 2017 License: Apache-2.0 Imports: 16 Imported by: 0

Documentation

Overview

公众号第三方平台接口

Index

Constants

View Source
const (
	// 微信服务器推送过来的消息类型
	MsgTypeVerifyTicket = "component_verify_ticket" // 推送 component_verify_ticket 协议
	MsgTypeUnauthorized = "unauthorized"            // 取消授权的通知
)

Variables

View Source
var ErrNotFound = errors.New("item not found")

Functions

func AuthCodeURL

func AuthCodeURL(componentAppId, preAuthCode, redirectURI, state string) string

微信公众号登录授权入口地址.

授权后跳转到 redirectURI?auth_code=xxx&expires_in=600

func ServeHTTP

func ServeHTTP(w http.ResponseWriter, r *http.Request, queryValues url.Values, srv Server, errHandler mp.ErrorHandler)

ServeHTTP 处理 http 消息请求

NOTE: 调用者保证所有参数有效

Types

type AccessTokenServer

type AccessTokenServer interface {
	// 从中控服务器获取被缓存的 component_access_token.
	Token() (string, error)

	// 请求中控服务器到微信服务器刷新 component_access_token.
	//
	//  高并发场景下某个时间点可能有很多请求(比如缓存的 component_access_token 刚好过期时), 但是我们
	//  不期望也没有必要让这些请求都去微信服务器获取 component_access_token(有可能导致api超过调用限制),
	//  实际上这些请求只需要一个新的 component_access_token 即可, 所以建议 AccessTokenServer 从微信服务器
	//  获取一次 component_access_token 之后的至多5秒内(收敛时间, 视情况而定, 理论上至多5个http或tcp周期)
	//  再次调用该函数不再去微信服务器获取, 而是直接返回之前的结果.
	TokenRefresh() (string, error)

	// 没有实际意义, 接口标识
	Tag7B36CB9FFE9911E48469A4DB30FED8E1()
}

component_access_token 中控服务器接口.

type AuthorizationInfo

type AuthorizationInfo struct {
	AuthorizerAccessTokenInfo
	AuthorizerAppId string     `json:"authorizer_appid"`
	FunctionInfo    []Function `json:"func_info"`
}

type AuthorizerAccessTokenInfo

type AuthorizerAccessTokenInfo struct {
	Token        string `json:"authorizer_access_token"`
	ExpiresIn    int64  `json:"expires_in"` // 有效时间, seconds
	RefreshToken string `json:"authorizer_refresh_token"`
}

type AuthorizerAccessTokenServer

type AuthorizerAccessTokenServer struct {
	// contains filtered or unexported fields
}

authorizer_access_token 中控服务器, mp.AccessTokenServer 的简单实现.

NOTE:
1. 用于单进程环境.
2. 因为 AuthorizerAccessTokenServer 同时也是一个简单的中控服务器, 而不是仅仅实现 mp.AccessTokenServer 接口,
   所以整个系统只能存在一个 AuthorizerAccessTokenServer 实例!

func NewAuthorizerAccessTokenServer

func NewAuthorizerAccessTokenServer(clt *Client, authorizerAppId, authorizerRefreshToken string) (srv *AuthorizerAccessTokenServer)

创建一个新的 AuthorizerAccessTokenServer.

func (*AuthorizerAccessTokenServer) TagCE90001AFE9C11E48611A4DB30FED8E1

func (srv *AuthorizerAccessTokenServer) TagCE90001AFE9C11E48611A4DB30FED8E1()

func (*AuthorizerAccessTokenServer) Token

func (srv *AuthorizerAccessTokenServer) Token() (token string, err error)

獲取 authorizer_access_token

func (*AuthorizerAccessTokenServer) TokenRefresh

func (srv *AuthorizerAccessTokenServer) TokenRefresh() (token string, err error)

刷新 authorizer_access_token

type AuthorizerInfo

type AuthorizerInfo struct {
	NickName        string `json:"nick_name"`
	HeadImage       string `json:"head_img"`
	ServiceTypeInfo struct {
		Id int64 `json:"id"`
	} `json:"service_type_info"`
	VerifyTypeInfo struct {
		Id int64 `json:"id"`
	} `json:"verify_type_info"`
	UserName string `json:"user_name"`
	Alias    string `json:"alias"`
}

type AuthorizerInfoEx

type AuthorizerInfoEx struct {
	AuthorizerInfo    AuthorizerInfo    `json:"authorizer_info"`
	QrCodeURL         string            `json:"qrcode_url"`
	AuthorizationInfo AuthorizationInfo `json:"authorization_info"`
}

type Client

type Client struct {
	AccessTokenServer
	AppId      string
	HttpClient *http.Client
}

func NewClient

func NewClient(appId string, srv AccessTokenServer, clt *http.Client) *Client

创建一个新的 Client.

如果 clt == nil 则默认用 http.DefaultClient

func (*Client) CreatePreAuthCode

func (clt *Client) CreatePreAuthCode() (code *PreAuthCode, err error)

获取预授权码.

func (*Client) GetAuthorizerInfo

func (clt *Client) GetAuthorizerInfo(authorizerAppId string) (info *AuthorizerInfoEx, err error)

获取授权方的账户信息.

func (*Client) GetAuthorizerOption

func (clt *Client) GetAuthorizerOption(authorizerAppId, optionName string) (optionValue string, err error)

获取授权方的选项设置信息.

func (*Client) GetJSON

func (clt *Client) GetJSON(incompleteURL string, response interface{}) (err error)

GET 微信资源, 然后将微信服务器返回的 JSON 用 encoding/json 解析到 response.

NOTE:
1. 一般不用调用这个方法, 请直接调用高层次的封装方法;
2. 最终的 URL == incompleteURL + component_access_token;
3. response 格式有要求, 要么是 *mp.Error, 要么是下面结构体的指针(注意 Error 必须是第一个 Field):
    struct {
        mp.Error
        ...
    }

func (*Client) PostJSON

func (clt *Client) PostJSON(incompleteURL string, request interface{}, response interface{}) (err error)

用 encoding/json 把 request marshal 为 JSON, 放入 http 请求的 body 中, POST 到微信服务器, 然后将微信服务器返回的 JSON 用 encoding/json 解析到 response.

NOTE:
1. 一般不用调用这个方法, 请直接调用高层次的封装方法;
2. 最终的 URL == incompleteURL + component_access_token;
3. response 格式有要求, 要么是 *mp.Error, 要么是下面结构体的指针(注意 Error 必须是第一个 Field):
    struct {
        mp.Error
        ...
    }

func (*Client) QueryAuth

func (clt *Client) QueryAuth(authCode string) (info *AuthorizationInfo, err error)

使用授权码换取公众号的授权信息.

func (*Client) SetAuthorizerOption

func (clt *Client) SetAuthorizerOption(authorizerAppId, optionName, optionValue string) (err error)

设置授权方的选项信息.

type DefaultAccessTokenServer

type DefaultAccessTokenServer struct {
	// contains filtered or unexported fields
}

AccessTokenServer 的简单实现.

NOTE:
1. 用于单进程环境.
2. 因为 DefaultAccessTokenServer 同时也是一个简单的中控服务器, 而不是仅仅实现 AccessTokenServer 接口,
   所以整个系统只能存在一个 DefaultAccessTokenServer 实例!

func NewDefaultAccessTokenServer

func NewDefaultAccessTokenServer(appId, appSecret string, ticketGetter VerifyTicketGetter, clt *http.Client) (srv *DefaultAccessTokenServer)

创建一个新的 DefaultAccessTokenServer.

如果 clt == nil 则默认使用 http.DefaultClient.

func (*DefaultAccessTokenServer) Tag7B36CB9FFE9911E48469A4DB30FED8E1

func (srv *DefaultAccessTokenServer) Tag7B36CB9FFE9911E48469A4DB30FED8E1()

func (*DefaultAccessTokenServer) Token

func (srv *DefaultAccessTokenServer) Token() (token string, err error)

func (*DefaultAccessTokenServer) TokenRefresh

func (srv *DefaultAccessTokenServer) TokenRefresh() (token string, err error)

type DefaultServer

type DefaultServer struct {
	// contains filtered or unexported fields
}

func NewDefaultServer

func NewDefaultServer(appId, token string, AESKey []byte, handler MessageHandler) (srv *DefaultServer)

func (*DefaultServer) AppId

func (srv *DefaultServer) AppId() string

func (*DefaultServer) CurrentAESKey

func (srv *DefaultServer) CurrentAESKey() (key [32]byte)

func (*DefaultServer) LastAESKey

func (srv *DefaultServer) LastAESKey() (key [32]byte, valid bool)

func (*DefaultServer) MessageHandler

func (srv *DefaultServer) MessageHandler() MessageHandler

func (*DefaultServer) Token

func (srv *DefaultServer) Token() string

func (*DefaultServer) UpdateAESKey

func (srv *DefaultServer) UpdateAESKey(aesKey []byte) (err error)

type Function

type Function struct {
	ScopeCategory struct {
		Id int64 `json:"id"`
	} `json:"funcscope_category"`
}

權限集

type MessageHandler

type MessageHandler interface {
	ServeMessage(http.ResponseWriter, *Request)
}

微信服务器推送过来的消息(事件)处理接口

type MessageHandlerFunc

type MessageHandlerFunc func(http.ResponseWriter, *Request)

func (MessageHandlerFunc) ServeMessage

func (fn MessageHandlerFunc) ServeMessage(w http.ResponseWriter, r *Request)

type MessageServeMux

type MessageServeMux struct {
	// contains filtered or unexported fields
}

MessageServeMux 实现了一个简单的消息(事件)路由器, 同时也是一个 MessageHandler 的实现.

func NewMessageServeMux

func NewMessageServeMux() *MessageServeMux

func (*MessageServeMux) DefaultMessageHandle

func (mux *MessageServeMux) DefaultMessageHandle(handler MessageHandler)

注册消息的默认 MessageHandler.

func (*MessageServeMux) DefaultMessageHandleFunc

func (mux *MessageServeMux) DefaultMessageHandleFunc(handler func(http.ResponseWriter, *Request))

注册消息的默认 MessageHandler.

func (*MessageServeMux) MessageHandle

func (mux *MessageServeMux) MessageHandle(msgType string, handler MessageHandler)

注册特定类型消息的 MessageHandler.

func (*MessageServeMux) MessageHandleFunc

func (mux *MessageServeMux) MessageHandleFunc(msgType string, handler func(http.ResponseWriter, *Request))

注册特定类型消息的 MessageHandler.

func (*MessageServeMux) ServeMessage

func (mux *MessageServeMux) ServeMessage(w http.ResponseWriter, r *Request)

MessageServeMux 实现了 MessageHandler 接口.

type MixedMessage

type MixedMessage struct {
	XMLName struct{} `xml:"xml" json:"-"`

	AppId      string `xml:"AppId"      json:"AppId"`
	CreateTime int64  `xml:"CreateTime" json:"CreateTime"`
	InfoType   string `xml:"InfoType"   json:"InfoType"`

	VerifyTicket    string `xml:"ComponentVerifyTicket" json:"ComponentVerifyTicket"`
	AuthorizerAppId string `xml:"AuthorizerAppid"       json:"AuthorizerAppid"`
}

微信服务器推送过来的消息(事件)的合集.

type PreAuthCode

type PreAuthCode struct {
	Value     string `json:"pre_auth_code"`
	ExpiresIn int64  `json:"expires_in"`
}

type Request

type Request struct {
	Token string // 请求消息所属第三方平台的 Token

	HttpRequest *http.Request // 可以为 nil, 因为某些 http 框架没有提供此参数
	QueryValues url.Values    // 回调请求 URL 中的查询参数集合

	MsgSignature string // 回调请求 URL 中的消息体签名: msg_signature
	EncryptType  string // 回调请求 URL 中的加密方式: encrypt_type
	Timestamp    int64  // 回调请求 URL 中的时间戳: timestamp
	Nonce        string // 回调请求 URL 中的随机数: nonce

	RawMsgXML []byte        // 消息的"明文"XML 文本
	MixedMsg  *MixedMessage // RawMsgXML 解析后的消息

	AESKey [32]byte // 当前消息 AES 加密的 key
	Random []byte   // 当前消息加密时所用的 random, 16 bytes
	AppId  string   // 当前消息的 AppId
}

消息(事件)请求信息

type RequestHttpBody

type RequestHttpBody struct {
	XMLName struct{} `xml:"xml" json:"-"`

	AppId        string `xml:"AppId"`
	EncryptedMsg string `xml:"Encrypt"`
}

微信服务器请求 http body

type Server

type Server interface {
	Token() string // 获取第三方平台的Token
	AppId() string // AppId, 用于约束消息的 AppId, 如果为空表示不约束

	CurrentAESKey() [32]byte                // 获取当前有效的 AES 加密 Key
	LastAESKey() (key [32]byte, valid bool) // 获取上一个有效的 AES 加密 Key

	MessageHandler() MessageHandler // 获取 MessageHandler
}

type ServerFrontend

type ServerFrontend struct {
	// contains filtered or unexported fields
}

func NewServerFrontend

func NewServerFrontend(server Server, handler mp.ErrorHandler, interceptor mp.Interceptor) *ServerFrontend

handler, interceptor 均可以为 nil

func (*ServerFrontend) ServeHTTP

func (frontend *ServerFrontend) ServeHTTP(w http.ResponseWriter, r *http.Request)

实现 http.Handler.

type UnauthorizedMessage

type UnauthorizedMessage struct {
	XMLName struct{} `xml:"xml" json:"-"`

	AppId      string `xml:"AppId"      json:"AppId"`
	CreateTime int64  `xml:"CreateTime" json:"CreateTime"`
	InfoType   string `xml:"InfoType"   json:"InfoType"`

	AuthorizerAppId string `xml:"AuthorizerAppid" json:"AuthorizerAppid"`
}

func GetUnauthorizedMessage

func GetUnauthorizedMessage(msg *MixedMessage) *UnauthorizedMessage

type VerifyTicketCache

type VerifyTicketCache struct {
	// contains filtered or unexported fields
}

func (*VerifyTicketCache) GetComponentVerifyTicket

func (cache *VerifyTicketCache) GetComponentVerifyTicket(appId string) (ticket string, err error)

func (*VerifyTicketCache) SetComponentVerifyTicket

func (cache *VerifyTicketCache) SetComponentVerifyTicket(appId string, ticket string) (err error)

func (*VerifyTicketCache) Tag9AEACC95FE9911E4B5A4A4DB30FED8E1

func (cache *VerifyTicketCache) Tag9AEACC95FE9911E4B5A4A4DB30FED8E1()

type VerifyTicketCache2

type VerifyTicketCache2 struct {
	// contains filtered or unexported fields
}

func NewVerifyTicketCache2

func NewVerifyTicketCache2() *VerifyTicketCache2

func (*VerifyTicketCache2) GetComponentVerifyTicket

func (cache *VerifyTicketCache2) GetComponentVerifyTicket(appId string) (ticket string, err error)

func (*VerifyTicketCache2) SetComponentVerifyTicket

func (cache *VerifyTicketCache2) SetComponentVerifyTicket(appId string, ticket string) (err error)

func (*VerifyTicketCache2) Tag9AEACC95FE9911E4B5A4A4DB30FED8E1

func (cache *VerifyTicketCache2) Tag9AEACC95FE9911E4B5A4A4DB30FED8E1()

type VerifyTicketGetter

type VerifyTicketGetter interface {
	// 根据 component_appid 获取第三方平台当前的 component_verify_ticket, 如果没有找到返回 ErrNotFound
	GetComponentVerifyTicket(appId string) (ticket string, err error)

	// 没有实际意义, 接口标识
	Tag9AEACC95FE9911E4B5A4A4DB30FED8E1()
}

component_verify_ticket 獲取接口

type VerifyTicketMessage

type VerifyTicketMessage struct {
	XMLName struct{} `xml:"xml" json:"-"`

	AppId      string `xml:"AppId"      json:"AppId"`
	CreateTime int64  `xml:"CreateTime" json:"CreateTime"`
	InfoType   string `xml:"InfoType"   json:"InfoType"`

	VerifyTicket string `xml:"ComponentVerifyTicket" json:"ComponentVerifyTicket"`
}

func GetVerifyTicketMessage

func GetVerifyTicketMessage(msg *MixedMessage) *VerifyTicketMessage

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL