wx_template_msg.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799
  1. package services
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "hongze/hongze_cygx/models"
  8. "hongze/hongze_cygx/utils"
  9. "io/ioutil"
  10. "net/http"
  11. "strconv"
  12. "time"
  13. )
  14. // 活动预开始模版消息通知
  15. func SendWxMsgWithFrequency(keyword2, activityName, reserveResults, activityTime, activityAddress, remark string, openIdList []*models.OpenIdList, activityId int) (err error) {
  16. var msg string
  17. defer func() {
  18. if err != nil {
  19. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  20. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  21. }
  22. fmt.Println("line 21", err, msg)
  23. }()
  24. redirectUrl := utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId)
  25. sendInfo := new(SendWxTemplate)
  26. sendInfo.Keyword1 = activityName
  27. sendInfo.Keyword2 = keyword2
  28. openIdArr := make([]string, 0)
  29. for _, v := range openIdList {
  30. openIdArr = append(openIdArr, v.OpenId)
  31. }
  32. sendInfo.Remark = remark
  33. sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
  34. sendInfo.RedirectUrl = redirectUrl
  35. sendInfo.RedirectTarget = 3
  36. sendInfo.Resource = strconv.Itoa(activityId)
  37. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
  38. sendInfo.OpenIdArr = openIdArr
  39. err = PublicSendTemplateMsg(sendInfo)
  40. return
  41. }
  42. // 专项调研活动预开始消息通知
  43. // func SendWxMsgWithFrequencySpecial(first, activityName, reserveResults, activityTime, activityAddress, remark string, openIdList []*models.OpenIdList, activityId int) (err error) {
  44. func SendWxMsgWithFrequencySpecial(first, keyword1, keyword2, keyword3, keyword4, remark string, openIdList []*models.OpenIdList, activityId int) (err error) {
  45. var msg string
  46. defer func() {
  47. if err != nil {
  48. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  49. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  50. }
  51. }()
  52. openIdArr := make([]string, 0)
  53. for _, v := range openIdList {
  54. openIdArr = append(openIdArr, v.OpenId)
  55. }
  56. redirectUrl := utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(activityId)
  57. sendInfo := new(SendWxTemplate)
  58. sendInfo.First = first
  59. sendInfo.Keyword1 = keyword1
  60. sendInfo.Keyword2 = keyword2
  61. sendInfo.Keyword3 = keyword3
  62. sendInfo.Keyword4 = keyword4
  63. sendInfo.Remark = remark
  64. sendInfo.TemplateId = utils.WxMsgTemplateIdActivityApplyXzs
  65. sendInfo.RedirectUrl = redirectUrl
  66. sendInfo.RedirectTarget = 3
  67. sendInfo.Resource = strconv.Itoa(activityId)
  68. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
  69. sendInfo.OpenIdArr = openIdArr
  70. err = PublicSendTemplateMsg(sendInfo)
  71. return
  72. }
  73. // 发送报告提问消息提醒
  74. func SendWxMsgWithAsk(name, askTime, askMsg, title string, openIdList []*models.OpenIdList, articleId int) (err error) {
  75. var msg string
  76. defer func() {
  77. if err != nil {
  78. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  79. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,用户名", name, "文章ID:", articleId), 2)
  80. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  81. }
  82. fmt.Println("line 21", err, msg)
  83. }()
  84. var first string
  85. var keyword1 string
  86. var keyword2 string
  87. var keyword3 string
  88. var keyword4 string
  89. var remark string
  90. first = "研选报告有新的提问,请及时处理"
  91. keyword1 = name
  92. keyword3 = askTime
  93. keyword2 = ""
  94. keyword4 = askMsg
  95. remark = title
  96. openIdArr := make([]string, 0)
  97. for _, v := range openIdList {
  98. openIdArr = append(openIdArr, v.OpenId)
  99. }
  100. redirectUrl := utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)
  101. sendInfo := new(SendWxTemplate)
  102. sendInfo.First = first
  103. sendInfo.Keyword1 = keyword1
  104. sendInfo.Keyword2 = keyword2
  105. sendInfo.Keyword3 = keyword3
  106. sendInfo.Keyword4 = keyword4
  107. sendInfo.Remark = remark
  108. sendInfo.TemplateId = utils.WxMsgTemplateIdAskMsgXzs
  109. sendInfo.RedirectUrl = redirectUrl
  110. sendInfo.RedirectTarget = 3
  111. sendInfo.Resource = strconv.Itoa(articleId)
  112. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  113. sendInfo.OpenIdArr = openIdArr
  114. err = PublicSendTemplateMsg(sendInfo)
  115. if err != nil {
  116. return
  117. }
  118. return
  119. }
  120. // 到期提醒模板消息
  121. func SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark string, openIdList []*models.OpenIdList) (err error) {
  122. var msg string
  123. defer func() {
  124. if err != nil {
  125. fmt.Println(err)
  126. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  127. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  128. }
  129. }()
  130. accessToken, err := models.GetWxAccessToken()
  131. if err != nil {
  132. msg = "GetWxAccessToken Err:" + err.Error()
  133. return
  134. }
  135. if accessToken == "" {
  136. msg = "accessToken is empty"
  137. return
  138. }
  139. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  140. sendMap := make(map[string]interface{})
  141. sendData := make(map[string]interface{})
  142. sendMap["template_id"] = utils.WxMsgTemplateIdActivityChange
  143. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  144. sendData["productname"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  145. sendData["date"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  146. sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  147. sendMap["data"] = sendData
  148. fmt.Println(accessToken)
  149. fmt.Println(sendUrl)
  150. //WxSendTemplateMsg(sendUrl, sendMap, openIdList)
  151. return
  152. }
  153. // 发送报告提问消息提醒
  154. func SendWxMsgWithArticleClassToAdmin(keyWord1, keyWord2, keyWord3, keyWord4 string, openIdList []*models.OpenIdList, articleId int) (err error) {
  155. var msg string
  156. defer func() {
  157. if err != nil {
  158. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  159. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
  160. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  161. }
  162. }()
  163. accessToken, err := models.GetWxAccessTokenByXzs()
  164. if err != nil {
  165. msg = "GetWxAccessToken Err:" + err.Error()
  166. return
  167. }
  168. if accessToken == "" {
  169. msg = "accessToken is empty"
  170. return
  171. }
  172. var first string
  173. first = keyWord1
  174. keyword1 := keyWord2
  175. keyword2 := keyWord3
  176. keyword3 := keyWord4
  177. keyword4 := ""
  178. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  179. templateId := utils.TemplateIdByProductXzs
  180. sendMap := make(map[string]interface{})
  181. sendData := make(map[string]interface{})
  182. sendMap["template_id"] = templateId
  183. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pageMy/reportDetail/reportDetail?id=" + strconv.Itoa(articleId)}
  184. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  185. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  186. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  187. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
  188. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
  189. sendMap["data"] = sendData
  190. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  191. return
  192. }
  193. // 发送用户阅读报告消息提醒
  194. func SendWxMsgWithArticleUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, articleId int) (err error) {
  195. var msg string
  196. defer func() {
  197. if err != nil {
  198. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  199. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
  200. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  201. }
  202. }()
  203. accessToken, err := models.GetWxAccessTokenByXzs()
  204. if err != nil {
  205. msg = "GetWxAccessToken Err:" + err.Error()
  206. return
  207. }
  208. if accessToken == "" {
  209. msg = "accessToken is empty"
  210. return
  211. }
  212. var first string
  213. first = keyWord1
  214. //keyword1 := keyWord2
  215. //keyword1 := keyWord2
  216. remark := "点击查看报告详情"
  217. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  218. templateId := utils.WxMsgTemplateIdArticleUserRemind
  219. sendMap := make(map[string]interface{})
  220. sendData := make(map[string]interface{})
  221. sendMap["template_id"] = templateId
  222. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)}
  223. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  224. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  225. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  226. sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  227. sendMap["data"] = sendData
  228. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  229. return
  230. }
  231. // 发送用户操作活动消息提醒
  232. func SendWxMsgWithActivityUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
  233. var msg string
  234. defer func() {
  235. if err != nil {
  236. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  237. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,文章ID:", activityId), 2)
  238. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  239. }
  240. }()
  241. accessToken, err := models.GetWxAccessTokenByXzs()
  242. if err != nil {
  243. msg = "GetWxAccessToken Err:" + err.Error()
  244. return
  245. }
  246. if accessToken == "" {
  247. msg = "accessToken is empty"
  248. return
  249. }
  250. var first string
  251. //first = keyWord1
  252. //keyword1 := keyWord2
  253. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  254. templateId := utils.WxMsgTemplateIdArticleUserRemind
  255. sendMap := make(map[string]interface{})
  256. sendData := make(map[string]interface{})
  257. sendMap["template_id"] = templateId
  258. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
  259. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  260. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  261. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  262. sendMap["data"] = sendData
  263. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  264. return
  265. }
  266. // 发送用户操作专项调研活动消息提醒
  267. func SendWxMsgWithSpecialActivityUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
  268. var msg string
  269. defer func() {
  270. if err != nil {
  271. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  272. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,文章ID:", activityId), 2)
  273. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  274. }
  275. }()
  276. accessToken, err := models.GetWxAccessTokenByXzs()
  277. if err != nil {
  278. msg = "GetWxAccessToken Err:" + err.Error()
  279. return
  280. }
  281. if accessToken == "" {
  282. msg = "accessToken is empty"
  283. return
  284. }
  285. var first string
  286. first = keyWord1
  287. keyword1 := keyWord2
  288. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  289. templateId := utils.WxMsgTemplateIdArticleUserRemind
  290. sendMap := make(map[string]interface{})
  291. sendData := make(map[string]interface{})
  292. sendMap["template_id"] = templateId
  293. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/specialDetail/specialDetail?id=" + strconv.Itoa(activityId)}
  294. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  295. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  296. sendMap["data"] = sendData
  297. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  298. return
  299. }
  300. // 活动带问提醒
  301. func SendActivityAskApplyTemplateMsg(applyName, applyTime, askContent, activityName string, activityId int, itemOpenid *models.OpenIdList) (err error) {
  302. var msg string
  303. defer func() {
  304. if err != nil {
  305. go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  306. go utils.SendAlarmMsg("活动带问提醒发送模版消息失败"+activityName, 2)
  307. }
  308. if msg != "" {
  309. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  310. }
  311. }()
  312. var accessToken string
  313. if utils.RunMode == "release" {
  314. accessToken, err = models.GetWxAccessTokenByXzs()
  315. if err != nil {
  316. msg = "GetWxAccessToken Err:" + err.Error()
  317. return
  318. }
  319. if accessToken == "" {
  320. msg = "accessToken is empty"
  321. return
  322. }
  323. } else {
  324. accessToken, err = models.GetWxAccessToken()
  325. if err != nil {
  326. msg = "GetWxAccessToken Err:" + err.Error()
  327. return
  328. }
  329. if accessToken == "" {
  330. msg = "accessToken is empty"
  331. return
  332. }
  333. }
  334. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  335. sendMap := make(map[string]interface{})
  336. sendData := make(map[string]interface{})
  337. first := "有新的客户提问"
  338. keyword1 := applyName
  339. keyword2 := "-"
  340. keyword3 := applyTime
  341. keyword4 := askContent
  342. remark := activityName
  343. fontColor := "#D9001B"
  344. sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
  345. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
  346. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
  347. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
  348. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
  349. sendData["remark"] = map[string]interface{}{"value": remark, "color": fontColor}
  350. if utils.RunMode == "release" {
  351. sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
  352. } else {
  353. sendMap["template_id"] = utils.WxMsgTemplateIdApply
  354. }
  355. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
  356. sendMap["data"] = sendData
  357. sendTemplateMsg(sendUrl, sendMap, itemOpenid, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
  358. fmt.Println("send end")
  359. return
  360. }
  361. // 活动带问提醒
  362. func SendActivityAskApplyTemplateMsgV2(keyword1, keyword2, keyword3, keyword4, remark string, itemOpenid *models.OpenIdList, itemAct *models.ActivityDetail, msgId int) (err error) {
  363. var msg string
  364. defer func() {
  365. if err != nil {
  366. go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  367. go utils.SendAlarmMsg("活动带问提醒发送模版消息失败"+remark, 2)
  368. }
  369. if msg != "" {
  370. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  371. }
  372. }()
  373. activityId := itemAct.ActivityId
  374. var redirectUrl string
  375. //redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId)
  376. //mapSource留言跳转类型,1:文章、2:活动、3:微路演视频、4:活动视频、5:活动音频
  377. //if utils.RunMode != "release" {
  378. //
  379. //} else {
  380. //
  381. //}
  382. redirectUrl = utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(msgId) + "&SourceType=2"
  383. openIdArr := make([]string, 0)
  384. openIdArr = append(openIdArr, itemOpenid.OpenId)
  385. sendInfo := new(SendWxTemplate)
  386. sendInfo.Keyword1 = keyword1
  387. sendInfo.Keyword2 = keyword2
  388. sendInfo.Keyword3 = keyword3
  389. sendInfo.Keyword4 = keyword4
  390. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
  391. sendInfo.Remark = remark
  392. sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
  393. sendInfo.RedirectUrl = redirectUrl
  394. sendInfo.RedirectTarget = 3
  395. sendInfo.Resource = strconv.Itoa(activityId)
  396. sendInfo.OpenIdArr = openIdArr
  397. err = PublicSendTemplateMsg(sendInfo)
  398. return
  399. }
  400. // 专项产业调研模板消息推送
  401. func SendSpecialTemplateMsg(applyName, applyTime, mobile, activityName, resource string, itemOpenid *models.OpenIdList) (err error) {
  402. var msg string
  403. defer func() {
  404. if err != nil {
  405. go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  406. go utils.SendAlarmMsg("专项产业调研模板消息推送消息失败"+activityName, 2)
  407. }
  408. if msg != "" {
  409. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  410. }
  411. }()
  412. var accessToken string
  413. if utils.RunMode == "release" {
  414. accessToken, err = models.GetWxAccessTokenByXzs()
  415. if err != nil {
  416. msg = "GetWxAccessToken Err:" + err.Error()
  417. return
  418. }
  419. if accessToken == "" {
  420. msg = "accessToken is empty"
  421. return
  422. }
  423. } else {
  424. accessToken, err = models.GetWxAccessToken()
  425. if err != nil {
  426. msg = "GetWxAccessToken Err:" + err.Error()
  427. return
  428. }
  429. if accessToken == "" {
  430. msg = "accessToken is empty"
  431. return
  432. }
  433. }
  434. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  435. sendMap := make(map[string]interface{})
  436. sendData := make(map[string]interface{})
  437. var first string
  438. if resource == "sale" {
  439. first = "有客户对专项调研感兴趣"
  440. } else {
  441. first = "有5家公司预报名专项调研"
  442. }
  443. keyword1 := applyName
  444. keyword2 := mobile
  445. keyword3 := applyTime
  446. keyword4 := activityName
  447. fontColor := "#D9001B"
  448. sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
  449. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
  450. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
  451. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
  452. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
  453. if utils.RunMode == "release" {
  454. sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
  455. } else {
  456. sendMap["template_id"] = utils.WxMsgTemplateIdApply
  457. }
  458. sendMap["data"] = sendData
  459. sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
  460. return
  461. }
  462. //弘则投资:
  463. //Y59n_AHg-RLCKaz293geW76KDHpGL1qOnE7eF_lxelY 活动预约通知
  464. //CB7bOl7f3viMG4s1uhRo7WM0Jbx3WvodKuIZ8A_z8fM 项目状态变更通知
  465. //
  466. //
  467. //弘则研究:
  468. //MwZ5wxfd0O1Yt0Pkf6OkfWP4USQzZbiEo5SkZ26735s 活动预约通知
  469. //dYg6iHooRq74PyCXmw_Ns7qdJZmbtLoKS2p2FKeaXl0 项目状态变更通知
  470. func WxSendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*models.OpenIdList, resource string, sendType int) (err error) {
  471. for _, v := range items {
  472. sendMap["touser"] = v.OpenId
  473. data, err := json.Marshal(sendMap)
  474. if err != nil {
  475. fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
  476. return err
  477. }
  478. utils.FileLog.Info("One SendData:%s", string(data))
  479. fmt.Println(string(data))
  480. err = SendTemplateMsg(sendUrl, data, resource, sendType, v)
  481. if err != nil {
  482. fmt.Println("send err:", err.Error())
  483. return err
  484. }
  485. }
  486. return
  487. }
  488. func SendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, dataItem *models.OpenIdList) (err error) {
  489. client := http.Client{}
  490. resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
  491. if err != nil {
  492. return
  493. }
  494. defer resp.Body.Close()
  495. body, _ := ioutil.ReadAll(resp.Body)
  496. utils.FileLog.Info("SendResult:%s", string(body))
  497. var templateResponse models.SendTemplateResponse
  498. err = json.Unmarshal(body, &templateResponse)
  499. fmt.Println(templateResponse.Errcode)
  500. fmt.Println(templateResponse.Errmsg)
  501. if err != nil {
  502. return err
  503. }
  504. //新增模板消息推送记录
  505. {
  506. tr := new(models.UserTemplateRecord)
  507. tr.UserId = dataItem.UserId
  508. tr.OpenId = dataItem.OpenId
  509. tr.Resource = resource
  510. tr.SendData = string(data)
  511. tr.Result = string(body)
  512. tr.CreateDate = time.Now().Format(utils.FormatDate)
  513. tr.CreateTime = time.Now().Format(utils.FormatDateTime)
  514. if templateResponse.Errcode == 0 {
  515. tr.SendStatus = 1
  516. } else {
  517. tr.SendStatus = 0
  518. }
  519. tr.SendType = sendType
  520. go func() {
  521. err = models.AddUserTemplateRecord(tr)
  522. if err != nil {
  523. utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
  524. }
  525. }()
  526. }
  527. return
  528. }
  529. // 发送报告更新的消息给预约的用户
  530. func SendWxMsgWithArticleUpdate(first, keyWord1, keyWord2, keyWord3, keyWord4 string, item *models.OpenIdList, articleId int) (err error) {
  531. var msg string
  532. defer func() {
  533. if err != nil {
  534. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  535. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
  536. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  537. }
  538. }()
  539. accessToken, err := models.GetWxAccessTokenByXzs()
  540. if err != nil {
  541. msg = "GetWxAccessToken Err:" + err.Error()
  542. return
  543. }
  544. if accessToken == "" {
  545. msg = "accessToken is empty"
  546. return
  547. }
  548. var openIdList []*models.OpenIdList
  549. openIdList = append(openIdList, item)
  550. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  551. templateId := utils.TemplateIdByProductXzs
  552. sendMap := make(map[string]interface{})
  553. sendData := make(map[string]interface{})
  554. sendMap["template_id"] = templateId
  555. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pageMy/reportDetail/reportDetail?id=" + strconv.Itoa(articleId) + "&IsSendWx=1"}
  556. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  557. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  558. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  559. sendData["keyword3"] = map[string]interface{}{"value": keyWord3, "color": "#173177"}
  560. sendData["keyword4"] = map[string]interface{}{"value": keyWord4, "color": "#173177"}
  561. sendData["remark"] = map[string]interface{}{"value": "点击查看报告详情", "color": "#173177"}
  562. sendMap["data"] = sendData
  563. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  564. return
  565. }
  566. // 周日下午4点半,推送全部活动
  567. func SendActivityOnenIdWxTemplateMsg(first, keyWord1, keyWord2, keyWord3, keyWord4 string, openIdList []*models.OpenIdList) (err error) {
  568. var msg string
  569. defer func() {
  570. if err != nil {
  571. go utils.SendEmail("周日下午4点半,推送全部活"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  572. go utils.SendAlarmMsg(fmt.Sprint("发送周日下午4点半,推送全部活模版消息失败,"), 2)
  573. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  574. }
  575. }()
  576. accessToken, err := models.GetWxAccessTokenByXzs()
  577. if err != nil {
  578. msg = "GetWxAccessToken Err:" + err.Error()
  579. return
  580. }
  581. if accessToken == "" {
  582. msg = "accessToken is empty"
  583. return
  584. }
  585. //var openIdList []*models.OpenIdList
  586. //openIdList = append(openIdList, item)
  587. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  588. templateId := utils.WxMsgTemplateIdArticleUserRemind
  589. sendMap := make(map[string]interface{})
  590. sendData := make(map[string]interface{})
  591. sendMap["template_id"] = templateId
  592. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pages/activity/activity"}
  593. //sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId}
  594. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  595. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  596. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  597. sendData["keyword3"] = map[string]interface{}{"value": keyWord3, "color": "#173177"}
  598. sendData["keyword4"] = map[string]interface{}{"value": keyWord4, "color": "#173177"}
  599. sendData["remark"] = map[string]interface{}{"value": "点击查看下周活动列表", "color": "#173177"}
  600. sendMap["data"] = sendData
  601. WxSendTemplateMsg(sendUrl, sendMap, openIdList, "", utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  602. return
  603. }
  604. // 发送用户留言提醒
  605. // func SendCommentWxTemplateMsg(title, companyName, userName, sellerName, createTime, content string, openIdList []*models.OpenIdList, articleId int) (err error) {
  606. func SendCommentWxTemplateMsg(req models.AddCygxArticleCommentReq, user *models.WxUserItem, articleInfo *models.ArticleDetail, msgId int) (err error) {
  607. var msg string
  608. defer func() {
  609. if err != nil {
  610. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  611. go utils.SendAlarmMsg(fmt.Sprint("发送用户用户留言提醒失败,文章ID:", req.ArticleId), 2)
  612. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  613. }
  614. }()
  615. companyItem, e := models.GetSellerDetailAllByCompanyId(user.CompanyId)
  616. if e != nil {
  617. return
  618. }
  619. if companyItem == nil {
  620. msg = "获取客户所属销售信息失败,UserID:" + strconv.Itoa(user.UserId)
  621. }
  622. var first string
  623. var keyword1 string
  624. var keyword2 string
  625. var keyword3 string
  626. var keyword4 string
  627. var remark string
  628. var redirectUrl string
  629. var mobile string
  630. first = "【" + articleInfo.Title + "】有新的留言,请及时处理"
  631. keyword1 = user.CompanyName + "——" + user.RealName + "(" + companyItem.SellerName + ")"
  632. keyword2 = "留言:" + articleInfo.Title
  633. keyword3 = time.Now().Format(utils.FormatDateTime)
  634. keyword4 = req.Content
  635. remark = "点击查看报告详情"
  636. if articleInfo.ArticleTypeId > 0 {
  637. //研选报告添加汪洋
  638. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic + "," + utils.ActSendMsgMobile
  639. } else {
  640. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic
  641. }
  642. openIdList, e := models.GetWxOpenIdByMobileList(mobile)
  643. if e != nil {
  644. err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
  645. return
  646. }
  647. openIdArr := make([]string, 0)
  648. for _, v := range openIdList {
  649. openIdArr = append(openIdArr, v.OpenId)
  650. }
  651. //mapSource留言跳转类型,1:文章、2:活动、3:微路演视频、4:活动视频、5:活动音频
  652. if utils.RunMode != "release" {
  653. redirectUrl = utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleInfo.ArticleId)
  654. } else {
  655. redirectUrl = utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(msgId) + "&SourceType=1"
  656. }
  657. sendInfo := new(SendWxTemplate)
  658. sendInfo.First = first
  659. sendInfo.Keyword1 = keyword1
  660. sendInfo.Keyword2 = keyword2
  661. sendInfo.Keyword3 = keyword3
  662. sendInfo.Keyword4 = keyword4
  663. sendInfo.Remark = remark
  664. sendInfo.TemplateId = utils.WxMsgTemplateIdAskMsgXzs
  665. sendInfo.RedirectUrl = redirectUrl
  666. sendInfo.RedirectTarget = 3
  667. sendInfo.Resource = strconv.Itoa(req.ArticleId)
  668. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_COMMENT
  669. sendInfo.OpenIdArr = openIdArr
  670. err = PublicSendTemplateMsg(sendInfo)
  671. if err != nil {
  672. return
  673. }
  674. return
  675. }
  676. // 微路演新增留言提问消息提醒
  677. func SendWxMsgWithMicroRoadshowAsk(req models.AddVideoCommnetReq, user *models.WxUserItem, resourceId, msgId int, title string, isResearch bool) (err error) {
  678. var msg string
  679. defer func() {
  680. if err != nil || msg != "" {
  681. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  682. go utils.SendAlarmMsg(fmt.Sprint("发送微路演新增留言提问消息提醒失败,用户名", req.Title, "ID:", req.Id), 2)
  683. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  684. }
  685. }()
  686. companyItem, e := models.GetSellerDetailAllByCompanyId(user.CompanyId)
  687. if e != nil {
  688. return
  689. }
  690. if companyItem == nil {
  691. msg = "获取客户所属销售信息失败,UserID:" + strconv.Itoa(user.UserId)
  692. }
  693. var first string
  694. var keyword1 string
  695. var keyword2 string
  696. var keyword3 string
  697. var keyword4 string
  698. var remark string
  699. var mobile string
  700. first = req.Title + "有新的留言,请及时处理"
  701. keyword1 = user.CompanyName + "——" + user.RealName + "(" + companyItem.SellerName + ")"
  702. keyword3 = time.Now().Format(utils.FormatDateTime)
  703. keyword2 = "留言:" + title
  704. keyword4 = req.Content
  705. if isResearch {
  706. //研选报告添加汪洋
  707. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic + "," + utils.ActSendMsgMobile
  708. } else {
  709. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic
  710. }
  711. openIdList, e := models.GetWxOpenIdByMobileList(mobile)
  712. if e != nil {
  713. err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
  714. return
  715. }
  716. openIdArr := make([]string, 0)
  717. for _, v := range openIdList {
  718. openIdArr = append(openIdArr, v.OpenId)
  719. }
  720. mapSource := make(map[int]string)
  721. mapSource[1] = "5"
  722. mapSource[2] = "4"
  723. mapSource[3] = "3"
  724. if mapSource[resourceId] == "" {
  725. err = errors.New("留言消息类型错误, resourceId: " + strconv.Itoa(resourceId))
  726. return
  727. }
  728. //SourceType int `description:"视频来源: 1-音频; 2-活动视频; 3-微路演视频 (不传默认为1)"`
  729. //mapSource留言跳转类型,1:文章、2:活动、3:微路演视频、4:活动视频、5:活动音频
  730. redirectUrl := ""
  731. if utils.RunMode != "release" {
  732. if req.SourceType == 3 {
  733. redirectUrl = utils.WX_MSG_PATH_ACTIVITY_INDUSTRYR_EPORT + strconv.Itoa(resourceId)
  734. remark = "点击进入产业资源包详情页"
  735. } else {
  736. redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(resourceId)
  737. remark = "点击查看活动详情"
  738. }
  739. } else {
  740. redirectUrl = utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(msgId) + "&SourceType=" + mapSource[resourceId]
  741. }
  742. sendInfo := new(SendWxTemplate)
  743. sendInfo.First = first
  744. sendInfo.Keyword1 = keyword1
  745. sendInfo.Keyword2 = keyword2
  746. sendInfo.Keyword3 = keyword3
  747. sendInfo.Keyword4 = keyword4
  748. sendInfo.Remark = remark
  749. sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
  750. sendInfo.RedirectUrl = redirectUrl
  751. sendInfo.RedirectTarget = 3
  752. sendInfo.Resource = strconv.Itoa(req.Id)
  753. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_COMMENT
  754. sendInfo.OpenIdArr = openIdArr
  755. err = PublicSendTemplateMsg(sendInfo)
  756. if err != nil {
  757. return
  758. }
  759. return
  760. }