wechat_send_msg.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. package services
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "hongze/hongze_mobile_admin/models/tables/report"
  7. "hongze/hongze_mobile_admin/models/tables/user_template_record"
  8. "hongze/hongze_mobile_admin/models/tables/wx_user"
  9. "hongze/hongze_mobile_admin/services/alarm_msg"
  10. "hongze/hongze_mobile_admin/utils"
  11. "io/ioutil"
  12. "net/http"
  13. "strconv"
  14. "time"
  15. )
  16. func SendWxTemplateMsg(reportId int) (err error) {
  17. var msg string
  18. defer func() {
  19. if err != nil {
  20. go alarm_msg.SendAlarmMsg(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg), 3)
  21. //go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  22. utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
  23. }
  24. if msg != "" {
  25. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  26. }
  27. }()
  28. utils.FileLog.Info("%s", "services SendMsg")
  29. report, err := report.GetReportById(reportId)
  30. if err != nil {
  31. msg = "GetReportInfo Err:" + err.Error()
  32. return
  33. }
  34. if report == nil {
  35. utils.FileLog.Info("报告信息不存在")
  36. return
  37. }
  38. accessToken, err := WxGetAccessToken()
  39. if err != nil {
  40. msg = "GetWxAccessToken Err:" + err.Error()
  41. return
  42. }
  43. if accessToken == "" {
  44. msg = "accessToken is empty"
  45. return
  46. }
  47. //获取openid列表
  48. openIdStr := WxUsersGet()
  49. openIdList, err := wx_user.GetOpenIdList(openIdStr)
  50. if err != nil {
  51. msg = "get openIdList err:" + err.Error()
  52. return
  53. }
  54. fmt.Println("openIdListCount:", len(openIdList))
  55. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  56. fmt.Println("send start")
  57. utils.FileLog.Info("send start")
  58. //if report.MsgIsSend == 0 {
  59. sendMap := make(map[string]interface{})
  60. sendData := make(map[string]interface{})
  61. redirectUrl := utils.TemplateRedirectUrl + strconv.Itoa(reportId)
  62. keyword1 := "弘则日度点评"
  63. first := "Hi,最新一期日度点评已上线,欢迎查看"
  64. keyword2 := report.Title
  65. //keyword3 := report.PublishTime.Format(utils.FormatDateTime)
  66. keyword3 := report.PublishTime
  67. keyword4 := report.Abstract
  68. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  69. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  70. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  71. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
  72. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
  73. sendMap["template_id"] = utils.TemplateIdByProduct
  74. sendMap["url"] = redirectUrl
  75. sendMap["data"] = sendData
  76. sendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(reportId), utils.TEMPLATE_MSG_REPORT)
  77. //}
  78. fmt.Println("send end")
  79. utils.FileLog.Info("send end")
  80. return
  81. }
  82. func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*wx_user.OpenIdList, resource string, sendType int) (err error) {
  83. for _, v := range items {
  84. sendMap["touser"] = v.OpenId
  85. data, err := json.Marshal(sendMap)
  86. if err != nil {
  87. fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
  88. utils.FileLog.Info(fmt.Sprintf("SendTemplateMsgOne Marshal Err:%s", err.Error()))
  89. return err
  90. }
  91. err = toSendTemplateMsg(sendUrl, data, resource, sendType, v)
  92. if err != nil {
  93. fmt.Println("send err:", err.Error())
  94. utils.FileLog.Info(fmt.Sprintf("ToSendTemplateMsg Err:%s", err.Error()))
  95. }
  96. }
  97. return
  98. }
  99. func toSendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, dataItem *wx_user.OpenIdList) (err error) {
  100. utils.FileLog.Info("Send:" + string(data))
  101. client := http.Client{}
  102. resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
  103. if err != nil {
  104. return
  105. }
  106. defer resp.Body.Close()
  107. body, _ := ioutil.ReadAll(resp.Body)
  108. utils.FileLog.Info("SendResult:" + string(body))
  109. var templateResponse SendTemplateResponse
  110. err = json.Unmarshal(body, &templateResponse)
  111. if err != nil {
  112. utils.FileLog.Info("SendResult Unmarshal Err:%s", err.Error())
  113. return err
  114. }
  115. //新增模板消息推送记录
  116. {
  117. sendStatus := 0
  118. if templateResponse.Errcode == 0 {
  119. sendStatus = 1
  120. } else {
  121. sendStatus = 0
  122. }
  123. tr := &user_template_record.UserTemplateRecord{
  124. Id: 0,
  125. UserId: dataItem.UserId,
  126. OpenId: dataItem.OpenId,
  127. Resource: resource,
  128. SendData: string(data),
  129. Result: string(body),
  130. CreateDate: time.Now().Format(utils.FormatDate),
  131. CreateTime: time.Now().Format(utils.FormatDateTime),
  132. SendStatus: sendStatus,
  133. SendType: sendType,
  134. }
  135. go func() {
  136. err = user_template_record.AddUserTemplateRecord(tr)
  137. if err != nil {
  138. utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
  139. }
  140. }()
  141. }
  142. return
  143. }
  144. type SendTemplateResponse struct {
  145. Errcode int `json:"errcode"`
  146. Errmsg string `json:"errmsg"`
  147. MsgID int `json:"msgid"`
  148. }
  149. // SendCompanyApplyWxTemplateMsg 发送待办消息
  150. func SendCompanyApplyWxTemplateMsg(mobile, redirectUrl, wxAppPath string, wxMsgMap map[int]string) (err error) {
  151. var msg string
  152. defer func() {
  153. if err != nil {
  154. go alarm_msg.SendAlarmMsg(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg), 3)
  155. //go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  156. utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
  157. }
  158. if msg != "" {
  159. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  160. }
  161. }()
  162. utils.FileLog.Info("%s", "services SendMsg")
  163. accessToken, err := WxGetAccessToken()
  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. utils.FileLog.Info("mobile:%s", mobile)
  173. //获取openid列表
  174. openIdStr := WxUsersGet()
  175. openIdList, err := wx_user.GetOpenIdListByMobile(mobile, openIdStr)
  176. if err != nil {
  177. msg = "get openIdList err:" + err.Error()
  178. return
  179. }
  180. utils.FileLog.Info("openIdListCount:%s", len(openIdList))
  181. //fmt.Println("openIdListCount:", len(openIdList))
  182. if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
  183. utils.FileLog.Info("start send")
  184. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  185. fmt.Println("send start")
  186. utils.FileLog.Info("send start")
  187. sendMap := make(map[string]interface{})
  188. sendData := make(map[string]interface{})
  189. var first, keyword1, keyword2, keyword3, remark string
  190. if tmpStr, ok := wxMsgMap[0]; ok {
  191. first = tmpStr
  192. } else {
  193. first = "Hi,有新的订单需要审批"
  194. }
  195. if tmpStr, ok := wxMsgMap[1]; ok {
  196. keyword1 = tmpStr
  197. }
  198. if tmpStr, ok := wxMsgMap[2]; ok {
  199. keyword2 = tmpStr
  200. }
  201. if tmpStr, ok := wxMsgMap[3]; ok {
  202. keyword3 = tmpStr
  203. }
  204. if tmpStr, ok := wxMsgMap[4]; ok {
  205. remark = tmpStr
  206. }
  207. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  208. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  209. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  210. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
  211. sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  212. sendMap["template_id"] = utils.TemplateIdByCompanyApply
  213. sendMap["url"] = redirectUrl
  214. sendMap["data"] = sendData
  215. //小程序信息
  216. if wxAppPath != "" {
  217. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
  218. }
  219. sendTemplateMsg(sendUrl, sendMap, openIdList, mobile, utils.TEMPLATE_MSG_APPLY)
  220. }
  221. utils.FileLog.Info("send end")
  222. return
  223. }
  224. // 路演->销售收到处理结果
  225. func SendWxMsgWithRoadshowDetailResult(first, keyword1, keyword2, remark, mobile, redirectUrl, wxAppPath string) (err error) {
  226. var msg string
  227. defer func() {
  228. if err != nil {
  229. go alarm_msg.SendAlarmMsg(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg), 3)
  230. //go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  231. utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
  232. }
  233. if msg != "" {
  234. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  235. }
  236. }()
  237. utils.FileLog.Info("%s", "services SendMsg")
  238. accessToken, err := WxGetAccessToken()
  239. if err != nil {
  240. msg = "GetWxAccessToken Err:" + err.Error()
  241. return
  242. }
  243. if accessToken == "" {
  244. msg = "accessToken is empty"
  245. return
  246. }
  247. utils.FileLog.Info("mobile:%s", mobile)
  248. //获取openid列表
  249. openIdStr := WxUsersGet()
  250. openIdList, err := wx_user.GetOpenIdListByMobile(mobile, openIdStr)
  251. if err != nil {
  252. msg = "get openIdList err:" + err.Error()
  253. return
  254. }
  255. utils.FileLog.Info("openIdListCount:%s", len(openIdList))
  256. //fmt.Println("openIdListCount:", len(openIdList))
  257. if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
  258. utils.FileLog.Info("start send")
  259. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  260. fmt.Println("send start")
  261. utils.FileLog.Info("send start")
  262. sendMap := make(map[string]interface{})
  263. sendData := make(map[string]interface{})
  264. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  265. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  266. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  267. sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  268. sendMap["template_id"] = utils.WxMsgTemplateIdWithRoadshowDetailResult
  269. sendMap["url"] = redirectUrl
  270. sendMap["data"] = sendData
  271. //小程序信息
  272. if wxAppPath != "" {
  273. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
  274. }
  275. sendTemplateMsg(sendUrl, sendMap, openIdList, wxAppPath, utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT)
  276. }
  277. utils.FileLog.Info("send end")
  278. return
  279. }
  280. // 路演->研究员收到待处理的申请
  281. func SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4, remark, wxAppPath, mobile string) (err error) {
  282. //utils.WxMsgTemplateIdWithRoadshowPending
  283. var msg string
  284. defer func() {
  285. if err != nil {
  286. //go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  287. go alarm_msg.SendAlarmMsg("发送模版消息失败,Err:"+err.Error()+msg, 3)
  288. utils.FileLog.Info("发送模版消息失败,Err:" + err.Error() + msg)
  289. }
  290. if msg != "" {
  291. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  292. }
  293. }()
  294. utils.FileLog.Info("%s", "services SendMsg")
  295. accessToken, err := WxGetAccessToken()
  296. if err != nil {
  297. msg = "GetWxAccessToken Err:" + err.Error()
  298. return
  299. }
  300. if accessToken == "" {
  301. msg = "accessToken is empty"
  302. return
  303. }
  304. //获取openid列表
  305. openIdStr := WxUsersGet()
  306. openIdList, err := wx_user.GetOpenIdListByMobile(mobile, openIdStr)
  307. if err != nil {
  308. msg = "get openIdList err:" + err.Error()
  309. return
  310. }
  311. utils.FileLog.Info("openIdListCount:%s", len(openIdList))
  312. //fmt.Println("openIdListCount:", len(openIdList))
  313. if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
  314. utils.FileLog.Info("start send")
  315. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  316. fmt.Println("send start")
  317. utils.FileLog.Info("send start")
  318. sendMap := make(map[string]interface{})
  319. sendData := make(map[string]interface{})
  320. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  321. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  322. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  323. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
  324. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
  325. sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  326. sendMap["template_id"] = utils.WxMsgTemplateIdWithRoadshowPending
  327. sendMap["data"] = sendData
  328. //小程序信息
  329. if wxAppPath != "" {
  330. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
  331. }
  332. sendTemplateMsg(sendUrl, sendMap, openIdList, wxAppPath, utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT)
  333. }
  334. utils.FileLog.Info("send end")
  335. return
  336. }
  337. // 路演->研究员收到活动删除通知
  338. func SendWxMsgWithRoadshowDeleteNotice(first, keyword1, keyword2, remark, wxAppPath, mobile string) (err error) {
  339. var msg string
  340. defer func() {
  341. if err != nil {
  342. //go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  343. go alarm_msg.SendAlarmMsg("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05")+";Msg:"+msg+";Err:"+err.Error(), 3)
  344. utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
  345. }
  346. if msg != "" {
  347. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  348. }
  349. }()
  350. utils.FileLog.Info("%s", "services SendMsg")
  351. accessToken, err := WxGetAccessToken()
  352. if err != nil {
  353. msg = "GetWxAccessToken Err:" + err.Error()
  354. return
  355. }
  356. if accessToken == "" {
  357. msg = "accessToken is empty"
  358. return
  359. }
  360. //获取openid列表
  361. openIdStr := WxUsersGet()
  362. openIdList, err := wx_user.GetOpenIdListByMobile(mobile, openIdStr)
  363. if err != nil {
  364. msg = "get openIdList err:" + err.Error()
  365. return
  366. }
  367. utils.FileLog.Info("openIdListCount:%s", len(openIdList))
  368. //fmt.Println("openIdListCount:", len(openIdList))
  369. if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
  370. utils.FileLog.Info("start send")
  371. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  372. sendMap := make(map[string]interface{})
  373. sendData := make(map[string]interface{})
  374. sendMap["template_id"] = utils.WxMsgTemplateIdWithRoadshowDeleteNotice
  375. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  376. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  377. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  378. sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  379. //小程序信息
  380. if wxAppPath != "" {
  381. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
  382. }
  383. sendMap["data"] = sendData
  384. sendTemplateMsg(sendUrl, sendMap, openIdList, wxAppPath, utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT)
  385. }
  386. utils.FileLog.Info("send end")
  387. return
  388. }
  389. // SendYbQuestionDistributeWxMsg 推送研报小程序模板消息-问答社区分配
  390. func SendYbQuestionDistributeWxMsg(questionId, userId int, openid, questionTitle string) (err error) {
  391. var errMsg string
  392. defer func() {
  393. if err != nil {
  394. alarmMsg := fmt.Sprintf("SendMiniProgramReportWxMsg-推送问答社区分配模版消息失败; QuestionId: %d; Err: %s; Msg: %s", questionId, err.Error(), errMsg)
  395. utils.FileLog.Error(alarmMsg)
  396. go alarm_msg.SendAlarmMsg(alarmMsg, 3)
  397. }
  398. }()
  399. accessToken, err := WxGetAccessToken()
  400. if err != nil {
  401. errMsg = "GetWxAccessToken Err:" + err.Error()
  402. return
  403. }
  404. if accessToken == "" {
  405. errMsg = "accessToken is empty"
  406. return
  407. }
  408. openIdList := make([]*wx_user.OpenIdList, 0)
  409. openIdList = append(openIdList, &wx_user.OpenIdList{
  410. OpenId: openid,
  411. UserId: userId,
  412. })
  413. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  414. sendMap := make(map[string]interface{})
  415. sendData := make(map[string]interface{})
  416. first := "您好,有新的提问待回复"
  417. keyword1 := questionTitle
  418. keyword2 := "待回复"
  419. remark := "请点击详情尽快处理"
  420. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  421. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  422. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  423. sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  424. sendMap["template_id"] = utils.WxMsgTemplateIdWithYbCommunityQuestion
  425. sendMap["data"] = sendData
  426. wxAppPath := fmt.Sprintf("pages-question/answerDetail?id=%d", questionId)
  427. if wxAppPath != "" {
  428. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxYbAppId, "pagepath": wxAppPath}
  429. }
  430. err = sendTemplateMsg(sendUrl, sendMap, openIdList, wxAppPath, utils.TEMPLATE_MSG_YB_COMMUNITY_QUESTION)
  431. return
  432. }