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