wechat_send_msg.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. package services
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "hongze/hongze_mobile_admin/models/tables/admin"
  6. "hongze/hongze_mobile_admin/services/alarm_msg"
  7. "hongze/hongze_mobile_admin/utils"
  8. "io/ioutil"
  9. "net/http"
  10. "strings"
  11. "time"
  12. "errors"
  13. )
  14. type SendWxTemplate struct {
  15. WxAppId string `description:"公众号appId"`
  16. First string `description:"模板消息first字段"`
  17. Keyword1 string `description:"模板消息keyword1字段"`
  18. Keyword2 string `description:"模板消息keyword2字段"`
  19. Keyword3 string `description:"模板消息keyword3字段"`
  20. Keyword4 string `description:"模板消息keyword4字段"`
  21. Remark string `description:"模板消息remark字段"`
  22. TemplateId string `description:"模板id"`
  23. RedirectUrl string `description:"跳转地址"`
  24. RedirectTarget int `description:"小程序跳转目标:1:弘则研报小程序,2:随手办公小程序"`
  25. Resource string `description:"资源唯一标识"`
  26. SendType int `description:"发送的消息类型:1:报告,2:指标更新提醒,3:审批通知,4:销售领取客户通知,5:活动取消通知,6活动更改时间通知,7:关注的作者发布报告通知,8:发送日报(周报、双周报、月报)模板消息,9:活动预约/报名时间通知"`
  27. OpenIdArr []string `description:"消息接收者openid"`
  28. }
  29. type BaseResponse struct {
  30. Ret int
  31. Msg string
  32. ErrMsg string
  33. ErrCode string
  34. Data interface{}
  35. Success bool `description:"true 执行成功,false 执行失败"`
  36. IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
  37. IsAddLog bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
  38. }
  39. type SendTemplateResponse struct {
  40. Errcode int `json:"errcode"`
  41. Errmsg string `json:"errmsg"`
  42. MsgID int `json:"msgid"`
  43. }
  44. // SendCompanyApplyWxTemplateMsg 发送待办消息
  45. func SendCompanyApplyWxTemplateMsg(mobile, redirectUrl, wxAppPath string, wxMsgMap map[int]string) (err error) {
  46. var msg string
  47. defer func() {
  48. if err != nil {
  49. go alarm_msg.SendAlarmMsg(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg), 3)
  50. //go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  51. utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
  52. }
  53. if msg != "" {
  54. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  55. }
  56. }()
  57. utils.FileLog.Info("%s", "services SendMsg")
  58. utils.FileLog.Info("mobile:%s", mobile)
  59. //获取openid列表
  60. openIdStr := WxAdminOpenIdGet()
  61. openIdList, err := admin.GetOpenIdListByMobile(mobile, openIdStr)
  62. if err != nil {
  63. msg = "get openIdList err:" + err.Error()
  64. return
  65. }
  66. utils.FileLog.Info("openIdListCount:%s", len(openIdList))
  67. //fmt.Println("openIdListCount:", len(openIdList))
  68. if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
  69. utils.FileLog.Info("start send")
  70. //sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  71. fmt.Println("send start")
  72. utils.FileLog.Info("send start")
  73. //sendMap := make(map[string]interface{})
  74. //sendData := make(map[string]interface{})
  75. var first, keyword1, keyword2, keyword3, remark string
  76. if tmpStr, ok := wxMsgMap[0]; ok {
  77. first = tmpStr
  78. } else {
  79. first = "Hi,有新的订单需要审批"
  80. }
  81. if tmpStr, ok := wxMsgMap[1]; ok {
  82. keyword1 = tmpStr
  83. }
  84. if tmpStr, ok := wxMsgMap[2]; ok {
  85. keyword2 = tmpStr
  86. }
  87. if tmpStr, ok := wxMsgMap[3]; ok {
  88. keyword3 = tmpStr
  89. }
  90. if tmpStr, ok := wxMsgMap[4]; ok {
  91. remark = tmpStr
  92. }
  93. //sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  94. //sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  95. //sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  96. //sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
  97. //sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  98. //
  99. //sendMap["template_id"] = utils.TemplateIdByCompanyApply
  100. //sendMap["url"] = redirectUrl
  101. //sendMap["data"] = sendData
  102. ////小程序信息
  103. //if wxAppPath != "" {
  104. // sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
  105. //}
  106. //sendTemplateMsg(sendUrl, sendMap, openIdList, mobile, utils.TEMPLATE_MSG_APPLY)
  107. openIdArr := make([]string, len(openIdList))
  108. for i, v := range openIdList {
  109. openIdArr[i] = v.OpenId
  110. }
  111. sendInfo := new(SendWxTemplate)
  112. sendInfo.WxAppId = utils.AdminWxAppId
  113. sendInfo.First = first
  114. sendInfo.Keyword1 = keyword1
  115. sendInfo.Keyword2 = keyword2
  116. sendInfo.Keyword3 = keyword3
  117. sendInfo.Remark = remark
  118. sendInfo.TemplateId = utils.TemplateIdByCompanyApply
  119. sendInfo.RedirectUrl = redirectUrl
  120. sendInfo.RedirectTarget = 2
  121. sendInfo.Resource = mobile
  122. sendInfo.SendType = utils.TEMPLATE_MSG_APPLY
  123. sendInfo.OpenIdArr = openIdArr
  124. if wxAppPath != "" {
  125. sendInfo.RedirectUrl = wxAppPath
  126. }
  127. err = SendTemplateMsg(sendInfo)
  128. }
  129. utils.FileLog.Info("send end")
  130. return
  131. }
  132. // SendWxMsgWithRoadshowDetailResult 路演->销售收到处理结果
  133. func SendWxMsgWithRoadshowDetailResult(first, keyword1, keyword2, remark, mobile, redirectUrl, wxAppPath string) (err error) {
  134. var msg string
  135. defer func() {
  136. if err != nil {
  137. go alarm_msg.SendAlarmMsg(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg), 3)
  138. //go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  139. utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
  140. }
  141. if msg != "" {
  142. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  143. }
  144. }()
  145. utils.FileLog.Info("%s", "services SendMsg")
  146. utils.FileLog.Info("mobile:%s", mobile)
  147. //获取openid列表
  148. openIdStr := WxAdminOpenIdGet()
  149. openIdList, err := admin.GetOpenIdListByMobile(mobile, openIdStr)
  150. if err != nil {
  151. msg = "get openIdList err:" + err.Error()
  152. return
  153. }
  154. utils.FileLog.Info("openIdListCount:%s", len(openIdList))
  155. //fmt.Println("openIdListCount:", len(openIdList))
  156. if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
  157. utils.FileLog.Info("start send")
  158. //sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  159. //fmt.Println("send start")
  160. //utils.FileLog.Info("send start")
  161. //sendMap := make(map[string]interface{})
  162. //sendData := make(map[string]interface{})
  163. //
  164. //sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  165. //sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  166. //sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  167. //sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  168. //
  169. //sendMap["template_id"] = utils.WxMsgTemplateIdWithRoadshowDetailResult
  170. //sendMap["url"] = redirectUrl
  171. //sendMap["data"] = sendData
  172. ////小程序信息
  173. //if wxAppPath != "" {
  174. // sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
  175. //}
  176. //sendTemplateMsg(sendUrl, sendMap, openIdList, wxAppPath, utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT)
  177. openIdArr := make([]string, len(openIdList))
  178. for i, v := range openIdList {
  179. openIdArr[i] = v.OpenId
  180. }
  181. sendInfo := new(SendWxTemplate)
  182. sendInfo.WxAppId = utils.AdminWxAppId
  183. sendInfo.First = first
  184. sendInfo.Keyword1 = keyword1
  185. sendInfo.Keyword2 = keyword2
  186. sendInfo.Remark = remark
  187. sendInfo.TemplateId = utils.WxMsgTemplateIdWithRoadshowDetailResult
  188. if wxAppPath != "" && utils.RunMode == "release" {
  189. sendInfo.RedirectUrl = wxAppPath
  190. }
  191. sendInfo.RedirectTarget = 2
  192. sendInfo.Resource = wxAppPath
  193. sendInfo.SendType = utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT
  194. sendInfo.OpenIdArr = openIdArr
  195. err = SendTemplateMsg(sendInfo)
  196. }
  197. utils.FileLog.Info("send end")
  198. return
  199. }
  200. // SendWxMsgWithRoadshowPending 路演->研究员收到待处理的申请
  201. func SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4, remark, wxAppPath, mobile string) (err error) {
  202. //utils.WxMsgTemplateIdWithRoadshowPending
  203. var msg string
  204. defer func() {
  205. if err != nil {
  206. //go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  207. go alarm_msg.SendAlarmMsg("发送模版消息失败,Err:"+err.Error()+msg, 3)
  208. utils.FileLog.Info("发送模版消息失败,Err:" + err.Error() + msg)
  209. }
  210. if msg != "" {
  211. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  212. }
  213. }()
  214. utils.FileLog.Info("%s", "services SendMsg")
  215. //获取openid列表
  216. openIdStr := WxAdminOpenIdGet()
  217. openIdList, err := admin.GetOpenIdListByMobile(mobile, openIdStr)
  218. if err != nil {
  219. msg = "get openIdList err:" + err.Error()
  220. return
  221. }
  222. utils.FileLog.Info("openIdListCount:%s", len(openIdList))
  223. //fmt.Println("openIdListCount:", len(openIdList))
  224. if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
  225. utils.FileLog.Info("start send")
  226. //sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  227. //fmt.Println("send start")
  228. //utils.FileLog.Info("send start")
  229. //sendMap := make(map[string]interface{})
  230. //sendData := make(map[string]interface{})
  231. //
  232. //sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  233. //sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  234. //sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  235. //sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
  236. //sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
  237. //sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  238. //
  239. //sendMap["template_id"] = utils.WxMsgTemplateIdWithRoadshowPending
  240. //sendMap["data"] = sendData
  241. ////小程序信息
  242. //if wxAppPath != "" {
  243. // sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
  244. //}
  245. //sendTemplateMsg(sendUrl, sendMap, openIdList, wxAppPath, utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT)
  246. openIdArr := make([]string, len(openIdList))
  247. for i, v := range openIdList {
  248. openIdArr[i] = v.OpenId
  249. }
  250. sendInfo := new(SendWxTemplate)
  251. sendInfo.WxAppId = utils.AdminWxAppId
  252. sendInfo.First = first
  253. sendInfo.Keyword1 = keyword1
  254. sendInfo.Keyword2 = keyword2
  255. sendInfo.Keyword3 = keyword3
  256. sendInfo.Keyword4 = keyword4
  257. sendInfo.Remark = remark
  258. sendInfo.TemplateId = utils.WxMsgTemplateIdWithRoadshowPending
  259. if wxAppPath != "" && utils.RunMode == "release" {
  260. sendInfo.RedirectUrl = wxAppPath
  261. }
  262. sendInfo.RedirectTarget = 2
  263. sendInfo.Resource = wxAppPath
  264. sendInfo.SendType = utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT
  265. sendInfo.OpenIdArr = openIdArr
  266. err = SendTemplateMsg(sendInfo)
  267. }
  268. utils.FileLog.Info("send end")
  269. return
  270. }
  271. // SendWxMsgWithRoadshowDeleteNotice 路演->研究员收到活动删除通知
  272. func SendWxMsgWithRoadshowDeleteNotice(first, keyword1, keyword2, remark, wxAppPath, mobile string) (err error) {
  273. var msg string
  274. defer func() {
  275. if err != nil {
  276. //go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  277. go alarm_msg.SendAlarmMsg("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05")+";Msg:"+msg+";Err:"+err.Error(), 3)
  278. utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
  279. }
  280. if msg != "" {
  281. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  282. }
  283. }()
  284. utils.FileLog.Info("%s", "services SendMsg")
  285. //获取openid列表
  286. openIdStr := WxAdminOpenIdGet()
  287. openIdList, err := admin.GetOpenIdListByMobile(mobile, openIdStr)
  288. if err != nil {
  289. msg = "get openIdList err:" + err.Error()
  290. return
  291. }
  292. utils.FileLog.Info("openIdListCount:%s", len(openIdList))
  293. //fmt.Println("openIdListCount:", len(openIdList))
  294. if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
  295. utils.FileLog.Info("start send")
  296. //sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  297. //sendMap := make(map[string]interface{})
  298. //sendData := make(map[string]interface{})
  299. //
  300. //sendMap["template_id"] = utils.WxMsgTemplateIdWithRoadshowDeleteNotice
  301. //sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  302. //sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  303. //sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  304. //sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  305. ////小程序信息
  306. //if wxAppPath != "" {
  307. // sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
  308. //}
  309. //sendMap["data"] = sendData
  310. //sendTemplateMsg(sendUrl, sendMap, openIdList, wxAppPath, utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT)
  311. openIdArr := make([]string, len(openIdList))
  312. for i, v := range openIdList {
  313. openIdArr[i] = v.OpenId
  314. }
  315. sendInfo := new(SendWxTemplate)
  316. sendInfo.WxAppId = utils.AdminWxAppId
  317. sendInfo.First = first
  318. sendInfo.Keyword1 = keyword1
  319. sendInfo.Keyword2 = keyword2
  320. sendInfo.Remark = remark
  321. sendInfo.TemplateId = utils.WxMsgTemplateIdWithRoadshowDeleteNotice
  322. if wxAppPath != "" && utils.RunMode == "release" {
  323. sendInfo.RedirectUrl = wxAppPath
  324. }
  325. sendInfo.RedirectTarget = 2
  326. sendInfo.Resource = wxAppPath
  327. sendInfo.SendType = utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT
  328. sendInfo.OpenIdArr = openIdArr
  329. err = SendTemplateMsg(sendInfo)
  330. }
  331. utils.FileLog.Info("send end")
  332. return
  333. }
  334. // SendSealFinishedWxTemplateMsg 给销售发送 用印申请已签回的模版消息
  335. func SendSealFinishedWxTemplateMsg(mobile string, companyName string, sealId int) (err error) {
  336. var msg string
  337. defer func() {
  338. if err != nil {
  339. fmt.Println("err:", err)
  340. go alarm_msg.SendAlarmMsg("发送模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
  341. utils.FileLog.Info(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg))
  342. }
  343. if msg != "" {
  344. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  345. }
  346. }()
  347. utils.FileLog.Info("%s", "services SendMsg")
  348. utils.FileLog.Info("mobile:%s", mobile)
  349. openIdStr := WxAdminOpenIdGet()
  350. openIdList, err := admin.GetOpenIdListByMobile(mobile, openIdStr)
  351. if err != nil {
  352. msg = "get openIdList err:" + err.Error()
  353. return
  354. }
  355. utils.FileLog.Info("openIdListCount:%s", len(openIdList))
  356. if len(openIdList) > 0 && utils.WxMsgTemplateIdWithSealApplyFinished != "" {
  357. utils.FileLog.Info("start send")
  358. //sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  359. //fmt.Println("send start")
  360. //utils.FileLog.Info("send start")
  361. //sendMap := make(map[string]interface{})
  362. //sendData := make(map[string]interface{})
  363. first := "您的用印申请已签回,可前往提交转正/续约申请"
  364. keyword1 := companyName
  365. keyword2 := "已签回"
  366. remark := "点击查看用印详情"
  367. //
  368. //sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  369. //sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  370. //sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  371. //sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  372. //
  373. //sendMap["template_id"] = utils.WxMsgTemplateIdWithSealApplyFinished
  374. //sendMap["url"] = "" //跳转地址
  375. //sendMap["data"] = sendData
  376. // TODO 随手办公小程序的跳转地址
  377. wxAppPath := fmt.Sprintf("pages-approve/seal/detail?SealId=%d", sealId)
  378. //sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
  379. //err = sendTemplateMsg(sendUrl, sendMap, openIdList, wxAppPath, utils.TEMPLATE_MSG_SEAL_FINISHED)
  380. openIdArr := make([]string, len(openIdList))
  381. for i, v := range openIdList {
  382. openIdArr[i] = v.OpenId
  383. }
  384. sendInfo := new(SendWxTemplate)
  385. sendInfo.WxAppId = utils.AdminWxAppId
  386. sendInfo.First = first
  387. sendInfo.Keyword1 = keyword1
  388. sendInfo.Keyword2 = keyword2
  389. sendInfo.Remark = remark
  390. sendInfo.RedirectUrl = wxAppPath
  391. sendInfo.TemplateId = utils.WxMsgTemplateIdWithSealApplyFinished
  392. sendInfo.RedirectTarget = 2
  393. sendInfo.Resource = wxAppPath
  394. sendInfo.SendType = utils.TEMPLATE_MSG_SEAL_FINISHED
  395. sendInfo.OpenIdArr = openIdArr
  396. err = SendTemplateMsg(sendInfo)
  397. }
  398. utils.FileLog.Info("send end")
  399. return
  400. }
  401. // SendYbQuestionDistributeWxMsg 推送研报小程序模板消息-问答社区分配
  402. func SendYbQuestionDistributeWxMsg(questionId, adminId int, openid, questionTitle string) (err error) {
  403. var errMsg string
  404. defer func() {
  405. if err != nil {
  406. alarmMsg := fmt.Sprintf("SendMiniProgramReportWxMsg-推送问答社区分配模版消息失败; QuestionId: %d; Err: %s; Msg: %s", questionId, err.Error(), errMsg)
  407. utils.FileLog.Error(alarmMsg)
  408. go alarm_msg.SendAlarmMsg(alarmMsg, 3)
  409. }
  410. }()
  411. openIdList := make([]*admin.OpenIdList, 0)
  412. openIdList = append(openIdList, &admin.OpenIdList{
  413. OpenId: openid,
  414. AdminId: adminId,
  415. })
  416. //sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  417. //sendMap := make(map[string]interface{})
  418. //sendData := make(map[string]interface{})
  419. first := "您好,有新的提问待回复"
  420. keyword1 := questionTitle
  421. keyword2 := "待回复"
  422. remark := "请点击详情尽快处理"
  423. //sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  424. //sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  425. //sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  426. //sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  427. //
  428. //sendMap["template_id"] = utils.WxMsgTemplateIdWithYbCommunityQuestion
  429. //sendMap["data"] = sendData
  430. //
  431. wxAppPath := fmt.Sprintf("pages-question/answerDetail?id=%d", questionId)
  432. //if wxAppPath != "" {
  433. // sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxYbAppId, "pagepath": wxAppPath}
  434. //}
  435. //err = sendTemplateMsg(sendUrl, sendMap, openIdList, wxAppPath, utils.TEMPLATE_MSG_YB_COMMUNITY_QUESTION)
  436. openIdArr := make([]string, len(openIdList))
  437. for i, v := range openIdList {
  438. openIdArr[i] = v.OpenId
  439. }
  440. sendInfo := new(SendWxTemplate)
  441. sendInfo.WxAppId = utils.AdminWxAppId
  442. sendInfo.First = first
  443. sendInfo.Keyword1 = keyword1
  444. sendInfo.Keyword2 = keyword2
  445. sendInfo.Remark = remark
  446. sendInfo.RedirectUrl = wxAppPath
  447. sendInfo.TemplateId = utils.WxMsgTemplateIdWithYbCommunityQuestion
  448. sendInfo.RedirectTarget = 1
  449. sendInfo.Resource = wxAppPath
  450. sendInfo.SendType = utils.TEMPLATE_MSG_YB_COMMUNITY_QUESTION
  451. sendInfo.OpenIdArr = openIdArr
  452. err = SendTemplateMsg(sendInfo)
  453. utils.FileLog.Info("send end")
  454. return
  455. }
  456. //推送模板消息
  457. func SendTemplateMsg(sendInfo *SendWxTemplate) (err error) {
  458. postData, err := json.Marshal(sendInfo)
  459. if err != nil {
  460. alarm_msg.SendAlarmMsg("SendTemplateMsg json.Marshal Err:"+err.Error(), 1)
  461. return err
  462. }
  463. body := ioutil.NopCloser(strings.NewReader(string(postData)))
  464. client := &http.Client{}
  465. req, err := http.NewRequest("POST", utils.SendWxTemplateMsgUrl, body)
  466. if err != nil {
  467. alarm_msg.SendAlarmMsg("SendTemplateMsg http.NewRequest Err:"+err.Error(), 1)
  468. return err
  469. }
  470. contentType := "application/json;charset=utf-8"
  471. req.Header.Set("Content-Type", contentType)
  472. req.Header.Set("Authorization", utils.SendTemplateMsgAuthorization)
  473. resp, err := client.Do(req)
  474. if err != nil {
  475. fmt.Println("http client.Do Err:" + err.Error())
  476. return err
  477. }
  478. defer resp.Body.Close()
  479. b, err := ioutil.ReadAll(resp.Body)
  480. if err != nil {
  481. return err
  482. }
  483. result := new(BaseResponse)
  484. err = json.Unmarshal(b, &result)
  485. if err != nil {
  486. return err
  487. }
  488. if result.Ret != 200 {
  489. err = errors.New(string(b))
  490. return err
  491. }
  492. return
  493. }