server

package
v0.0.0-...-5f3fc38 Latest Latest
Warning

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

Go to latest
Published: Mar 22, 2015 License: Apache-2.0 Imports: 15 Imported by: 0

README

简介

封装微信服务器推送到回调 URL 的消息(事件)处理 Handler.

注意

server 提供了 AgentFrontend,MultiAgentFrontend

正常情况下使用 AgentFrontend 即可,即一个回调 URL 只能接受一个公众号的消息(事件), 如果需要处理多个公众号的消息(事件),可以调用 net/http.Handle 来动态增加 URL<-->AgentFrontend pair。

如果某些特殊情况下,给你的 URL 只有一个,但是你又想处理多个公众号的消息(事件),我们这里提供了 MultiAgentFrontend,这时公众号的回调 URL 就要增加一个查询参数 agentkey(根据需要你也可以 更改这个参数名称,如果更改了同时也要修改 URLQueryAgentKeyName 的值),这样回调 URL 的格式一般为

http://abc.xyz.com/weixin?agentkey=agentkey_value

MultiAgentFrontend 是并发安全的,可以动态增加(删除)Agent,如果你没有动态需求, 只是在初始化的时候配置各种参数,可以自己把 MultiAgentFrontend 里面的带有 rwmutex 的代码 都去掉,高并发没有锁的开销。

示例

package main

import (
	"github.com/chanxuehong/wechat/mp/message/passive/request"
	"github.com/chanxuehong/wechat/mp/message/passive/response"
	"github.com/chanxuehong/wechat/mp/server"
	"github.com/chanxuehong/wechat/util"
	"log"
	"net/http"
)

// 实现 server.Agent
type CustomAgent struct {
	server.DefaultAgent // 可选, 不是必须!!! 提供了默认实现
}

// 文本消息处理函数
func (this *CustomAgent) ServeTextMsg(w http.ResponseWriter, r *http.Request,
	msg *request.Text, rawXMLMsg []byte, timestamp int64) {

	// TODO: 示例代码, 把用户发送过来的文本原样回复过去

	w.Header().Set("Content-Type", "application/xml; charset=utf-8") // 可选

	// NOTE: 时间戳也可以用传入的参数 timestamp, 即微信服务器请求 URL 中的 timestamp,
	//       也可以自己生成: time.Now().Unix()
	resp := response.NewText(msg.FromUserName, msg.ToUserName, msg.Content, timestamp)

	if err := server.WriteText(w, resp); err != nil {
		// TODO: 错误处理代码
	}
}

// 自定义错误请求处理函数
func CustomInvalidRequestHandlerFunc(w http.ResponseWriter, r *http.Request, err error) {
	// TODO: 这里只是简单的做下 log
	log.Println(err)
}

func init() {
	AESKey, err := util.AESKeyDecode("EncodingAESKey") // 后台里获取
	if err != nil {
		panic(err)
	}

	var agent CustomAgent

	// Id 和 公众号设置-->帐号详情-->原始ID 相等
	// Token 和后台设置的一样
	// AppId 如果后台看不到可以随便设置一个, 然后在 InvalidRequestHandler 里能得到错误信息, have 后面的就是 AppId
	// AESKey 就是上面的 AESKey
	agent.DefaultAgent.Init("Id", "Token", "AppId", AESKey)

	agentFrontend := server.NewAgentFrontend(&agent,
		server.InvalidRequestHandlerFunc(CustomInvalidRequestHandlerFunc))

	// 注册这个 agentFrontend 到回调 URL 上
	// 比如你在公众平台后台注册的回调地址是 http://abc.xyz.com/weixin,那么可以这样注册
	http.Handle("/weixin", agentFrontend)
}

func main() {
	err := http.ListenAndServe(":80", nil)
	if err != nil {
		panic(err)
	}
}

Documentation

Overview

封装微信服务器推送过来的消息(事件)处理 Handler.

Index

Constants

View Source
const URLQueryAgentKeyName = "agentkey"

定义回调 URL 上指定 Agent 的查询参数名

Variables

This section is empty.

Functions

func ServeHTTP

func ServeHTTP(w http.ResponseWriter, r *http.Request,
	urlValues url.Values, agent Agent, invalidRequestHandler InvalidRequestHandler)

