Ver Fonte

重构了msgHandler

yaotian há 8 anos atrás
pai
commit
84fe533e14
5 ficheiros alterados com 42 adições e 45 exclusões
  1. 4 4
      examples/beego/beego.go
  2. 4 4
      examples/gin/gin.go
  3. 4 4
      examples/http/http.go
  4. 3 3
      mp.go
  5. 27 30
      mp/bridge/server.go

+ 4 - 4
examples/beego/beego.go

@@ -26,9 +26,9 @@ func hello(ctx *context.Context) {
 	}
 
 	// 传入request和responseWriter
-	server := mp.GetMsgServer(ctx.Request, ctx.ResponseWriter)
+	msgHandler := mp.GetMsgHandler(ctx.Request, ctx.ResponseWriter)
 	//设置接收消息的处理方法
-	server.SetMessageHandler(func(msg message.MixMessage) *message.Reply {
+	msgHandler.SetHandleMessageFunc(func(msg message.MixMessage) *message.Reply {
 
 		//回复消息:演示回复用户发送的消息
 		text := message.NewText(msg.Content)
@@ -36,13 +36,13 @@ func hello(ctx *context.Context) {
 	})
 
 	//处理消息接收以及回复
-	err = server.Serve()
+	err = msgHandler.Handle()
 	if err != nil {
 		fmt.Println(err)
 		return
 	}
 	//发送回复的消息
-	server.Send()
+	msgHandler.Send()
 }
 
 func main() {

+ 4 - 4
examples/gin/gin.go

@@ -33,9 +33,9 @@ func hello(c *gin.Context) {
 	}
 
 	// 传入request和responseWriter
-	server := mp.GetMsgServer(c.Request, c.Writer)
+	msgHandler := mp.GetMsgHandler(c.Request, c.Writer)
 	//设置接收消息的处理方法
-	server.SetMessageHandler(func(msg message.MixMessage) *message.Reply {
+	msgHandler.SetHandleMessageFunc(func(msg message.MixMessage) *message.Reply {
 
 		//回复消息:演示回复用户发送的消息
 		text := message.NewText(msg.Content)
@@ -43,11 +43,11 @@ func hello(c *gin.Context) {
 	})
 
 	//处理消息接收以及回复
-	err = server.Serve()
+	err = msgHandler.Handle()
 	if err != nil {
 		fmt.Println(err)
 		return
 	}
 	//发送回复的消息
-	server.Send()
+	msgHandler.Send()
 }

+ 4 - 4
examples/http/http.go

@@ -26,9 +26,9 @@ func hello(rw http.ResponseWriter, req *http.Request) {
 	}
 
 	// 传入request和responseWriter
-	server := mp.GetMsgServer(req, rw)
+	msgHandler := mp.GetMsgHandler(req, rw)
 	//设置接收消息的处理方法
-	server.SetMessageHandler(func(msg message.MixMessage) *message.Reply {
+	msgHandler.SetHandleMessageFunc(func(msg message.MixMessage) *message.Reply {
 
 		//回复消息:演示回复用户发送的消息
 		text := message.NewText(msg.Content)
@@ -36,13 +36,13 @@ func hello(rw http.ResponseWriter, req *http.Request) {
 	})
 
 	//处理消息接收以及回复
-	err = server.Serve()
+	err = msgHandler.Handle()
 	if err != nil {
 		fmt.Println(err)
 		return
 	}
 	//发送回复的消息
-	server.Send()
+	msgHandler.Send()
 }
 
 func main() {

+ 3 - 3
mp.go

@@ -54,9 +54,9 @@ func (c *MpMgr) GetTemplate() *template.Template {
 	return template.NewTemplate(c.Context)
 }
 
-// GetMsgServer 消息管理
-func (c *MpMgr) GetMsgServer(req *http.Request, writer http.ResponseWriter) *bridge.Server {
+// GetMsgHandler 消息管理
+func (c *MpMgr) GetMsgHandler(req *http.Request, writer http.ResponseWriter) *bridge.MsgHandler {
 	c.Context.Request = req
 	c.Context.Writer = writer
-	return bridge.NewServer(c.Context)
+	return bridge.NewMsgHandler(c.Context)
 }

+ 27 - 30
mp/bridge/server.go

@@ -15,13 +15,11 @@ import (
 	"github.com/yaotian/gowechat/wxcontext"
 )
 
-//Server struct
-type Server struct {
+//MsgHandler struct
+type MsgHandler struct {
 	*wxcontext.Context
 
-	openID string
-
-	messageHandler func(message.MixMessage) *message.Reply
+	handleMessageFunc func(message.MixMessage) *message.Reply
 
 	requestRawXMLMsg  []byte
 	requestMsg        message.MixMessage
@@ -34,15 +32,17 @@ type Server struct {
 	timestamp  int64
 }
 
-//NewServer init
-func NewServer(context *wxcontext.Context) *Server {
-	srv := new(Server)
+//NewMsgHandler init
+func NewMsgHandler(context *wxcontext.Context) *MsgHandler {
+	srv := new(MsgHandler)
 	srv.Context = context
 	return srv
 }
 
-//Serve 处理微信的请求消息
-func (srv *Server) Serve() error {
+//Handle 处理微信的请求消息
+func (srv *MsgHandler) Handle() error {
+	//Request is GET
+	//微信公众平台,设置服务器后保存,会调用此方法来做验证
 	if strings.ToLower(srv.Context.Request.Method) == "get" {
 		if !srv.Validate() {
 			return fmt.Errorf("请求校验失败")
@@ -50,11 +50,13 @@ func (srv *Server) Serve() error {
 
 		echostr, exists := srv.GetQuery("echostr")
 		if exists {
-			srv.String(echostr)
+			srv.String(echostr) //微信公众平台需要将此值发送回去,来完成验证
 		}
 		return nil
 	}
 
+	//Request is POST
+	//微信公众平台将消息post到服务器上
 	if strings.ToLower(srv.Context.Request.Method) == "post" {
 		replyMsg, err := srv.handleRequest()
 		if err != nil {
@@ -62,13 +64,16 @@ func (srv *Server) Serve() error {
 		}
 		//debug
 		//fmt.Println("request msg = ", string(srv.requestRawXMLMsg))
-		return srv.buildResponse(replyMsg)
+		err = srv.buildResponse(replyMsg)
+		if err == nil {
+			srv.Send()
+		}
 	}
 	return nil
 }
 
 //Validate 校验请求是否合法
-func (srv *Server) Validate() bool {
+func (srv *MsgHandler) Validate() bool {
 	timestamp := srv.Query("timestamp")
 	nonce := srv.Query("nonce")
 	signature := srv.Query("signature")
@@ -76,7 +81,7 @@ func (srv *Server) Validate() bool {
 }
 
 //HandleRequest 处理微信的请求
-func (srv *Server) handleRequest() (reply *message.Reply, err error) {
+func (srv *MsgHandler) handleRequest() (reply *message.Reply, err error) {
 	//set isSafeMode
 	srv.isSafeMode = false
 	encryptType := srv.Query("encrypt_type")
@@ -84,9 +89,6 @@ func (srv *Server) handleRequest() (reply *message.Reply, err error) {
 		srv.isSafeMode = true
 	}
 
-	//set openID
-	srv.openID = srv.Query("openid")
-
 	var msg interface{}
 	msg, err = srv.getMessage()
 	if err != nil {
@@ -97,17 +99,12 @@ func (srv *Server) handleRequest() (reply *message.Reply, err error) {
 		err = errors.New("消息类型转换失败")
 	}
 	srv.requestMsg = mixMessage
-	reply = srv.messageHandler(mixMessage)
+	reply = srv.handleMessageFunc(mixMessage)
 	return
 }
 
-//GetOpenID return openID
-func (srv *Server) GetOpenID() string {
-	return srv.openID
-}
-
 //getMessage 解析微信返回的消息
-func (srv *Server) getMessage() (interface{}, error) {
+func (srv *MsgHandler) getMessage() (interface{}, error) {
 	var rawXMLMsgBytes []byte
 	var err error
 	if srv.isSafeMode {
@@ -147,18 +144,18 @@ func (srv *Server) getMessage() (interface{}, error) {
 	return srv.parseRequestMessage(rawXMLMsgBytes)
 }
 
-func (srv *Server) parseRequestMessage(rawXMLMsgBytes []byte) (msg message.MixMessage, err error) {
+func (srv *MsgHandler) parseRequestMessage(rawXMLMsgBytes []byte) (msg message.MixMessage, err error) {
 	msg = message.MixMessage{}
 	err = xml.Unmarshal(rawXMLMsgBytes, &msg)
 	return
 }
 
-//SetMessageHandler 设置用户自定义的回调方法
-func (srv *Server) SetMessageHandler(handler func(message.MixMessage) *message.Reply) {
-	srv.messageHandler = handler
+//SetHandleMessageFunc 设置用户自定义的回调方法
+func (srv *MsgHandler) SetHandleMessageFunc(handler func(message.MixMessage) *message.Reply) {
+	srv.handleMessageFunc = handler
 }
 
-func (srv *Server) buildResponse(reply *message.Reply) (err error) {
+func (srv *MsgHandler) buildResponse(reply *message.Reply) (err error) {
 	defer func() {
 		if e := recover(); e != nil {
 			err = fmt.Errorf("panic error: %v\n%s", e, debug.Stack())
@@ -209,7 +206,7 @@ func (srv *Server) buildResponse(reply *message.Reply) (err error) {
 }
 
 //Send 将自定义的消息发送
-func (srv *Server) Send() (err error) {
+func (srv *MsgHandler) Send() (err error) {
 	replyMsg := srv.responseMsg
 	if srv.isSafeMode {
 		//安全模式下对消息进行加密