wechat_send_msg.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. package services
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "hongze/hongze_clpt/models"
  8. "hongze/hongze_clpt/utils"
  9. "io/ioutil"
  10. "net/http"
  11. "strings"
  12. "time"
  13. )
  14. // 访谈申请
  15. func SendInterviewApplyTemplateMsg(realName, companyName, mobile, articleTitle string, itemOpenid *models.OpenIdList) (err error) {
  16. var msg string
  17. defer func() {
  18. if err != nil {
  19. go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  20. go utils.SendAlarmMsg(fmt.Sprint("访谈申请模板消息推送消息失败,手机号", mobile, "公司:", companyName, "手机号:", mobile), 2)
  21. }
  22. if msg != "" {
  23. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  24. }
  25. }()
  26. accessToken, err := models.GetWxAccessTokenByXzs()
  27. if err != nil {
  28. msg = "GetWxAccessToken Err:" + err.Error()
  29. return
  30. }
  31. if accessToken == "" {
  32. msg = "accessToken is empty"
  33. return
  34. }
  35. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  36. sendMap := make(map[string]interface{})
  37. sendData := make(map[string]interface{})
  38. keyword1 := realName + "【" + companyName + "】"
  39. first := "您有一条新的访谈申请,请及时处理。"
  40. keyword2 := mobile
  41. keyword3 := time.Now().Format(utils.FormatDateTime)
  42. keyword4 := articleTitle
  43. fontColor := "#D9001B"
  44. sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
  45. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
  46. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
  47. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
  48. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
  49. sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
  50. sendMap["data"] = sendData
  51. sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
  52. fmt.Println("send end")
  53. return
  54. }
  55. // 访谈申请取消
  56. func SendInterviewApplyCancelTemplateMsg(realName, companyName, mobile, articleTitle string, itemOpenid *models.OpenIdList) (err error) {
  57. var msg string
  58. defer func() {
  59. if err != nil {
  60. go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  61. go utils.SendAlarmMsg(fmt.Sprint("访谈申请取消模板消息推送消息失败,手机号", mobile, "公司:", companyName, "手机号:", mobile), 2)
  62. }
  63. if msg != "" {
  64. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  65. }
  66. }()
  67. accessToken, err := models.GetWxAccessTokenByXzs()
  68. if err != nil {
  69. msg = "GetWxAccessToken Err:" + err.Error()
  70. return
  71. }
  72. if accessToken == "" {
  73. msg = "accessToken is empty"
  74. return
  75. }
  76. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  77. sendMap := make(map[string]interface{})
  78. sendData := make(map[string]interface{})
  79. first := realName + "-" + mobile + "【" + companyName + "】的访谈申请已取消,请留意。"
  80. keyword1 := articleTitle
  81. keyword2 := time.Now().Format(utils.FormatDateTime)
  82. fontColor := "#D9001B"
  83. sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
  84. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
  85. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
  86. sendMap["template_id"] = utils.WxMsgTemplateIdApplyCancelXzs
  87. sendMap["data"] = sendData
  88. sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
  89. fmt.Println("send end")
  90. return
  91. }
  92. // 权限申请
  93. func SendPermissionApplyTemplateMsg(realName, companyName, mobile, applyMethod string, itemOpenid *models.OpenIdList) (err error) {
  94. var msg string
  95. defer func() {
  96. if err != nil {
  97. go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  98. go utils.SendAlarmMsg(fmt.Sprint("权限申请模板消息推送消息失败,手机号", mobile, "公司:", companyName, "手机号:", mobile), 2)
  99. }
  100. if msg != "" {
  101. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  102. }
  103. }()
  104. //var accessToken string
  105. //if utils.RunMode == "release" {
  106. // accessToken, err = models.GetWxAccessTokenByXzs()
  107. // if err != nil {
  108. // msg = "GetWxAccessToken Err:" + err.Error()
  109. // return
  110. // }
  111. // if accessToken == "" {
  112. // msg = "accessToken is empty"
  113. // return
  114. // }
  115. //} else {
  116. // accessToken, err = models.GetWxAccessToken()
  117. // if err != nil {
  118. // msg = "GetWxAccessToken Err:" + err.Error()
  119. // return
  120. // }
  121. // if accessToken == "" {
  122. // msg = "accessToken is empty"
  123. // return
  124. // }
  125. //}
  126. //
  127. //sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  128. //
  129. //sendMap := make(map[string]interface{})
  130. //sendData := make(map[string]interface{})
  131. //
  132. //keyword1 := realName + "【" + companyName + "】"
  133. //first := "查研观向有一条新的权限申请,请及时处理。"
  134. //keyword2 := mobile
  135. //keyword3 := time.Now().Format(utils.FormatDateTime)
  136. //keyword4 := applyMethod
  137. //fontColor := "#D9001B"
  138. //sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
  139. //sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
  140. //sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
  141. //sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
  142. //sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
  143. //if utils.RunMode == "release" {
  144. // sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
  145. //} else {
  146. // sendMap["template_id"] = utils.WxMsgTemplateIdApply
  147. //}
  148. //sendMap["data"] = sendData
  149. //sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
  150. //fmt.Println("send end")
  151. var first string
  152. var keyword1 string
  153. var keyword2 string
  154. var keyword3 string
  155. var keyword4 string
  156. var remark string
  157. var redirectUrl string
  158. keyword1 = "权限申请:" + realName + "【" + companyName + "】"
  159. keyword2 = mobile
  160. keyword3 = time.Now().Format(utils.FormatDateTime)
  161. keyword4 = applyMethod
  162. openIdArr := make([]string, 0)
  163. openIdArr = append(openIdArr, itemOpenid.OpenId)
  164. sendInfo := new(SendWxTemplate)
  165. sendInfo.First = first
  166. sendInfo.Keyword1 = keyword1
  167. sendInfo.Keyword2 = keyword2
  168. sendInfo.Keyword3 = keyword3
  169. sendInfo.Keyword4 = keyword4
  170. sendInfo.Remark = remark
  171. sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
  172. sendInfo.RedirectUrl = redirectUrl
  173. sendInfo.RedirectTarget = 3
  174. sendInfo.Resource = mobile
  175. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
  176. sendInfo.OpenIdArr = openIdArr
  177. err = PublicSendTemplateMsg(sendInfo)
  178. return
  179. }
  180. func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, itemOpenid *models.OpenIdList, resource string, sendType int) (err error) {
  181. sendMap["touser"] = itemOpenid.OpenId
  182. data, err := json.Marshal(sendMap)
  183. if err != nil {
  184. fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
  185. return err
  186. }
  187. err = toSendTemplateMsg(sendUrl, data, resource, sendType, itemOpenid)
  188. if err != nil {
  189. fmt.Println("send err:", err.Error())
  190. }
  191. return
  192. }
  193. func toSendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, dataItem *models.OpenIdList) (err error) {
  194. client := http.Client{}
  195. resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
  196. if err != nil {
  197. return
  198. }
  199. defer resp.Body.Close()
  200. body, _ := ioutil.ReadAll(resp.Body)
  201. var templateResponse SendTemplateResponse
  202. err = json.Unmarshal(body, &templateResponse)
  203. fmt.Println(templateResponse)
  204. utils.FileLog.Info("SendResult %s:", string(body))
  205. if err != nil {
  206. utils.FileLog.Info("SendResult Unmarshal Err:%s", err.Error())
  207. return err
  208. }
  209. //新增模板消息推送记录
  210. {
  211. tr := new(models.UserTemplateRecord)
  212. tr.UserId = dataItem.UserId
  213. tr.OpenId = dataItem.OpenId
  214. tr.Resource = resource
  215. tr.SendData = string(data)
  216. tr.Result = string(body)
  217. tr.CreateDate = time.Now().Format(utils.FormatDate)
  218. tr.CreateTime = time.Now().Format(utils.FormatDateTime)
  219. if templateResponse.Errcode == 0 {
  220. tr.SendStatus = 1
  221. } else {
  222. tr.SendStatus = 0
  223. }
  224. tr.SendType = sendType
  225. go func() {
  226. err = models.AddUserTemplateRecord(tr)
  227. if err != nil {
  228. utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
  229. }
  230. }()
  231. }
  232. return
  233. }
  234. type SendTemplateResponse struct {
  235. Errcode int `json:"errcode"`
  236. Errmsg string `json:"errmsg"`
  237. MsgID int `json:"msgid"`
  238. }
  239. type SendWxTemplate struct {
  240. WxAppId string `description:"公众号appId"`
  241. First string `description:"模板消息first字段"`
  242. Keyword1 string `description:"模板消息keyword1字段"`
  243. Keyword2 string `description:"模板消息keyword2字段"`
  244. Keyword3 string `description:"模板消息keyword3字段"`
  245. Keyword4 string `description:"模板消息keyword4字段"`
  246. Remark string `description:"模板消息remark字段"`
  247. TemplateId string `description:"模板id"`
  248. RedirectUrl string `description:"跳转地址"`
  249. RedirectTarget int `description:"小程序跳转目标:1:弘则研报小程序,2:随手办公小程序"`
  250. Resource string `description:"资源唯一标识"`
  251. SendType int `description:"发送的消息类型:1:报告,2:指标更新提醒,3:审批通知,4:销售领取客户通知,5:活动取消通知,6活动更改时间通知,7:关注的作者发布报告通知,8:发送日报(周报、双周报、月报)模板消息,9:活动预约/报名时间通知"`
  252. OpenIdArr []string `description:"消息接收者openid"`
  253. }
  254. // 推送模板消息
  255. func PublicSendTemplateMsg(sendInfo *SendWxTemplate) (err error) {
  256. postData, err := json.Marshal(sendInfo)
  257. if err != nil {
  258. utils.SendAlarmMsg("SendTemplateMsg json.Marshal Err:"+err.Error(), 1)
  259. return err
  260. }
  261. body := ioutil.NopCloser(strings.NewReader(string(postData)))
  262. client := &http.Client{}
  263. req, err := http.NewRequest("POST", utils.SendWxTemplateMsgUrl, body)
  264. if err != nil {
  265. utils.SendAlarmMsg("SendTemplateMsg http.NewRequest Err:"+err.Error(), 1)
  266. return err
  267. }
  268. contentType := "application/json;charset=utf-8"
  269. req.Header.Set("Content-Type", contentType)
  270. req.Header.Set("Authorization", utils.SendTemplateMsgAuthorization)
  271. resp, err := client.Do(req)
  272. if err != nil {
  273. fmt.Println("http client.Do Err:" + err.Error())
  274. return err
  275. }
  276. defer resp.Body.Close()
  277. b, err := ioutil.ReadAll(resp.Body)
  278. if err != nil {
  279. return err
  280. }
  281. result := new(models.BaseResponse)
  282. err = json.Unmarshal(b, &result)
  283. if err != nil {
  284. return err
  285. }
  286. if result.Ret != 200 {
  287. err = errors.New(string(b))
  288. return err
  289. }
  290. return
  291. }