github.com/chanxuehong/wechat@v0.0.0-20230222024006-36f0325263cd/mp/README.md (about) 1 ### 回调请求的一般处理逻辑(一个回调地址处理一个公众号的消息和事件) 2 ```Go 3 package main 4 5 import ( 6 "log" 7 "net/http" 8 9 "github.com/chanxuehong/wechat/mp/core" 10 "github.com/chanxuehong/wechat/mp/menu" 11 "github.com/chanxuehong/wechat/mp/message/callback/request" 12 "github.com/chanxuehong/wechat/mp/message/callback/response" 13 ) 14 15 const ( 16 wxAppId = "appid" 17 wxAppSecret = "appsecret" 18 19 wxOriId = "oriid" 20 wxToken = "token" 21 wxEncodedAESKey = "aeskey" 22 ) 23 24 var ( 25 // 下面两个变量不一定非要作为全局变量, 根据自己的场景来选择. 26 msgHandler core.Handler 27 msgServer *core.Server 28 ) 29 30 func init() { 31 mux := core.NewServeMux() 32 mux.DefaultMsgHandleFunc(defaultMsgHandler) 33 mux.DefaultEventHandleFunc(defaultEventHandler) 34 mux.MsgHandleFunc(request.MsgTypeText, textMsgHandler) 35 mux.EventHandleFunc(menu.EventTypeClick, menuClickEventHandler) 36 37 msgHandler = mux 38 msgServer = core.NewServer(wxOriId, wxAppId, wxToken, wxEncodedAESKey, msgHandler, nil) 39 } 40 41 func textMsgHandler(ctx *core.Context) { 42 log.Printf("收到文本消息:\n%s\n", ctx.MsgPlaintext) 43 44 msg := request.GetText(ctx.MixedMsg) 45 resp := response.NewText(msg.FromUserName, msg.ToUserName, msg.CreateTime, msg.Content) 46 //ctx.RawResponse(resp) // 明文回复 47 ctx.AESResponse(resp, 0, "", nil) // aes密文回复 48 } 49 50 func defaultMsgHandler(ctx *core.Context) { 51 log.Printf("收到消息:\n%s\n", ctx.MsgPlaintext) 52 ctx.NoneResponse() 53 } 54 55 func menuClickEventHandler(ctx *core.Context) { 56 log.Printf("收到菜单 click 事件:\n%s\n", ctx.MsgPlaintext) 57 58 event := menu.GetClickEvent(ctx.MixedMsg) 59 resp := response.NewText(event.FromUserName, event.ToUserName, event.CreateTime, "收到 click 类型的事件") 60 //ctx.RawResponse(resp) // 明文回复 61 ctx.AESResponse(resp, 0, "", nil) // aes密文回复 62 } 63 64 func defaultEventHandler(ctx *core.Context) { 65 log.Printf("收到事件:\n%s\n", ctx.MsgPlaintext) 66 ctx.NoneResponse() 67 } 68 69 func init() { 70 http.HandleFunc("/wx_callback", wxCallbackHandler) 71 } 72 73 // wxCallbackHandler 是处理回调请求的 http handler. 74 // 1. 不同的 web 框架有不同的实现 75 // 2. 一般一个 handler 处理一个公众号的回调请求(当然也可以处理多个, 这里我只处理一个) 76 func wxCallbackHandler(w http.ResponseWriter, r *http.Request) { 77 msgServer.ServeHTTP(w, r, nil) 78 } 79 80 func main() { 81 log.Println(http.ListenAndServe(":80", nil)) 82 } 83 ``` 84 85 ### 公众号api调用的一般处理逻辑 86 ```Go 87 package main 88 89 import ( 90 "fmt" 91 92 "github.com/chanxuehong/wechat/mp/base" 93 "github.com/chanxuehong/wechat/mp/core" 94 ) 95 96 const ( 97 wxAppId = "appid" 98 wxAppSecret = "appsecret" 99 100 wxOriId = "oriid" 101 wxToken = "token" 102 wxEncodedAESKey = "aeskey" 103 ) 104 105 var ( 106 accessTokenServer core.AccessTokenServer = core.NewDefaultAccessTokenServer(wxAppId, wxAppSecret, nil) 107 wechatClient *core.Client = core.NewClient(accessTokenServer, nil) 108 ) 109 110 func main() { 111 fmt.Println(base.GetCallbackIP(wechatClient)) 112 } 113 ```