wx_template_msg.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. package services
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "hongze/hongze_mfyx/models"
  8. "hongze/hongze_mfyx/utils"
  9. "io/ioutil"
  10. "net/http"
  11. "strconv"
  12. "time"
  13. )
  14. // 发送报告提问消息提醒
  15. func SendWxMsgWithAsk(name, askTime, askMsg, title string, openIdList []*models.OpenIdList, articleId int) (err error) {
  16. if len(openIdList) == 0 {
  17. return
  18. }
  19. var msg string
  20. defer func() {
  21. if err != nil {
  22. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  23. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,用户名", name, "文章ID:", articleId), 2)
  24. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  25. }
  26. fmt.Println("line 21", err, msg)
  27. }()
  28. var first string
  29. var keyword1 string
  30. var keyword2 string
  31. var keyword3 string
  32. var keyword4 string
  33. var remark string
  34. first = "研选报告有新的提问,请及时处理"
  35. keyword1 = name
  36. keyword3 = askTime
  37. keyword2 = ""
  38. keyword4 = askMsg
  39. remark = title
  40. openIdArr := make([]string, 0)
  41. for _, v := range openIdList {
  42. openIdArr = append(openIdArr, v.OpenId)
  43. }
  44. redirectUrl := utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)
  45. sendInfo := new(SendWxTemplate)
  46. sendInfo.First = first
  47. sendInfo.Keyword1 = keyword1
  48. sendInfo.Keyword2 = keyword2
  49. sendInfo.Keyword3 = keyword3
  50. sendInfo.Keyword4 = keyword4
  51. sendInfo.Remark = remark
  52. sendInfo.TemplateId = utils.WxMsgTemplateIdAskMsgXzs
  53. sendInfo.RedirectUrl = redirectUrl
  54. sendInfo.RedirectTarget = 3
  55. sendInfo.Resource = strconv.Itoa(articleId)
  56. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  57. sendInfo.OpenIdArr = openIdArr
  58. err = PublicSendTemplateMsg(sendInfo)
  59. if err != nil {
  60. return
  61. }
  62. return
  63. }
  64. // 发送用户阅读报告消息提醒
  65. func SendWxMsgWithArticleUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, articleId int) (err error) {
  66. if len(openIdList) == 0 {
  67. return
  68. }
  69. var msg string
  70. defer func() {
  71. if err != nil {
  72. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  73. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
  74. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  75. }
  76. }()
  77. accessToken, err := models.GetWxAccessTokenByXzs()
  78. if err != nil {
  79. msg = "GetWxAccessToken Err:" + err.Error()
  80. return
  81. }
  82. if accessToken == "" {
  83. msg = "accessToken is empty"
  84. return
  85. }
  86. var first string
  87. first = keyWord1
  88. //keyword1 := keyWord2
  89. //keyword1 := keyWord2
  90. remark := "点击查看报告详情"
  91. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  92. templateId := utils.WxMsgTemplateIdArticleUserRemind
  93. sendMap := make(map[string]interface{})
  94. sendData := make(map[string]interface{})
  95. sendMap["template_id"] = templateId
  96. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)}
  97. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  98. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  99. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  100. sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  101. sendMap["data"] = sendData
  102. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  103. return
  104. }
  105. // 发送用户操作活动消息提醒
  106. func SendWxMsgWithActivityUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
  107. if len(openIdList) == 0 {
  108. return
  109. }
  110. var msg string
  111. defer func() {
  112. if err != nil {
  113. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  114. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,文章ID:", activityId), 2)
  115. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  116. }
  117. }()
  118. accessToken, err := models.GetWxAccessTokenByXzs()
  119. if err != nil {
  120. msg = "GetWxAccessToken Err:" + err.Error()
  121. return
  122. }
  123. if accessToken == "" {
  124. msg = "accessToken is empty"
  125. return
  126. }
  127. var first string
  128. //first = keyWord1
  129. //keyword1 := keyWord2
  130. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  131. templateId := utils.WxMsgTemplateIdArticleUserRemind
  132. sendMap := make(map[string]interface{})
  133. sendData := make(map[string]interface{})
  134. sendMap["template_id"] = templateId
  135. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
  136. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  137. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  138. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  139. sendMap["data"] = sendData
  140. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  141. return
  142. }
  143. func WxSendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*models.OpenIdList, resource string, sendType int) (err error) {
  144. for _, v := range items {
  145. sendMap["touser"] = v.OpenId
  146. data, err := json.Marshal(sendMap)
  147. if err != nil {
  148. fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
  149. return err
  150. }
  151. utils.FileLog.Info("One SendData:%s", string(data))
  152. fmt.Println(string(data))
  153. err = SendTemplateMsg(sendUrl, data, resource, sendType, v)
  154. if err != nil {
  155. fmt.Println("send err:", err.Error())
  156. return err
  157. }
  158. }
  159. return
  160. }
  161. func SendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, dataItem *models.OpenIdList) (err error) {
  162. client := http.Client{}
  163. resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
  164. if err != nil {
  165. return
  166. }
  167. defer resp.Body.Close()
  168. body, _ := ioutil.ReadAll(resp.Body)
  169. utils.FileLog.Info("SendResult:%s", string(body))
  170. var templateResponse models.SendTemplateResponse
  171. err = json.Unmarshal(body, &templateResponse)
  172. fmt.Println(templateResponse.Errcode)
  173. fmt.Println(templateResponse.Errmsg)
  174. if err != nil {
  175. return err
  176. }
  177. //新增模板消息推送记录
  178. {
  179. tr := new(models.UserTemplateRecord)
  180. tr.UserId = dataItem.UserId
  181. tr.OpenId = dataItem.OpenId
  182. tr.Resource = resource
  183. tr.SendData = string(data)
  184. tr.Result = string(body)
  185. tr.CreateDate = time.Now().Format(utils.FormatDate)
  186. tr.CreateTime = time.Now().Format(utils.FormatDateTime)
  187. if templateResponse.Errcode == 0 {
  188. tr.SendStatus = 1
  189. } else {
  190. tr.SendStatus = 0
  191. }
  192. tr.SendType = sendType
  193. go func() {
  194. err = models.AddUserTemplateRecord(tr)
  195. if err != nil {
  196. utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
  197. }
  198. }()
  199. }
  200. return
  201. }
  202. // 发送用户留言提醒
  203. // func SendCommentWxTemplateMsg(title, companyName, userName, sellerName, createTime, content string, openIdList []*models.OpenIdList, articleId int) (err error) {
  204. func SendCommentWxTemplateMsg(req models.AddCygxArticleCommentReq, user *models.WxUserItem, articleInfo *models.ArticleDetail, msgId int) (err error) {
  205. var msg string
  206. defer func() {
  207. if err != nil {
  208. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  209. go utils.SendAlarmMsg(fmt.Sprint("发送用户用户留言提醒失败,文章ID:", req.ArticleId), 2)
  210. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  211. }
  212. }()
  213. companyItem, e := models.GetSellerDetailAllByCompanyId(user.CompanyId)
  214. if e != nil {
  215. return
  216. }
  217. if companyItem == nil {
  218. msg = "获取客户所属销售信息失败,UserID:" + strconv.Itoa(user.UserId)
  219. }
  220. var first string
  221. var keyword1 string
  222. var keyword2 string
  223. var keyword3 string
  224. var keyword4 string
  225. var remark string
  226. var redirectUrl string
  227. var mobile string
  228. first = "【" + articleInfo.Title + "】有新的留言,请及时处理"
  229. keyword1 = user.CompanyName + "——" + user.RealName + "(" + companyItem.SellerName + ")"
  230. keyword2 = "留言:" + articleInfo.Title
  231. keyword3 = time.Now().Format(utils.FormatDateTime)
  232. keyword4 = req.Content
  233. remark = "点击查看报告详情"
  234. if articleInfo.ArticleTypeId > 0 {
  235. //研选报告添加汪洋
  236. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic + "," + utils.ActSendMsgMobile
  237. } else {
  238. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic
  239. }
  240. openIdList, e := models.GetWxOpenIdByMobileList(mobile)
  241. if e != nil {
  242. err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
  243. return
  244. }
  245. openIdArr := make([]string, 0)
  246. for _, v := range openIdList {
  247. openIdArr = append(openIdArr, v.OpenId)
  248. }
  249. //mapSource留言跳转类型,1:文章、2:活动、3:微路演视频、4:活动视频、5:活动音频
  250. if utils.RunMode != "release" {
  251. redirectUrl = utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleInfo.ArticleId)
  252. } else {
  253. redirectUrl = utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(msgId) + "&SourceType=1"
  254. }
  255. sendInfo := new(SendWxTemplate)
  256. sendInfo.First = first
  257. sendInfo.Keyword1 = keyword1
  258. sendInfo.Keyword2 = keyword2
  259. sendInfo.Keyword3 = keyword3
  260. sendInfo.Keyword4 = keyword4
  261. sendInfo.Remark = remark
  262. sendInfo.TemplateId = utils.WxMsgTemplateIdAskMsgXzs
  263. sendInfo.RedirectUrl = redirectUrl
  264. sendInfo.RedirectTarget = 3
  265. sendInfo.Resource = strconv.Itoa(req.ArticleId)
  266. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_COMMENT
  267. sendInfo.OpenIdArr = openIdArr
  268. err = PublicSendTemplateMsg(sendInfo)
  269. if err != nil {
  270. return
  271. }
  272. return
  273. }