package hdl import ( "applet/app/utils" "encoding/xml" "fmt" "log" "time" "github.com/gin-gonic/gin" ) const Token = "temptoken" // WXCheckSignature 微信接入校验 func WXCheckSignature(c *gin.Context) { signature := c.Query("signature") timestamp := c.Query("timestamp") nonce := c.Query("nonce") echostr := c.Query("echostr") ok := utils.CheckSignature(signature, timestamp, nonce, Token) if !ok { log.Println("[微信接入] - 微信公众号接入校验失败!") return } log.Println("[微信接入] - 微信公众号接入校验成功!") _, _ = c.Writer.WriteString(echostr) } // WXMsg 微信消息结构体 type WXMsg struct { ToUserName string FromUserName string CreateTime int64 MsgType string } // WXTextMsg 微信文本消息结构体 type WXTextMsg struct { ToUserName string FromUserName string CreateTime int64 MsgType string Content string MsgId int64 } // WXEventForSubscribeMsg 扫描带参数二维码事件消息结构体(用户未关注时,进行关注后的事件推送) type WXEventForSubscribeMsg struct { ToUserName string //开发者微信号 FromUserName string //发送方帐号(一个OpenID) CreateTime int64 //消息创建时间 (整型) MsgType string //消息类型,event Event string //事件类型,subscribe EventKey string //事件KEY值,qrscene_为前缀,后面为二维码的参数值 Ticket string //二维码的ticket,可用来换取二维码图片 } // WXEventForScanMsg 扫描带参数二维码事件消息结构体(用户已关注时的事件推送) type WXEventForScanMsg struct { ToUserName string //开发者微信号 FromUserName string //发送方帐号(一个OpenID) CreateTime int64 //消息创建时间 (整型) MsgType string //消息类型,event Event string //事件类型,subscribe EventKey string //事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id Ticket string //二维码的ticket,可用来换取二维码图片 } // WXMsgReceive 微信消息接收 func WXMsgReceive(c *gin.Context) { var msg WXMsg err := c.ShouldBindXML(&msg) if err != nil { log.Printf("[消息接收] - XML数据包解析失败: %v\n", err) return } log.Printf("[消息接收] - 收到消息, 消息类型为: %s", msg.MsgType) if msg.MsgType == "event" { //事件类型消息 var eventMsg WXEventForSubscribeMsg err := c.ShouldBindXML(&eventMsg) if err != nil { log.Printf("[事件类型-消息接收] - XML数据包解析失败: %v\n", err) return } log.Printf("[事件类型]-收到消息, 事件类型为: %s, 事件KEY值为: %s\n, 二维码的ticket值为: %s\n", eventMsg.Event, eventMsg.EventKey, eventMsg.Ticket) if eventMsg.Event == "subscribe" { //用户未关注时,进行关注后的事件推送 //userUseQrcodeRecordsDb := db.UserUseQrcodeRecordsDb{} //userUseQrcodeRecordsDb.Set() //userUseQrcodeRecordsDb.InsertUserUseQrcodeRecords(model.UserUseQrcodeRecords{ // UserWxOpenId: eventMsg.FromUserName, // RecordsId: 0, // State: 0, // CreateAt: "", // UpdateAt: "", //}) } if eventMsg.Event == "SCAN" { //用户已关注时的事件推送 } } if msg.MsgType == "text" { //事件类型消息 var textMsg WXTextMsg err := c.ShouldBindXML(&textMsg) if err != nil { log.Printf("[文本消息-消息接收] - XML数据包解析失败: %v\n", err) return } log.Printf("[文本消息]-收到消息, 消息内容为: %s", textMsg.Content) WXMsgReply(c, textMsg.ToUserName, textMsg.FromUserName) } } // WXRepTextMsg 微信回复文本消息结构体 type WXRepTextMsg struct { ToUserName string FromUserName string CreateTime int64 MsgType string Content string // 若不标记XMLName, 则解析后的xml名为该结构体的名称 XMLName xml.Name `xml:"xml"` } // WXMsgReply 微信消息回复 func WXMsgReply(c *gin.Context, fromUser, toUser string) { repTextMsg := WXRepTextMsg{ ToUserName: toUser, FromUserName: fromUser, CreateTime: time.Now().Unix(), MsgType: "text", Content: fmt.Sprintf("[消息回复] - %s\n,hello, world!", time.Now().Format("2006-01-02 15:04:05")), } msg, err := xml.Marshal(&repTextMsg) if err != nil { log.Printf("[消息回复] - 将对象进行XML编码出错: %v\n", err) return } _, _ = c.Writer.Write(msg) }