wx_template_msg.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package services
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "hongze/hongze_mfyx/models"
  7. "hongze/hongze_mfyx/utils"
  8. "io/ioutil"
  9. "net/http"
  10. "strconv"
  11. "time"
  12. )
  13. // 发送报告提问消息提醒
  14. func SendWxMsgWithAsk(name, askTime, askMsg, title string, openIdList []*models.OpenIdList, articleId int) (err error) {
  15. if len(openIdList) == 0 {
  16. return
  17. }
  18. var msg string
  19. defer func() {
  20. if err != nil {
  21. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  22. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,用户名", name, "文章ID:", articleId), 2)
  23. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  24. }
  25. fmt.Println("line 21", err, msg)
  26. }()
  27. var first string
  28. var keyword1 string
  29. var keyword2 string
  30. var keyword3 string
  31. var keyword4 string
  32. var remark string
  33. first = "研选报告有新的提问,请及时处理"
  34. keyword1 = name
  35. keyword3 = askTime
  36. keyword2 = ""
  37. keyword4 = askMsg
  38. remark = title
  39. openIdArr := make([]string, 0)
  40. for _, v := range openIdList {
  41. openIdArr = append(openIdArr, v.OpenId)
  42. }
  43. redirectUrl := utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)
  44. sendInfo := new(SendWxTemplate)
  45. sendInfo.First = first
  46. sendInfo.Keyword1 = keyword1
  47. sendInfo.Keyword2 = keyword2
  48. sendInfo.Keyword3 = keyword3
  49. sendInfo.Keyword4 = keyword4
  50. sendInfo.Remark = remark
  51. sendInfo.TemplateId = utils.WxMsgTemplateIdAskMsgXzs
  52. sendInfo.RedirectUrl = redirectUrl
  53. sendInfo.RedirectTarget = 3
  54. sendInfo.Resource = strconv.Itoa(articleId)
  55. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  56. sendInfo.OpenIdArr = openIdArr
  57. err = PublicSendTemplateMsg(sendInfo)
  58. if err != nil {
  59. return
  60. }
  61. return
  62. }
  63. // 发送用户阅读报告消息提醒
  64. func SendWxMsgWithArticleUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, articleId int) (err error) {
  65. if len(openIdList) == 0 {
  66. return
  67. }
  68. var msg string
  69. defer func() {
  70. if err != nil {
  71. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  72. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
  73. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  74. }
  75. }()
  76. accessToken, err := models.GetWxAccessTokenByXzs()
  77. if err != nil {
  78. msg = "GetWxAccessToken Err:" + err.Error()
  79. return
  80. }
  81. if accessToken == "" {
  82. msg = "accessToken is empty"
  83. return
  84. }
  85. var first string
  86. first = keyWord1
  87. //keyword1 := keyWord2
  88. //keyword1 := keyWord2
  89. remark := "点击查看报告详情"
  90. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  91. templateId := utils.WxMsgTemplateIdArticleUserRemind
  92. sendMap := make(map[string]interface{})
  93. sendData := make(map[string]interface{})
  94. sendMap["template_id"] = templateId
  95. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)}
  96. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  97. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  98. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  99. sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  100. sendMap["data"] = sendData
  101. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  102. return
  103. }
  104. // 发送用户操作活动消息提醒
  105. func SendWxMsgWithActivityUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
  106. if len(openIdList) == 0 {
  107. return
  108. }
  109. var msg string
  110. defer func() {
  111. if err != nil {
  112. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  113. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,文章ID:", activityId), 2)
  114. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  115. }
  116. }()
  117. accessToken, err := models.GetWxAccessTokenByXzs()
  118. if err != nil {
  119. msg = "GetWxAccessToken Err:" + err.Error()
  120. return
  121. }
  122. if accessToken == "" {
  123. msg = "accessToken is empty"
  124. return
  125. }
  126. var first string
  127. //first = keyWord1
  128. //keyword1 := keyWord2
  129. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  130. templateId := utils.WxMsgTemplateIdArticleUserRemind
  131. sendMap := make(map[string]interface{})
  132. sendData := make(map[string]interface{})
  133. sendMap["template_id"] = templateId
  134. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
  135. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  136. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  137. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  138. sendMap["data"] = sendData
  139. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  140. return
  141. }
  142. func WxSendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*models.OpenIdList, resource string, sendType int) (err error) {
  143. for _, v := range items {
  144. sendMap["touser"] = v.OpenId
  145. data, err := json.Marshal(sendMap)
  146. if err != nil {
  147. fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
  148. return err
  149. }
  150. utils.FileLog.Info("One SendData:%s", string(data))
  151. fmt.Println(string(data))
  152. err = SendTemplateMsg(sendUrl, data, resource, sendType, v)
  153. if err != nil {
  154. fmt.Println("send err:", err.Error())
  155. return err
  156. }
  157. }
  158. return
  159. }
  160. func SendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, dataItem *models.OpenIdList) (err error) {
  161. client := http.Client{}
  162. resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
  163. if err != nil {
  164. return
  165. }
  166. defer resp.Body.Close()
  167. body, _ := ioutil.ReadAll(resp.Body)
  168. utils.FileLog.Info("SendResult:%s", string(body))
  169. var templateResponse models.SendTemplateResponse
  170. err = json.Unmarshal(body, &templateResponse)
  171. fmt.Println(templateResponse.Errcode)
  172. fmt.Println(templateResponse.Errmsg)
  173. if err != nil {
  174. return err
  175. }
  176. //新增模板消息推送记录
  177. {
  178. tr := new(models.UserTemplateRecord)
  179. tr.UserId = dataItem.UserId
  180. tr.OpenId = dataItem.OpenId
  181. tr.Resource = resource
  182. tr.SendData = string(data)
  183. tr.Result = string(body)
  184. tr.CreateDate = time.Now().Format(utils.FormatDate)
  185. tr.CreateTime = time.Now().Format(utils.FormatDateTime)
  186. if templateResponse.Errcode == 0 {
  187. tr.SendStatus = 1
  188. } else {
  189. tr.SendStatus = 0
  190. }
  191. tr.SendType = sendType
  192. go func() {
  193. err = models.AddUserTemplateRecord(tr)
  194. if err != nil {
  195. utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
  196. }
  197. }()
  198. }
  199. return
  200. }