ServeHTTP 处理 http 消息请求

NOTE: 确保所有参数合法, r.Body 能正确读取数据

func WriteAESImage

func WriteAESImage(w io.Writer, msg *response.Image, timestamp int64, nonce string,
	AESKey [32]byte, random []byte, AppId, Token string) error

把 image 回复消息 msg 写入 writer w

func WriteAESMusic

func WriteAESMusic(w io.Writer, msg *response.Music, timestamp int64, nonce string,
	AESKey [32]byte, random []byte, AppId, Token string) error

把 music 回复消息 msg 写入 writer w

func WriteAESNews

func WriteAESNews(w io.Writer, msg *response.News, timestamp int64, nonce string,
	AESKey [32]byte, random []byte, AppId, Token string) (err error)

把 news 回复消息 msg 写入 writer w

func WriteAESText

func WriteAESText(w io.Writer, msg *response.Text, timestamp int64, nonce string,
	AESKey [32]byte, random []byte, AppId, Token string) error

把 text 回复消息 msg 写入 writer w

func WriteAESTransferToCustomerService

func WriteAESTransferToCustomerService(w io.Writer, msg *response.TransferToCustomerService,
	timestamp int64, nonce string, AESKey [32]byte, random []byte, AppId, Token string) error

把 TransferToCustomerService 回复消息 msg 写入 writer w

func WriteAESTransferToSpecialCustomerService

func WriteAESTransferToSpecialCustomerService(w io.Writer, msg *response.TransferToSpecialCustomerService,
	timestamp int64, nonce string, AESKey [32]byte, random []byte, AppId, Token string) error

把 TransferToSpecialCustomerService 回复消息 msg 写入 writer w

func WriteAESVideo

func WriteAESVideo(w io.Writer, msg *response.Video, timestamp int64, nonce string,
	AESKey [32]byte, random []byte, AppId, Token string) error

把 video 回复消息 msg 写入 writer w

func WriteAESVoice

func WriteAESVoice(w io.Writer, msg *response.Voice, timestamp int64, nonce string,
	AESKey [32]byte, random []byte, AppId, Token string) error

把 voice 回复消息 msg 写入 writer w

func WriteImage

func WriteImage(w io.Writer, msg *response.Image) error

把 image 回复消息 msg 写入 writer w

func WriteMusic

func WriteMusic(w io.Writer, msg *response.Music) error

把 music 回复消息 msg 写入 writer w

func WriteNews

func WriteNews(w io.Writer, msg *response.News) (err error)

把 news 回复消息 msg 写入 writer w

func WriteText

func WriteText(w io.Writer, msg *response.Text) error

把 text 回复消息 msg 写入 writer w

func WriteTransferToCustomerService

func WriteTransferToCustomerService(w io.Writer, msg *response.TransferToCustomerService) error

把 TransferToCustomerService 回复消息 msg 写入 writer w

func WriteTransferToSpecialCustomerService

func WriteTransferToSpecialCustomerService(w io.Writer, msg *response.TransferToSpecialCustomerService) error

把 TransferToSpecialCustomerService 回复消息 msg 写入 writer w

func WriteVideo

func WriteVideo(w io.Writer, msg *response.Video) error

把 video 回复消息 msg 写入 writer w

func WriteVoice

func WriteVoice(w io.Writer, msg *response.Voice) error

把 voice 回复消息 msg 写入 writer w

Types

type Agent

