template_msg.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package wechat
  2. //var (
  3. // TemplateMsgSendUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s"
  4. // TemplateMsgClearQuotaUrl = "https://api.weixin.qq.com/cgi-bin/clear_quota?access_token=%s"
  5. //)
  6. //type TemplateMsgSendClient struct {
  7. // AccessToken string
  8. // Data []byte
  9. //}
  10. //type SendTemplateResponse struct {
  11. // Errcode int `json:"errcode"`
  12. // Errmsg string `json:"errmsg"`
  13. // MsgID int `json:"msgid"`
  14. //}
  15. //type ClearQuotaResponse struct {
  16. // Errcode int `json:"errcode"`
  17. // Errmsg string `json:"errmsg"`
  18. //}
  19. //type OpenIdList struct {
  20. // OpenId string
  21. // UserId int
  22. //}
  23. // TemplateMsgSendClient.ClearQuota 清除发送超过当日10万次限制
  24. //func (c *TemplateMsgSendClient) ClearQuota() (result *ClearQuotaResponse, err error) {
  25. // key := "CACHE_SendTemplateMsg_ERR"
  26. // exists, _ := utils.Redis.Exists(context.TODO(), key).Result()
  27. // if exists == 1 {
  28. // return
  29. // }
  30. // _ = utils.Redis.SetEX(context.TODO(), key, 1, 6*time.Minute)
  31. //
  32. // sendUrl := fmt.Sprintf(TemplateMsgClearQuotaUrl, c.AccessToken)
  33. // client := http.Client{}
  34. // clearData := make(map[string]interface{})
  35. // clearData["appid"] = WxAppId
  36. // clearJson, _ := json.Marshal(clearData)
  37. // resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(clearJson))
  38. // if err != nil {
  39. // return
  40. // }
  41. // defer func() {
  42. // _ = resp.Body.Close()
  43. // }()
  44. // clearBody, err := io.ReadAll(resp.Body)
  45. // err = json.Unmarshal(clearBody, &result)
  46. // return
  47. //}
  48. // TemplateMsgSendClient.SendMsg 推送消息
  49. //func (c *TemplateMsgSendClient) SendMsg() (sendRes *SendTemplateResponse, err error) {
  50. // // 请求接口
  51. // sendUrl := fmt.Sprintf(TemplateMsgSendUrl, c.AccessToken)
  52. // client := http.Client{}
  53. // resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(c.Data))
  54. // if err != nil {
  55. // return
  56. // }
  57. // defer func() {
  58. // _ = resp.Body.Close()
  59. // }()
  60. // body, _ := io.ReadAll(resp.Body)
  61. // if err = json.Unmarshal(body, &sendRes); err != nil {
  62. // return
  63. // }
  64. // // 模板消息发送超过当日10万次限制错误处理
  65. // if sendRes.Errcode == 45009 {
  66. // // 发送提示邮件
  67. // // 清理限制
  68. // clearRes, e := c.ClearQuota()
  69. // if e != nil {
  70. // err = e
  71. // return
  72. // }
  73. // if clearRes.Errcode != 0 {
  74. // clearJson, er := json.Marshal(clearRes)
  75. // if er != nil {
  76. // return nil, er
  77. // }
  78. // fmt.Println("自动清理模板消息限制接口, 调用失败, ClearQuotaResponse: " + string(clearJson))
  79. // return
  80. // }
  81. // // 发送成功邮件
  82. // // 重新推送
  83. // go func() {
  84. // _, e := c.SendMsg()
  85. // if e != nil {
  86. // return
  87. // }
  88. // }()
  89. // }
  90. // if sendRes.Errcode != 0 {
  91. // err = errors.New("推送模板消息失败, SendTemplateResponse: " + string(body))
  92. // }
  93. // return
  94. //}
  95. // AddUserTemplateRecord 新增模板消息推送记录
  96. //func AddUserTemplateRecord(userId, sendStatus, sendType int, openid, resource, sendData, result string) (err error) {
  97. // item := &models.UserTemplateRecord{
  98. // UserID: userId,
  99. // OpenID: openid,
  100. // Resource: resource,
  101. // SendData: sendData,
  102. // Result: result,
  103. // CreateDate: time.Now().Format(utils.FormatDate),
  104. // CreateTime: time.Now().Format(utils.FormatDateTime),
  105. // SendStatus: sendStatus,
  106. // SendType: sendType,
  107. // }
  108. // err = item.Insert()
  109. // return
  110. //}
  111. // SendMultiTemplateMsg 推送模板消息至多个用户
  112. //func SendMultiTemplateMsg(sendMap map[string]interface{}, items []*OpenIdList, resource string, sendType int) (err error) {
  113. // ws := GetWxChat()
  114. // accessToken, err := ws.GetAccessToken()
  115. // if err != nil {
  116. // return
  117. // }
  118. // for _, item := range items {
  119. // sendMap["touser"] = item.OpenId
  120. // data, e := json.Marshal(sendMap)
  121. // if e != nil {
  122. // err = e
  123. // return
  124. // }
  125. // ts := &TemplateMsgSendClient{
  126. // AccessToken: accessToken,
  127. // Data: data,
  128. // }
  129. // result, e := ts.SendMsg()
  130. // if result == nil {
  131. // return
  132. // }
  133. // // 推送消息记录
  134. // {
  135. // go func(v *OpenIdList) {
  136. // sendStatus := 1
  137. // if e != nil {
  138. // sendStatus = 0
  139. // }
  140. // resultJson, _ := json.Marshal(result)
  141. // _ = AddUserTemplateRecord(v.UserId, sendStatus, sendType, v.OpenId, resource, string(data), string(resultJson))
  142. // }(item)
  143. // }
  144. // if e != nil {
  145. // err = e
  146. // return
  147. // }
  148. // }
  149. // return
  150. //}