| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- package server
- import (
- "encoding/xml"
- "fmt"
- "io/ioutil"
- "github.com/silenceper/wechat/context"
- "github.com/silenceper/wechat/message"
- "github.com/silenceper/wechat/util"
- )
- //Server struct
- type Server struct {
- *context.Context
- isSafeMode bool
- rawXMLMsg string
- }
- //NewServer init
- func NewServer(context *context.Context) *Server {
- srv := new(Server)
- srv.Context = context
- return srv
- }
- //Serve 处理微信的请求消息
- func (srv *Server) Serve() error {
- if !srv.Validate() {
- return fmt.Errorf("请求校验失败")
- }
- echostr, exists := srv.GetQuery("echostr")
- if exists {
- return srv.String(echostr)
- }
- srv.handleRequest()
- return nil
- }
- //Validate 校验请求是否合法
- func (srv *Server) Validate() bool {
- timestamp := srv.Query("timestamp")
- nonce := srv.Query("nonce")
- signature := srv.Query("signature")
- return signature == util.Signature(srv.Token, timestamp, nonce)
- }
- //HandleRequest 处理微信的请求
- func (srv *Server) handleRequest() {
- srv.isSafeMode = false
- encryptType := srv.Query("encrypt_type")
- if encryptType == "aes" {
- srv.isSafeMode = true
- }
- _, err := srv.getMessage()
- if err != nil {
- fmt.Printf("%v", err)
- }
- }
- func (srv *Server) getMessage() (interface{}, error) {
- var rawXMLMsgBytes []byte
- var err error
- if srv.isSafeMode {
- var encryptedXMLMsg message.EncryptedXMLMsg
- if err := xml.NewDecoder(srv.Request.Body).Decode(&encryptedXMLMsg); err != nil {
- return nil, fmt.Errorf("从body中解析xml失败,err=%v", err)
- }
- //验证消息签名
- timestamp := srv.Query("timestamp")
- nonce := srv.Query("nonce")
- msgSignature := srv.Query("msg_signature")
- msgSignatureCreate := util.Signature(srv.Token, timestamp, nonce, encryptedXMLMsg.EncryptedMsg)
- if msgSignature != msgSignatureCreate {
- return nil, fmt.Errorf("消息不合法,验证签名失败")
- }
- //解密
- rawXMLMsgBytes, err = util.DecryptMsg(srv.AppID, encryptedXMLMsg.EncryptedMsg, srv.EncodingAESKey)
- if err != nil {
- return nil, fmt.Errorf("消息解密失败,err=%v", err)
- }
- } else {
- rawXMLMsgBytes, err = ioutil.ReadAll(srv.Request.Body)
- if err != nil {
- return nil, fmt.Errorf("从body中解析xml失败,err=%v", err)
- }
- }
- srv.rawXMLMsg = string(rawXMLMsgBytes)
- fmt.Println(srv.rawXMLMsg)
- return nil, nil
- }
|