|
- 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)
- }
|