wechat_send_msg.go 15 KB

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