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 1.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
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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 WechatEvent struct {
  20. ToUserName string
  21. FromUserName string
  22. CreateTime int64
  23. MsgType string
  24. Event string
  25. EventKey string
  26. Ticket string
  27. }
  28. type EventReply struct {
  29. XMLName xml.Name `xml:"xml"`
  30. ToUserName string
  31. FromUserName string
  32. CreateTime int64
  33. MsgType string
  34. Content string
  35. }
  36. func HandleSubscribeEvent(we WechatEvent) string {
  37. eventKey := we.EventKey
  38. if eventKey == "" {
  39. return ""
  40. }
  41. sceneStr := strings.TrimPrefix(eventKey, "qrscene_")
  42. key := redis_key.WechatBindingUserIdKey(sceneStr)
  43. val, _ := redis_client.Get(key)
  44. if val == "" {
  45. return ""
  46. }
  47. qrCache := new(QRCode4BindCache)
  48. json.Unmarshal([]byte(val), qrCache)
  49. if qrCache.Status == BIND_STATUS_UNBIND {
  50. err := BindWechat(qrCache.UserId, we.FromUserName)
  51. if err != nil {
  52. if err, ok := err.(WechatBindError); ok {
  53. return err.Reply
  54. }
  55. return BIND_REPLY_FAILED_DEFAULT
  56. }
  57. qrCache.Status = BIND_STATUS_BOUND
  58. jsonStr, _ := json.Marshal(qrCache)
  59. redis_client.Setex(redis_key.WechatBindingUserIdKey(sceneStr), string(jsonStr), 60*time.Second)
  60. }
  61. return BIND_REPLY_SUCCESS
  62. }