component

package
v0.0.0-...-7011273 Latest Latest
Warning

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

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

Documentation

Overview

公众号第三方平台接口

Index

Constants

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

Variables

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

Functions

func AuthCodeURL

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

请求用户授权时跳转的地址.

func ServeHTTP

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

ServeHTTP 处理 http 消息请求

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

Types

type AccessTokenServer

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

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

component_access_token 中控服务器接口.

type AuthorizerAccessTokenInfo

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

type Client

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

func NewClient

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

创建一个新的 Client.

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

func (*Client) CreatePreAuthCode

func (clt *Client) CreatePreAuthCode() (code *PreAuthCode, 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
        ...
    }

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) Token

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

func (*DefaultAccessTokenServer) TokenRefresh

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

type DefaultAuthorizerAccessTokenServer

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

mp.AccessTokenServer 的简单实现.

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

func NewDefaultAuthorizerAccessTokenServer

func NewDefaultAuthorizerAccessTokenServer(clt *Client, authorizerAppId, authorizerRefreshToken string) (srv *DefaultAuthorizerAccessTokenServer)

创建一个新的 DefaultAuthorizerAccessTokenServer.

func (*DefaultAuthorizerAccessTokenServer) Token

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

獲取 authorizer_access_token

func (*DefaultAuthorizerAccessTokenServer) TokenRefresh

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

刷新 authorizer_access_token

type DefaultServer

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

func NewDefaultServer

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

NewDefaultServer 创建一个新的 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)

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 MessageHandler

type MessageHandler interface {
	ServeMessage(w http.ResponseWriter, r *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))

注册 MessageHandlerFunc, 处理未知类型的消息.

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))

注册 MessageHandlerFunc, 处理特定类型的消息.

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:"VerifyTicket" json:"VerifyTicket"`
	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 {
	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 // 请求消息所属第三方平台的 ID
	Token string // 请求消息所属第三方平台的 Token
}

消息(事件)请求信息

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 {
	AppId() string // 获取第三方平台AppId
	Token() string // 获取第三方平台的Token

	CurrentAESKey() [32]byte // 获取当前有效的 AES 加密 Key
	LastAESKey() [32]byte    // 获取最后一个有效的 AES 加密 Key

	MessageHandler() MessageHandler // 获取 MessageHandler
}

type ServerFrontend

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

实现了 http.Handler.

func NewServerFrontend

func NewServerFrontend(server Server, handler mp.InvalidRequestHandler) *ServerFrontend

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) GetVerifyTicket

func (cache *VerifyTicketCache) GetVerifyTicket(appId string) (verifyTicket string, err error)

func (*VerifyTicketCache) SetVerifyTicket

func (cache *VerifyTicketCache) SetVerifyTicket(appId, verifyTicket string) (err error)

type VerifyTicketCache2

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

func NewVerifyTicketCache2

func NewVerifyTicketCache2() *VerifyTicketCache2

func (*VerifyTicketCache2) GetVerifyTicket

func (cache *VerifyTicketCache2) GetVerifyTicket(appId string) (verifyTicket string, err error)

func (*VerifyTicketCache2) SetVerifyTicket

func (cache *VerifyTicketCache2) SetVerifyTicket(appId, verifyTicket string) (err error)

type VerifyTicketGetter

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

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:"VerifyTicket" json:"VerifyTicket"`
}

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