type Agent interface {
	GetId() string    // 获取公众号的原始ID, 等于后台中的 公众号设置-->帐号详情-->原始ID
	GetToken() string // 获取公众号的Token, 和后台中的设置相等

	// fuck, AppId 貌似需要认证才会有的???
	// 如果不知道自己的 AppId 是多少, 可以先随便填入一个字符串,
	// 这样正常情况下会出现 AppId mismatch 错误, 错误中 have 后面的就是正确的 AppId
	GetAppId() string
	GetLastAESKey() [32]byte    // 获取最后一个有效的 AES 加密 Key
	GetCurrentAESKey() [32]byte // 获取当前有效的 AES 加密 Key

	// 明文模式 需要实现的方法
	// 未知类型的消息处理方法
	//  rawXMLMsg 是 xml 消息体
	//  timestamp 是请求 URL 中的时间戳
	//  r *http.Request 的 Body 已经读取过了, 不要再读取了, 但是可以获取其他信息, 比如 r.URL.RawQuery
	ServeUnknownMsg(w http.ResponseWriter, r *http.Request, rawXMLMsg []byte, timestamp int64)

	// 明文模式 需要实现的方法
	// 消息处理函数
	//  msg 是成功解析的消息结构体
	//  rawXMLMsg 是 msg 的 xml 消息体
	//  timestamp 是请求 URL 中的时间戳
	//  r *http.Request 的 Body 已经读取过了, 不要再读取了, 但是可以获取其他信息, 比如 r.URL.RawQuery
	ServeTextMsg(w http.ResponseWriter, r *http.Request, msg *request.Text, rawXMLMsg []byte, timestamp int64)
	ServeImageMsg(w http.ResponseWriter, r *http.Request, msg *request.Image, rawXMLMsg []byte, timestamp int64)
	ServeVoiceMsg(w http.ResponseWriter, r *http.Request, msg *request.Voice, rawXMLMsg []byte, timestamp int64)
	ServeVideoMsg(w http.ResponseWriter, r *http.Request, msg *request.Video, rawXMLMsg []byte, timestamp int64)
	ServeLocationMsg(w http.ResponseWriter, r *http.Request, msg *request.Location, rawXMLMsg []byte, timestamp int64)
	ServeLinkMsg(w http.ResponseWriter, r *http.Request, msg *request.Link, rawXMLMsg []byte, timestamp int64)

	// 明文模式 需要实现的方法
	// 事件处理函数
	//  event 是成功解析的消息结构体
	//  rawXMLMsg 是 event 的 xml 消息体
	//  timestamp 是请求 URL 中的时间戳
	//  r *http.Request 的 Body 已经读取过了, 不要再读取了, 但是可以获取其他信息, 比如 r.URL.RawQuery
	ServeSubscribeEvent(w http.ResponseWriter, r *http.Request, event *request.SubscribeEvent, rawXMLMsg []byte, timestamp int64)
	ServeUnsubscribeEvent(w http.ResponseWriter, r *http.Request, event *request.UnsubscribeEvent, rawXMLMsg []byte, timestamp int64)
	ServeSubscribeByScanEvent(w http.ResponseWriter, r *http.Request, event *request.SubscribeByScanEvent, rawXMLMsg []byte, timestamp int64)
	ServeScanEvent(w http.ResponseWriter, r *http.Request, event *request.ScanEvent, rawXMLMsg []byte, timestamp int64)
	ServeLocationEvent(w http.ResponseWriter, r *http.Request, event *request.LocationEvent, rawXMLMsg []byte, timestamp int64)
	ServeMenuClickEvent(w http.ResponseWriter, r *http.Request, event *request.MenuClickEvent, rawXMLMsg []byte, timestamp int64)
	ServeMenuViewEvent(w http.ResponseWriter, r *http.Request, event *request.MenuViewEvent, rawXMLMsg []byte, timestamp int64)
	ServeMenuScanCodePushEvent(w http.ResponseWriter, r *http.Request, event *request.MenuScanCodePushEvent, rawXMLMsg []byte, timestamp int64)
	ServeMenuScanCodeWaitMsgEvent(w http.ResponseWriter, r *http.Request, event *request.MenuScanCodeWaitMsgEvent, rawXMLMsg []byte, timestamp int64)
	ServeMenuPicSysPhotoEvent(w http.ResponseWriter, r *http.Request, event *request.MenuPicSysPhotoEvent, rawXMLMsg []byte, timestamp int64)
	ServeMenuPicPhotoOrAlbumEvent(w http.ResponseWriter, r *http.Request, event *request.MenuPicPhotoOrAlbumEvent, rawXMLMsg []byte, timestamp int64)
	ServeMenuPicWeixinEvent(w http.ResponseWriter, r *http.Request, event *request.MenuPicWeixinEvent, rawXMLMsg []byte, timestamp int64)
	ServeMenuLocationSelectEvent(w http.ResponseWriter, r *http.Request, event *request.MenuLocationSelectEvent, rawXMLMsg []byte, timestamp int64)
	ServeMassSendJobFinishEvent(w http.ResponseWriter, r *http.Request, event *request.MassSendJobFinishEvent, rawXMLMsg []byte, timestamp int64)
	ServeTemplateSendJobFinishEvent(w http.ResponseWriter, r *http.Request, event *request.TemplateSendJobFinishEvent, rawXMLMsg []byte, timestamp int64)
	ServeMerchantOrderEvent(w http.ResponseWriter, r *http.Request, event *request.MerchantOrderEvent, rawXMLMsg []byte, timestamp int64)

	// 兼容模式, 安全模式 需要实现的方法
	// 未知类型的消息处理方法
	//  rawXMLMsg   是解密后的"明文" xml 消息体
	//  timestamp   是请求 URL 中的时间戳
	//  nonce       是请求 URL 中的随机数
	//  AESKey      是微信"当前"消息加密所用的 AES key
	//  random      是请求 http body 中的密文消息加密时所用的 random, 16 bytes
	//  r *http.Request 的 Body 已经读取过了, 不要再读取了, 但是可以获取其他信息, 比如 r.URL.RawQuery
	ServeAESUnknownMsg(w http.ResponseWriter, r *http.Request, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

	// 兼容模式, 安全模式 需要实现的方法
	// 消息处理函数
	//  msg 是成功解析的消息结构体
	//  rawXMLMsg   是解密后的"明文" xml 消息体
	//  timestamp   是请求 URL 中的时间戳
	//  nonce       是请求 URL 中的随机数
	//  AESKey      是微信"当前"消息加密所用的 AES key
	//  random      是请求 http body 中的密文消息加密时所用的 random, 16 bytes
	//  r *http.Request 的 Body 已经读取过了, 不要再读取了, 但是可以获取其他信息, 比如 r.URL.RawQuery
	ServeAESTextMsg(w http.ResponseWriter, r *http.Request, msg *request.Text, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESImageMsg(w http.ResponseWriter, r *http.Request, msg *request.Image, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESVoiceMsg(w http.ResponseWriter, r *http.Request, msg *request.Voice, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESVideoMsg(w http.ResponseWriter, r *http.Request, msg *request.Video, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESLocationMsg(w http.ResponseWriter, r *http.Request, msg *request.Location, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESLinkMsg(w http.ResponseWriter, r *http.Request, msg *request.Link, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

	// 兼容模式, 安全模式 需要实现的方法
	// 事件处理函数
	//  event 是成功解析的消息结构体
	//  rawXMLMsg   是解密后的"明文" xml 消息体
	//  timestamp   是请求 URL 中的时间戳
	//  nonce       是请求 URL 中的随机数
	//  AESKey      是微信"当前"消息加密所用的 AES key
	//  random      是请求 http body 中的密文消息加密时所用的 random, 16 bytes
	//  r *http.Request 的 Body 已经读取过了, 不要再读取了, 但是可以获取其他信息, 比如 r.URL.RawQuery
	ServeAESSubscribeEvent(w http.ResponseWriter, r *http.Request, event *request.SubscribeEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESUnsubscribeEvent(w http.ResponseWriter, r *http.Request, event *request.UnsubscribeEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESSubscribeByScanEvent(w http.ResponseWriter, r *http.Request, event *request.SubscribeByScanEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESScanEvent(w http.ResponseWriter, r *http.Request, event *request.ScanEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESLocationEvent(w http.ResponseWriter, r *http.Request, event *request.LocationEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESMenuClickEvent(w http.ResponseWriter, r *http.Request, event *request.MenuClickEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESMenuViewEvent(w http.ResponseWriter, r *http.Request, event *request.MenuViewEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESMenuScanCodePushEvent(w http.ResponseWriter, r *http.Request, event *request.MenuScanCodePushEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESMenuScanCodeWaitMsgEvent(w http.ResponseWriter, r *http.Request, event *request.MenuScanCodeWaitMsgEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESMenuPicSysPhotoEvent(w http.ResponseWriter, r *http.Request, event *request.MenuPicSysPhotoEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESMenuPicPhotoOrAlbumEvent(w http.ResponseWriter, r *http.Request, event *request.MenuPicPhotoOrAlbumEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESMenuPicWeixinEvent(w http.ResponseWriter, r *http.Request, event *request.MenuPicWeixinEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESMenuLocationSelectEvent(w http.ResponseWriter, r *http.Request, event *request.MenuLocationSelectEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESMassSendJobFinishEvent(w http.ResponseWriter, r *http.Request, event *request.MassSendJobFinishEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESTemplateSendJobFinishEvent(w http.ResponseWriter, r *http.Request, event *request.TemplateSendJobFinishEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
	ServeAESMerchantOrderEvent(w http.ResponseWriter, r *http.Request, event *request.MerchantOrderEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)
}

公众号对外暴露的接口

type AgentFrontend

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

Agent 的前端, 负责处理 http 请求, net/http.Handler 的实现

NOTE: 只能处理一个公众号的消息

func NewAgentFrontend

func NewAgentFrontend(agent Agent, invalidRequestHandler InvalidRequestHandler) *AgentFrontend

创建一个新的 AgentFrontend.

agent 不能为 nil, 如果 invalidRequestHandler == nil 则使用 DefaultInvalidRequestHandler

func (*AgentFrontend) ServeHTTP

func (this *AgentFrontend) ServeHTTP(w http.ResponseWriter, r *http.Request)

type DefaultAgent

type DefaultAgent struct {
	RWMutex       sync.RWMutex
	Id            string   // 公众号原始ID, 等于后台中的 公众号设置-->帐号详情-->原始ID
	Token         string   // 公众号的 Token, 和后台中的设置相等
	AppId         string   // 貌似需要认证才会有的???
	LastAESKey    [32]byte // 最后一个 AES Key
	CurrentAESKey [32]byte // 当前的 AES Key
}

func (*DefaultAgent) GetAppId

func (this *DefaultAgent) GetAppId() string

func (*DefaultAgent) GetCurrentAESKey

func (this *DefaultAgent) GetCurrentAESKey() (key [32]byte)

func (*DefaultAgent) GetId

func (this *DefaultAgent) GetId() string

func (*DefaultAgent) GetLastAESKey

func (this *DefaultAgent) GetLastAESKey() (key [32]byte)

func (*DefaultAgent) GetToken

func (this *DefaultAgent) GetToken() string

func (*DefaultAgent) Init

func (this *DefaultAgent) Init(Id, Token, AppId string, AESKey []byte)

初始化 DefaultAgent

如果不知道自己的 AppId 是多少, 可以先随便填入一个字符串,
这样正常情况下会出现 AppId mismatch 错误, 错误中 have 后面的就是正确的 AppId

func (*DefaultAgent) ServeAESImageMsg

func (this *DefaultAgent) ServeAESImageMsg(w http.ResponseWriter, r *http.Request, msg *request.Image, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESLinkMsg

func (this *DefaultAgent) ServeAESLinkMsg(w http.ResponseWriter, r *http.Request, msg *request.Link, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESLocationEvent

func (this *DefaultAgent) ServeAESLocationEvent(w http.ResponseWriter, r *http.Request, msg *request.LocationEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESLocationMsg

func (this *DefaultAgent) ServeAESLocationMsg(w http.ResponseWriter, r *http.Request, msg *request.Location, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESMassSendJobFinishEvent

func (this *DefaultAgent) ServeAESMassSendJobFinishEvent(w http.ResponseWriter, r *http.Request, msg *request.MassSendJobFinishEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESMenuClickEvent

func (this *DefaultAgent) ServeAESMenuClickEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuClickEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESMenuLocationSelectEvent

func (this *DefaultAgent) ServeAESMenuLocationSelectEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuLocationSelectEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESMenuPicPhotoOrAlbumEvent

func (this *DefaultAgent) ServeAESMenuPicPhotoOrAlbumEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuPicPhotoOrAlbumEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESMenuPicSysPhotoEvent

func (this *DefaultAgent) ServeAESMenuPicSysPhotoEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuPicSysPhotoEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESMenuPicWeixinEvent

func (this *DefaultAgent) ServeAESMenuPicWeixinEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuPicWeixinEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESMenuScanCodePushEvent

func (this *DefaultAgent) ServeAESMenuScanCodePushEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuScanCodePushEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESMenuScanCodeWaitMsgEvent

func (this *DefaultAgent) ServeAESMenuScanCodeWaitMsgEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuScanCodeWaitMsgEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESMenuViewEvent

func (this *DefaultAgent) ServeAESMenuViewEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuViewEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESMerchantOrderEvent

func (this *DefaultAgent) ServeAESMerchantOrderEvent(w http.ResponseWriter, r *http.Request, msg *request.MerchantOrderEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESScanEvent

func (this *DefaultAgent) ServeAESScanEvent(w http.ResponseWriter, r *http.Request, msg *request.ScanEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESSubscribeByScanEvent

func (this *DefaultAgent) ServeAESSubscribeByScanEvent(w http.ResponseWriter, r *http.Request, msg *request.SubscribeByScanEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESSubscribeEvent

func (this *DefaultAgent) ServeAESSubscribeEvent(w http.ResponseWriter, r *http.Request, msg *request.SubscribeEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESTemplateSendJobFinishEvent

func (this *DefaultAgent) ServeAESTemplateSendJobFinishEvent(w http.ResponseWriter, r *http.Request, msg *request.TemplateSendJobFinishEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESTextMsg

func (this *DefaultAgent) ServeAESTextMsg(w http.ResponseWriter, r *http.Request, msg *request.Text, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESUnknownMsg

func (this *DefaultAgent) ServeAESUnknownMsg(w http.ResponseWriter, r *http.Request, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESUnsubscribeEvent

func (this *DefaultAgent) ServeAESUnsubscribeEvent(w http.ResponseWriter, r *http.Request, msg *request.UnsubscribeEvent, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESVideoMsg

func (this *DefaultAgent) ServeAESVideoMsg(w http.ResponseWriter, r *http.Request, msg *request.Video, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeAESVoiceMsg

func (this *DefaultAgent) ServeAESVoiceMsg(w http.ResponseWriter, r *http.Request, msg *request.Voice, rawXMLMsg []byte, timestamp int64, nonce string, AESKey [32]byte, random []byte)

func (*DefaultAgent) ServeImageMsg

func (this *DefaultAgent) ServeImageMsg(w http.ResponseWriter, r *http.Request, msg *request.Image, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeLinkMsg

func (this *DefaultAgent) ServeLinkMsg(w http.ResponseWriter, r *http.Request, msg *request.Link, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeLocationEvent

func (this *DefaultAgent) ServeLocationEvent(w http.ResponseWriter, r *http.Request, msg *request.LocationEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeLocationMsg

func (this *DefaultAgent) ServeLocationMsg(w http.ResponseWriter, r *http.Request, msg *request.Location, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeMassSendJobFinishEvent

func (this *DefaultAgent) ServeMassSendJobFinishEvent(w http.ResponseWriter, r *http.Request, msg *request.MassSendJobFinishEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeMenuClickEvent

func (this *DefaultAgent) ServeMenuClickEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuClickEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeMenuLocationSelectEvent

func (this *DefaultAgent) ServeMenuLocationSelectEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuLocationSelectEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeMenuPicPhotoOrAlbumEvent

func (this *DefaultAgent) ServeMenuPicPhotoOrAlbumEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuPicPhotoOrAlbumEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeMenuPicSysPhotoEvent

func (this *DefaultAgent) ServeMenuPicSysPhotoEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuPicSysPhotoEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeMenuPicWeixinEvent

func (this *DefaultAgent) ServeMenuPicWeixinEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuPicWeixinEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeMenuScanCodePushEvent

func (this *DefaultAgent) ServeMenuScanCodePushEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuScanCodePushEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeMenuScanCodeWaitMsgEvent

func (this *DefaultAgent) ServeMenuScanCodeWaitMsgEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuScanCodeWaitMsgEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeMenuViewEvent

func (this *DefaultAgent) ServeMenuViewEvent(w http.ResponseWriter, r *http.Request, msg *request.MenuViewEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeMerchantOrderEvent

func (this *DefaultAgent) ServeMerchantOrderEvent(w http.ResponseWriter, r *http.Request, msg *request.MerchantOrderEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeScanEvent

func (this *DefaultAgent) ServeScanEvent(w http.ResponseWriter, r *http.Request, msg *request.ScanEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeSubscribeByScanEvent

func (this *DefaultAgent) ServeSubscribeByScanEvent(w http.ResponseWriter, r *http.Request, msg *request.SubscribeByScanEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeSubscribeEvent

func (this *DefaultAgent) ServeSubscribeEvent(w http.ResponseWriter, r *http.Request, msg *request.SubscribeEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeTemplateSendJobFinishEvent

func (this *DefaultAgent) ServeTemplateSendJobFinishEvent(w http.ResponseWriter, r *http.Request, msg *request.TemplateSendJobFinishEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeTextMsg

func (this *DefaultAgent) ServeTextMsg(w http.ResponseWriter, r *http.Request, msg *request.Text, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeUnknownMsg

func (this *DefaultAgent) ServeUnknownMsg(w http.ResponseWriter, r *http.Request, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeUnsubscribeEvent

func (this *DefaultAgent) ServeUnsubscribeEvent(w http.ResponseWriter, r *http.Request, msg *request.UnsubscribeEvent, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeVideoMsg

func (this *DefaultAgent) ServeVideoMsg(w http.ResponseWriter, r *http.Request, msg *request.Video, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) ServeVoiceMsg

func (this *DefaultAgent) ServeVoiceMsg(w http.ResponseWriter, r *http.Request, msg *request.Voice, rawXMLMsg []byte, timestamp int64)

func (*DefaultAgent) UpdateAESKey

func (this *DefaultAgent) UpdateAESKey(AESKey [32]byte)

type InvalidRequestHandler

type InvalidRequestHandler interface {
	// 非法请求的处理方法, err 是错误信息
	ServeInvalidRequest(w http.ResponseWriter, r *http.Request, err error)
}
var DefaultInvalidRequestHandler InvalidRequestHandler = InvalidRequestHandlerFunc(func(w http.ResponseWriter, r *http.Request, err error) {})

type InvalidRequestHandlerFunc

type InvalidRequestHandlerFunc func(w http.ResponseWriter, r *http.Request, err error)

func (InvalidRequestHandlerFunc) ServeInvalidRequest

func (fn InvalidRequestHandlerFunc) ServeInvalidRequest(w http.ResponseWriter, r *http.Request, err error)

type MultiAgentFrontend

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

多个 Agent 的前端, 负责处理 http 请求, net/http.Handler 的实现

NOTE:
MultiAgentFrontend 可以处理多个公众号的消息(事件),但是要求在回调 URL 上加上一个查询
参数,一般为 agentkey(参考常量 URLQueryAgentKeyName),这个参数的值就是 MultiAgentFrontend
索引 Agent 的 key。
例如回调 URL 为 http://www.xxx.com/weixin?agentkey=1234567890,那么就可以在后端调用

  MultiAgentFrontend.SetAgent("1234567890", agent)

来增加一个 Agent 来处理 agentkey=1234567890 的消息(事件)。

MultiAgentFrontend 并发安全,可以在运行中动态增加和删除 Agent。

func (*MultiAgentFrontend) DeleteAgent

func (this *MultiAgentFrontend) DeleteAgent(agentkey string)

删除 agentkey 对应的 Agent

func (*MultiAgentFrontend) DeleteAllAgent

func (this *MultiAgentFrontend) DeleteAllAgent()

删除所有的 Agent

func (*MultiAgentFrontend) ServeHTTP

func (this *MultiAgentFrontend) ServeHTTP(w http.ResponseWriter, r *http.Request)

func (*MultiAgentFrontend) SetAgent

func (this *MultiAgentFrontend) SetAgent(agentkey string, agent Agent)

添加(设置) agentkey-agent pair, 如果 agent == nil 则不做任何操作

func (*MultiAgentFrontend) SetInvalidRequestHandler

func (this *MultiAgentFrontend) SetInvalidRequestHandler(handler InvalidRequestHandler)

设置 InvalidRequestHandler, 如果 handler == nil 则使用默认的 DefaultInvalidRequestHandler

Directories

Path Synopsis
定义微信支付相关 Handler, 微信支付接口 V2.x
定义微信支付相关 Handler, 微信支付接口 V2.x
定义微信支付相关 Handler, 微信支付接口 V3.x
定义微信支付相关 Handler, 微信支付接口 V3.x

Jump to

Keyboard shortcuts

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