You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

event_handle.go 3.6 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package wechat
  2. import (
  3. "code.gitea.io/gitea/modules/redis/redis_client"
  4. "code.gitea.io/gitea/modules/redis/redis_key"
  5. "encoding/json"
  6. "encoding/xml"
  7. "strings"
  8. "time"
  9. )
  10. //<xml>
  11. // <ToUserName><![CDATA[toUser]]></ToUserName>
  12. // <FromUserName><![CDATA[FromUser]]></FromUserName>
  13. // <CreateTime>123456789</CreateTime>
  14. // <MsgType><![CDATA[event]]></MsgType>
  15. // <Event><![CDATA[SCAN]]></Event>
  16. // <EventKey><![CDATA[SCENE_VALUE]]></EventKey>
  17. // <Ticket><![CDATA[TICKET]]></Ticket>
  18. //</xml>
  19. type WechatMsg struct {
  20. ToUserName string
  21. FromUserName string
  22. CreateTime int64
  23. MsgType string
  24. Event string
  25. EventKey string
  26. Ticket string
  27. Content string
  28. MsgId string
  29. MsgDataId string
  30. Idx string
  31. }
  32. type MsgReply struct {
  33. XMLName xml.Name `xml:"xml"`
  34. ToUserName string
  35. FromUserName string
  36. CreateTime int64
  37. MsgType string
  38. Content string
  39. }
  40. type TextMsgReply struct {
  41. XMLName xml.Name `xml:"xml"`
  42. ToUserName string
  43. FromUserName string
  44. CreateTime int64
  45. MsgType string
  46. Content string
  47. }
  48. type ImageMsgReply struct {
  49. XMLName xml.Name `xml:"xml"`
  50. ToUserName string
  51. FromUserName string
  52. CreateTime int64
  53. MsgType string
  54. Image ImageContent
  55. }
  56. type VoiceMsgReply struct {
  57. XMLName xml.Name `xml:"xml"`
  58. ToUserName string
  59. FromUserName string
  60. CreateTime int64
  61. MsgType string
  62. Voice VoiceContent
  63. }
  64. type VideoMsgReply struct {
  65. XMLName xml.Name `xml:"xml"`
  66. ToUserName string
  67. FromUserName string
  68. CreateTime int64
  69. MsgType string
  70. Video VideoContent
  71. }
  72. type MusicMsgReply struct {
  73. XMLName xml.Name `xml:"xml"`
  74. ToUserName string
  75. FromUserName string
  76. CreateTime int64
  77. MsgType string
  78. Music MusicContent
  79. }
  80. type NewsMsgReply struct {
  81. XMLName xml.Name `xml:"xml"`
  82. ToUserName string
  83. FromUserName string
  84. CreateTime int64
  85. MsgType string
  86. ArticleCount int
  87. Articles ArticleItem
  88. }
  89. type ArticleItem struct {
  90. Item []ArticlesContent
  91. }
  92. type ImageContent struct {
  93. MediaId string
  94. }
  95. type VoiceContent struct {
  96. MediaId string
  97. }
  98. type VideoContent struct {
  99. MediaId string
  100. Title string
  101. Description string
  102. }
  103. type MusicContent struct {
  104. Title string
  105. Description string
  106. MusicUrl string
  107. HQMusicUrl string
  108. ThumbMediaId string
  109. }
  110. type ArticlesContent struct {
  111. XMLName xml.Name `xml:"item"`
  112. Title string
  113. Description string
  114. PicUrl string
  115. Url string
  116. }
  117. const (
  118. WECHAT_EVENT_SUBSCRIBE = "subscribe"
  119. WECHAT_EVENT_SCAN = "SCAN"
  120. )
  121. const (
  122. WECHAT_MSG_TYPE_TEXT = "text"
  123. WECHAT_MSG_TYPE_EVENT = "event"
  124. )
  125. func HandleScanEvent(we WechatMsg) string {
  126. eventKey := we.EventKey
  127. if eventKey == "" {
  128. return ""
  129. }
  130. sceneStr := strings.TrimPrefix(eventKey, "qrscene_")
  131. key := redis_key.WechatBindingUserIdKey(sceneStr)
  132. val, _ := redis_client.Get(key)
  133. if val == "" {
  134. return ""
  135. }
  136. qrCache := new(QRCode4BindCache)
  137. json.Unmarshal([]byte(val), qrCache)
  138. if qrCache.Status == BIND_STATUS_UNBIND {
  139. err := BindWechat(qrCache.UserId, we.FromUserName)
  140. if err != nil {
  141. if err, ok := err.(WechatBindError); ok {
  142. return err.Reply
  143. }
  144. return BIND_REPLY_FAILED_DEFAULT
  145. }
  146. qrCache.Status = BIND_STATUS_BOUND
  147. jsonStr, _ := json.Marshal(qrCache)
  148. redis_client.Setex(redis_key.WechatBindingUserIdKey(sceneStr), string(jsonStr), 60*time.Second)
  149. }
  150. return BIND_REPLY_SUCCESS
  151. }
  152. func HandleSubscribeEvent(we WechatMsg) *WechatReplyContent {
  153. r, err := LoadReplyFromCacheAndDisk(SubscribeReply)
  154. if err != nil || len(r) == 0 {
  155. return nil
  156. }
  157. return r[0]
  158. }