wechat_send_msg.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729
  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. "strings"
  15. "time"
  16. "errors"
  17. )
  18. type SendWxTemplate struct {
  19. First string `description:"模板消息first字段"`
  20. Keyword1 string `description:"模板消息keyword1字段"`
  21. Keyword2 string `description:"模板消息keyword2字段"`
  22. Keyword3 string `description:"模板消息keyword3字段"`
  23. Keyword4 string `description:"模板消息keyword4字段"`
  24. Remark string `description:"模板消息remark字段"`
  25. TemplateId string `description:"模板id"`
  26. RedirectUrl string `description:"跳转地址"`
  27. RedirectTarget int `description:"小程序跳转目标:1:弘则研报小程序,2:随手办公小程序"`
  28. Resource string `description:"资源唯一标识"`
  29. SendType int `description:"发送的消息类型:1:报告,2:指标更新提醒,3:审批通知,4:销售领取客户通知,5:活动取消通知,6活动更改时间通知,7:关注的作者发布报告通知,8:发送日报(周报、双周报、月报)模板消息,9:活动预约/报名时间通知"`
  30. OpenIdArr []string `description:"消息接收者openid"`
  31. }
  32. type BaseResponse struct {
  33. Ret int
  34. Msg string
  35. ErrMsg string
  36. ErrCode string
  37. Data interface{}
  38. Success bool `description:"true 执行成功,false 执行失败"`
  39. IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
  40. IsAddLog bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
  41. }
  42. func SendWxTemplateMsg(reportId int) (err error) {
  43. var msg string
  44. defer func() {
  45. if err != nil {
  46. go alarm_msg.SendAlarmMsg(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg), 3)
  47. //go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  48. utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
  49. }
  50. if msg != "" {
  51. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  52. }
  53. }()
  54. utils.FileLog.Info("%s", "services SendMsg")
  55. report, err := report.GetReportById(reportId)
  56. if err != nil {
  57. msg = "GetReportInfo Err:" + err.Error()
  58. return
  59. }
  60. if report == nil {
  61. utils.FileLog.Info("报告信息不存在")
  62. return
  63. }
  64. accessToken, err := WxGetAccessToken()
  65. if err != nil {
  66. msg = "GetWxAccessToken Err:" + err.Error()
  67. return
  68. }
  69. if accessToken == "" {
  70. msg = "accessToken is empty"
  71. return
  72. }
  73. //获取openid列表
  74. openIdStr := WxUsersGet()
  75. openIdList, err := wx_user.GetOpenIdList(openIdStr)
  76. if err != nil {
  77. msg = "get openIdList err:" + err.Error()
  78. return
  79. }
  80. fmt.Println("openIdListCount:", len(openIdList))
  81. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  82. fmt.Println("send start")
  83. utils.FileLog.Info("send start")
  84. //if report.MsgIsSend == 0 {
  85. sendMap := make(map[string]interface{})
  86. sendData := make(map[string]interface{})
  87. redirectUrl := utils.TemplateRedirectUrl + strconv.Itoa(reportId)
  88. keyword1 := "弘则日度点评"
  89. first := "Hi,最新一期日度点评已上线,欢迎查看"
  90. keyword2 := report.Title
  91. //keyword3 := report.PublishTime.Format(utils.FormatDateTime)
  92. keyword3 := report.PublishTime
  93. keyword4 := report.Abstract
  94. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  95. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  96. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  97. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
  98. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
  99. sendMap["template_id"] = utils.TemplateIdByProduct
  100. sendMap["url"] = redirectUrl
  101. sendMap["data"] = sendData
  102. sendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(reportId), utils.TEMPLATE_MSG_REPORT)
  103. //}
  104. fmt.Println("send end")
  105. utils.FileLog.Info("send end")
  106. return
  107. }
  108. func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*wx_user.OpenIdList, resource string, sendType int) (err error) {
  109. for _, v := range items {
  110. sendMap["touser"] = v.OpenId
  111. data, err := json.Marshal(sendMap)
  112. if err != nil {
  113. fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
  114. utils.FileLog.Info(fmt.Sprintf("SendTemplateMsgOne Marshal Err:%s", err.Error()))
  115. return err
  116. }
  117. err = toSendTemplateMsg(sendUrl, data, resource, sendType, v)
  118. if err != nil {
  119. fmt.Println("send err:", err.Error())
  120. utils.FileLog.Info(fmt.Sprintf("ToSendTemplateMsg Err:%s", err.Error()))
  121. }
  122. }
  123. return
  124. }
  125. func toSendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, dataItem *wx_user.OpenIdList) (err error) {
  126. utils.FileLog.Info("Send:" + string(data))
  127. client := http.Client{}
  128. resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
  129. if err != nil {
  130. return
  131. }
  132. defer resp.Body.Close()
  133. body, _ := ioutil.ReadAll(resp.Body)
  134. utils.FileLog.Info("SendResult:" + string(body))
  135. var templateResponse SendTemplateResponse
  136. err = json.Unmarshal(body, &templateResponse)
  137. if err != nil {
  138. utils.FileLog.Info("SendResult Unmarshal Err:%s", err.Error())
  139. return err
  140. }
  141. //新增模板消息推送记录
  142. {
  143. sendStatus := 0
  144. if templateResponse.Errcode == 0 {
  145. sendStatus = 1
  146. } else {
  147. sendStatus = 0
  148. }
  149. tr := &user_template_record.UserTemplateRecord{
  150. Id: 0,
  151. UserId: dataItem.UserId,
  152. OpenId: dataItem.OpenId,
  153. Resource: resource,
  154. SendData: string(data),
  155. Result: string(body),
  156. CreateDate: time.Now().Format(utils.FormatDate),
  157. CreateTime: time.Now().Format(utils.FormatDateTime),
  158. SendStatus: sendStatus,
  159. SendType: sendType,
  160. }
  161. go func() {
  162. err = user_template_record.AddUserTemplateRecord(tr)
  163. if err != nil {
  164. utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
  165. }
  166. }()
  167. }
  168. return
  169. }
  170. type SendTemplateResponse struct {
  171. Errcode int `json:"errcode"`
  172. Errmsg string `json:"errmsg"`
  173. MsgID int `json:"msgid"`
  174. }
  175. // SendCompanyApplyWxTemplateMsg 发送待办消息
  176. func SendCompanyApplyWxTemplateMsg(mobile, redirectUrl, wxAppPath string, wxMsgMap map[int]string) (err error) {
  177. var msg string
  178. defer func() {
  179. if err != nil {
  180. go alarm_msg.SendAlarmMsg(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg), 3)
  181. //go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  182. utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
  183. }
  184. if msg != "" {
  185. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  186. }
  187. }()
  188. utils.FileLog.Info("%s", "services SendMsg")
  189. accessToken, err := WxGetAccessToken()
  190. if err != nil {
  191. msg = "GetWxAccessToken Err:" + err.Error()
  192. return
  193. }
  194. if accessToken == "" {
  195. msg = "accessToken is empty"
  196. return
  197. }
  198. utils.FileLog.Info("mobile:%s", mobile)
  199. //获取openid列表
  200. //openIdStr := WxUsersGet()
  201. openIdList, err := wx_user.GetOpenIdListByMobile(mobile)
  202. if err != nil {
  203. msg = "get openIdList err:" + err.Error()
  204. return
  205. }
  206. utils.FileLog.Info("openIdListCount:%s", len(openIdList))
  207. //fmt.Println("openIdListCount:", len(openIdList))
  208. if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
  209. utils.FileLog.Info("start send")
  210. //sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  211. fmt.Println("send start")
  212. utils.FileLog.Info("send start")
  213. //sendMap := make(map[string]interface{})
  214. //sendData := make(map[string]interface{})
  215. var first, keyword1, keyword2, keyword3, remark string
  216. if tmpStr, ok := wxMsgMap[0]; ok {
  217. first = tmpStr
  218. } else {
  219. first = "Hi,有新的订单需要审批"
  220. }
  221. if tmpStr, ok := wxMsgMap[1]; ok {
  222. keyword1 = tmpStr
  223. }
  224. if tmpStr, ok := wxMsgMap[2]; ok {
  225. keyword2 = tmpStr
  226. }
  227. if tmpStr, ok := wxMsgMap[3]; ok {
  228. keyword3 = tmpStr
  229. }
  230. if tmpStr, ok := wxMsgMap[4]; ok {
  231. remark = tmpStr
  232. }
  233. //sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  234. //sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  235. //sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  236. //sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
  237. //sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  238. //
  239. //sendMap["template_id"] = utils.TemplateIdByCompanyApply
  240. //sendMap["url"] = redirectUrl
  241. //sendMap["data"] = sendData
  242. ////小程序信息
  243. //if wxAppPath != "" {
  244. // sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
  245. //}
  246. //sendTemplateMsg(sendUrl, sendMap, openIdList, mobile, utils.TEMPLATE_MSG_APPLY)
  247. openIdArr := make([]string, len(openIdList))
  248. for i, v := range openIdList {
  249. openIdArr[i] = v.OpenId
  250. }
  251. sendInfo := new(SendWxTemplate)
  252. sendInfo.First = first
  253. sendInfo.Keyword1 = keyword1
  254. sendInfo.Keyword2 = keyword2
  255. sendInfo.Keyword3 = keyword3
  256. sendInfo.Remark = remark
  257. sendInfo.TemplateId = utils.TemplateIdByCompanyApply
  258. sendInfo.RedirectUrl = redirectUrl
  259. sendInfo.RedirectTarget = 2
  260. sendInfo.Resource = mobile
  261. sendInfo.SendType = utils.TEMPLATE_MSG_APPLY
  262. sendInfo.OpenIdArr = openIdArr
  263. if wxAppPath != "" {
  264. sendInfo.RedirectUrl = wxAppPath
  265. }
  266. err = SendTemplateMsg(sendInfo)
  267. }
  268. utils.FileLog.Info("send end")
  269. return
  270. }
  271. // 路演->销售收到处理结果
  272. func SendWxMsgWithRoadshowDetailResult(first, keyword1, keyword2, remark, mobile, redirectUrl, wxAppPath string) (err error) {
  273. var msg string
  274. defer func() {
  275. if err != nil {
  276. go alarm_msg.SendAlarmMsg(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg), 3)
  277. //go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  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. accessToken, err := WxGetAccessToken()
  286. if err != nil {
  287. msg = "GetWxAccessToken Err:" + err.Error()
  288. return
  289. }
  290. if accessToken == "" {
  291. msg = "accessToken is empty"
  292. return
  293. }
  294. utils.FileLog.Info("mobile:%s", mobile)
  295. //获取openid列表
  296. //openIdStr := WxUsersGet()
  297. openIdList, err := wx_user.GetOpenIdListByMobile(mobile)
  298. if err != nil {
  299. msg = "get openIdList err:" + err.Error()
  300. return
  301. }
  302. utils.FileLog.Info("openIdListCount:%s", len(openIdList))
  303. //fmt.Println("openIdListCount:", len(openIdList))
  304. if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
  305. utils.FileLog.Info("start send")
  306. //sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  307. //fmt.Println("send start")
  308. //utils.FileLog.Info("send start")
  309. //sendMap := make(map[string]interface{})
  310. //sendData := make(map[string]interface{})
  311. //
  312. //sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  313. //sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  314. //sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  315. //sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  316. //
  317. //sendMap["template_id"] = utils.WxMsgTemplateIdWithRoadshowDetailResult
  318. //sendMap["url"] = redirectUrl
  319. //sendMap["data"] = sendData
  320. ////小程序信息
  321. //if wxAppPath != "" {
  322. // sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
  323. //}
  324. //sendTemplateMsg(sendUrl, sendMap, openIdList, wxAppPath, utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT)
  325. openIdArr := make([]string, len(openIdList))
  326. for i, v := range openIdList {
  327. openIdArr[i] = v.OpenId
  328. }
  329. sendInfo := new(SendWxTemplate)
  330. sendInfo.First = first
  331. sendInfo.Keyword1 = keyword1
  332. sendInfo.Keyword2 = keyword2
  333. sendInfo.Remark = remark
  334. sendInfo.TemplateId = utils.WxMsgTemplateIdWithRoadshowDetailResult
  335. if wxAppPath != "" && utils.RunMode == "release" {
  336. sendInfo.RedirectUrl = wxAppPath
  337. }
  338. sendInfo.RedirectTarget = 2
  339. sendInfo.Resource = wxAppPath
  340. sendInfo.SendType = utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT
  341. sendInfo.OpenIdArr = openIdArr
  342. err = SendTemplateMsg(sendInfo)
  343. }
  344. utils.FileLog.Info("send end")
  345. return
  346. }
  347. // 路演->研究员收到待处理的申请
  348. func SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4, remark, wxAppPath, mobile string) (err error) {
  349. //utils.WxMsgTemplateIdWithRoadshowPending
  350. var msg string
  351. defer func() {
  352. if err != nil {
  353. //go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  354. go alarm_msg.SendAlarmMsg("发送模版消息失败,Err:"+err.Error()+msg, 3)
  355. utils.FileLog.Info("发送模版消息失败,Err:" + err.Error() + msg)
  356. }
  357. if msg != "" {
  358. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  359. }
  360. }()
  361. utils.FileLog.Info("%s", "services SendMsg")
  362. accessToken, err := WxGetAccessToken()
  363. if err != nil {
  364. msg = "GetWxAccessToken Err:" + err.Error()
  365. return
  366. }
  367. if accessToken == "" {
  368. msg = "accessToken is empty"
  369. return
  370. }
  371. //获取openid列表
  372. //openIdStr := WxUsersGet()
  373. openIdList, err := wx_user.GetOpenIdListByMobile(mobile)
  374. if err != nil {
  375. msg = "get openIdList err:" + err.Error()
  376. return
  377. }
  378. utils.FileLog.Info("openIdListCount:%s", len(openIdList))
  379. //fmt.Println("openIdListCount:", len(openIdList))
  380. if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
  381. utils.FileLog.Info("start send")
  382. //sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  383. //fmt.Println("send start")
  384. //utils.FileLog.Info("send start")
  385. //sendMap := make(map[string]interface{})
  386. //sendData := make(map[string]interface{})
  387. //
  388. //sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  389. //sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  390. //sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  391. //sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
  392. //sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
  393. //sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  394. //
  395. //sendMap["template_id"] = utils.WxMsgTemplateIdWithRoadshowPending
  396. //sendMap["data"] = sendData
  397. ////小程序信息
  398. //if wxAppPath != "" {
  399. // sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
  400. //}
  401. //sendTemplateMsg(sendUrl, sendMap, openIdList, wxAppPath, utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT)
  402. openIdArr := make([]string, len(openIdList))
  403. for i, v := range openIdList {
  404. openIdArr[i] = v.OpenId
  405. }
  406. sendInfo := new(SendWxTemplate)
  407. sendInfo.First = first
  408. sendInfo.Keyword1 = keyword1
  409. sendInfo.Keyword2 = keyword2
  410. sendInfo.Keyword3 = keyword3
  411. sendInfo.Keyword4 = keyword4
  412. sendInfo.Remark = remark
  413. sendInfo.TemplateId = utils.WxMsgTemplateIdWithRoadshowPending
  414. if wxAppPath != "" && utils.RunMode == "release" {
  415. sendInfo.RedirectUrl = wxAppPath
  416. }
  417. sendInfo.RedirectTarget = 2
  418. sendInfo.Resource = wxAppPath
  419. sendInfo.SendType = utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT
  420. sendInfo.OpenIdArr = openIdArr
  421. err = SendTemplateMsg(sendInfo)
  422. }
  423. utils.FileLog.Info("send end")
  424. return
  425. }
  426. // 路演->研究员收到活动删除通知
  427. func SendWxMsgWithRoadshowDeleteNotice(first, keyword1, keyword2, remark, wxAppPath, mobile string) (err error) {
  428. var msg string
  429. defer func() {
  430. if err != nil {
  431. //go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  432. go alarm_msg.SendAlarmMsg("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05")+";Msg:"+msg+";Err:"+err.Error(), 3)
  433. utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
  434. }
  435. if msg != "" {
  436. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  437. }
  438. }()
  439. utils.FileLog.Info("%s", "services SendMsg")
  440. accessToken, err := WxGetAccessToken()
  441. if err != nil {
  442. msg = "GetWxAccessToken Err:" + err.Error()
  443. return
  444. }
  445. if accessToken == "" {
  446. msg = "accessToken is empty"
  447. return
  448. }
  449. //获取openid列表
  450. //openIdStr := WxUsersGet()
  451. openIdList, err := wx_user.GetOpenIdListByMobile(mobile)
  452. if err != nil {
  453. msg = "get openIdList err:" + err.Error()
  454. return
  455. }
  456. utils.FileLog.Info("openIdListCount:%s", len(openIdList))
  457. //fmt.Println("openIdListCount:", len(openIdList))
  458. if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
  459. utils.FileLog.Info("start send")
  460. //sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  461. //sendMap := make(map[string]interface{})
  462. //sendData := make(map[string]interface{})
  463. //
  464. //sendMap["template_id"] = utils.WxMsgTemplateIdWithRoadshowDeleteNotice
  465. //sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  466. //sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  467. //sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  468. //sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  469. ////小程序信息
  470. //if wxAppPath != "" {
  471. // sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
  472. //}
  473. //sendMap["data"] = sendData
  474. //sendTemplateMsg(sendUrl, sendMap, openIdList, wxAppPath, utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT)
  475. openIdArr := make([]string, len(openIdList))
  476. for i, v := range openIdList {
  477. openIdArr[i] = v.OpenId
  478. }
  479. sendInfo := new(SendWxTemplate)
  480. sendInfo.First = first
  481. sendInfo.Keyword1 = keyword1
  482. sendInfo.Keyword2 = keyword2
  483. sendInfo.Remark = remark
  484. sendInfo.TemplateId = utils.WxMsgTemplateIdWithRoadshowDeleteNotice
  485. if wxAppPath != "" && utils.RunMode == "release" {
  486. sendInfo.RedirectUrl = wxAppPath
  487. }
  488. sendInfo.RedirectTarget = 2
  489. sendInfo.Resource = wxAppPath
  490. sendInfo.SendType = utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT
  491. sendInfo.OpenIdArr = openIdArr
  492. err = SendTemplateMsg(sendInfo)
  493. }
  494. utils.FileLog.Info("send end")
  495. return
  496. }
  497. // 给销售发送 用印申请已签回的模版消息
  498. func SendSealFinishedWxTemplateMsg(mobile string, companyName string, sealId int) (err error) {
  499. var msg string
  500. defer func() {
  501. if err != nil {
  502. fmt.Println("err:", err)
  503. go alarm_msg.SendAlarmMsg("发送模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
  504. utils.FileLog.Info(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg))
  505. }
  506. if msg != "" {
  507. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  508. }
  509. }()
  510. utils.FileLog.Info("%s", "services SendMsg")
  511. accessToken, err := WxGetAccessToken()
  512. if err != nil {
  513. msg = "GetWxAccessToken Err:" + err.Error()
  514. return
  515. }
  516. if accessToken == "" {
  517. msg = "accessToken is empty"
  518. return
  519. }
  520. utils.FileLog.Info("mobile:%s", mobile)
  521. //openIdStr := WxUsersGet()
  522. openIdList, err := wx_user.GetOpenIdListByMobile(mobile)
  523. if err != nil {
  524. msg = "get openIdList err:" + err.Error()
  525. return
  526. }
  527. utils.FileLog.Info("openIdListCount:%s", len(openIdList))
  528. if len(openIdList) > 0 && utils.WxMsgTemplateIdWithSealApplyFinished != "" {
  529. utils.FileLog.Info("start send")
  530. //sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  531. //fmt.Println("send start")
  532. //utils.FileLog.Info("send start")
  533. //sendMap := make(map[string]interface{})
  534. //sendData := make(map[string]interface{})
  535. first := "您的用印申请已签回,可前往提交转正/续约申请"
  536. keyword1 := companyName
  537. keyword2 := "已签回"
  538. remark := "点击查看用印详情"
  539. //
  540. //sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  541. //sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  542. //sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  543. //sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  544. //
  545. //sendMap["template_id"] = utils.WxMsgTemplateIdWithSealApplyFinished
  546. //sendMap["url"] = "" //跳转地址
  547. //sendMap["data"] = sendData
  548. // TODO 随手办公小程序的跳转地址
  549. wxAppPath := fmt.Sprintf("pages-approve/seal/detail?SealId=%d", sealId)
  550. //sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId2, "pagepath": wxAppPath}
  551. //err = sendTemplateMsg(sendUrl, sendMap, openIdList, wxAppPath, utils.TEMPLATE_MSG_SEAL_FINISHED)
  552. openIdArr := make([]string, len(openIdList))
  553. for i, v := range openIdList {
  554. openIdArr[i] = v.OpenId
  555. }
  556. sendInfo := new(SendWxTemplate)
  557. sendInfo.First = first
  558. sendInfo.Keyword1 = keyword1
  559. sendInfo.Keyword2 = keyword2
  560. sendInfo.Remark = remark
  561. sendInfo.RedirectUrl = wxAppPath
  562. sendInfo.TemplateId = utils.WxMsgTemplateIdWithSealApplyFinished
  563. sendInfo.RedirectTarget = 2
  564. sendInfo.Resource = wxAppPath
  565. sendInfo.SendType = utils.TEMPLATE_MSG_SEAL_FINISHED
  566. sendInfo.OpenIdArr = openIdArr
  567. err = SendTemplateMsg(sendInfo)
  568. }
  569. utils.FileLog.Info("send end")
  570. return
  571. }
  572. // SendYbQuestionDistributeWxMsg 推送研报小程序模板消息-问答社区分配
  573. func SendYbQuestionDistributeWxMsg(questionId, userId int, openid, questionTitle string) (err error) {
  574. var errMsg string
  575. defer func() {
  576. if err != nil {
  577. alarmMsg := fmt.Sprintf("SendMiniProgramReportWxMsg-推送问答社区分配模版消息失败; QuestionId: %d; Err: %s; Msg: %s", questionId, err.Error(), errMsg)
  578. utils.FileLog.Error(alarmMsg)
  579. go alarm_msg.SendAlarmMsg(alarmMsg, 3)
  580. }
  581. }()
  582. accessToken, err := WxGetAccessToken()
  583. if err != nil {
  584. errMsg = "GetWxAccessToken Err:" + err.Error()
  585. return
  586. }
  587. if accessToken == "" {
  588. errMsg = "accessToken is empty"
  589. return
  590. }
  591. openIdList := make([]*wx_user.OpenIdList, 0)
  592. openIdList = append(openIdList, &wx_user.OpenIdList{
  593. OpenId: openid,
  594. UserId: userId,
  595. })
  596. //sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  597. //sendMap := make(map[string]interface{})
  598. //sendData := make(map[string]interface{})
  599. first := "您好,有新的提问待回复"
  600. keyword1 := questionTitle
  601. keyword2 := "待回复"
  602. remark := "请点击详情尽快处理"
  603. //sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  604. //sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  605. //sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  606. //sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  607. //
  608. //sendMap["template_id"] = utils.WxMsgTemplateIdWithYbCommunityQuestion
  609. //sendMap["data"] = sendData
  610. //
  611. wxAppPath := fmt.Sprintf("pages-question/answerDetail?id=%d", questionId)
  612. //if wxAppPath != "" {
  613. // sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxYbAppId, "pagepath": wxAppPath}
  614. //}
  615. //err = sendTemplateMsg(sendUrl, sendMap, openIdList, wxAppPath, utils.TEMPLATE_MSG_YB_COMMUNITY_QUESTION)
  616. openIdArr := make([]string, len(openIdList))
  617. for i, v := range openIdList {
  618. openIdArr[i] = v.OpenId
  619. }
  620. sendInfo := new(SendWxTemplate)
  621. sendInfo.First = first
  622. sendInfo.Keyword1 = keyword1
  623. sendInfo.Keyword2 = keyword2
  624. sendInfo.Remark = remark
  625. sendInfo.RedirectUrl = wxAppPath
  626. sendInfo.TemplateId = utils.WxMsgTemplateIdWithYbCommunityQuestion
  627. sendInfo.RedirectTarget = 1
  628. sendInfo.Resource = wxAppPath
  629. sendInfo.SendType = utils.TEMPLATE_MSG_YB_COMMUNITY_QUESTION
  630. sendInfo.OpenIdArr = openIdArr
  631. err = SendTemplateMsg(sendInfo)
  632. return
  633. }
  634. //推送模板消息
  635. func SendTemplateMsg(sendInfo *SendWxTemplate) (err error) {
  636. postData, err := json.Marshal(sendInfo)
  637. if err != nil {
  638. alarm_msg.SendAlarmMsg("SendTemplateMsg json.Marshal Err:"+err.Error(), 1)
  639. return err
  640. }
  641. body := ioutil.NopCloser(strings.NewReader(string(postData)))
  642. client := &http.Client{}
  643. req, err := http.NewRequest("POST", utils.SendWxTemplateMsgUrl, body)
  644. if err != nil {
  645. alarm_msg.SendAlarmMsg("SendTemplateMsg http.NewRequest Err:"+err.Error(), 1)
  646. return err
  647. }
  648. contentType := "application/json;charset=utf-8"
  649. req.Header.Set("Content-Type", contentType)
  650. req.Header.Set("Authorization", utils.SendTemplateMsgAuthorization)
  651. resp, err := client.Do(req)
  652. if err != nil {
  653. fmt.Println("http client.Do Err:" + err.Error())
  654. return err
  655. }
  656. defer resp.Body.Close()
  657. b, err := ioutil.ReadAll(resp.Body)
  658. if err != nil {
  659. return err
  660. }
  661. result := new(BaseResponse)
  662. err = json.Unmarshal(b, &result)
  663. if err != nil {
  664. return err
  665. }
  666. if result.Ret != 200 {
  667. err = errors.New(string(b))
  668. return err
  669. }
  670. return
  671. }