7c858b217edb551a3ee394529747ea60ec958787.svn-base 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. package util
  2. import (
  3. "../../models"
  4. "../../pkg/logging"
  5. "../../pkg/setting"
  6. "crypto/sha1"
  7. "fmt"
  8. "github.com/fastwego/offiaccount"
  9. template1 "github.com/fastwego/offiaccount/apis/message/template"
  10. "github.com/fastwego/offiaccount/apis/oauth"
  11. user1 "github.com/fastwego/offiaccount/apis/user"
  12. "github.com/fastwego/offiaccount/type/type_message"
  13. "github.com/fastwego/offiaccount/util"
  14. "github.com/fastwego/wxwork/corporation"
  15. "github.com/fastwego/wxwork/corporation/apis/contact"
  16. message1 "github.com/fastwego/wxwork/corporation/apis/message"
  17. "github.com/gin-gonic/gin"
  18. "github.com/robfig/cron"
  19. "html/template"
  20. "io/ioutil"
  21. "log"
  22. "net/url"
  23. "strconv"
  24. "time"
  25. )
  26. //企业微信
  27. var OffiAccount *offiaccount.OffiAccount
  28. var Corp *corporation.Corporation
  29. var App *corporation.App
  30. var MsgChan chan []map[string]interface{}
  31. type UserMsg struct {
  32. Touser string `json:"touser"`
  33. Msgtype string `json:"msgtype"`
  34. Agentid string `json:"agentid"`
  35. Text interface{} `json:"text"`
  36. }
  37. func init() {
  38. //initOffiAccount()
  39. //initWXwork()
  40. //Getuseinfor()
  41. }
  42. func CronWXwork() {
  43. //Getuseinfor1()
  44. defer func() { // 必须要先声明defer
  45. if err := recover(); err != nil {
  46. fmt.Printf("CronTest pnic err%+v \n", err)
  47. logging.Error("panic recover err ", err)
  48. //println("pnic err",err.(error).Error()) // 这里的err其实就是panic传入的内容,55
  49. }
  50. }()
  51. initWXwork()
  52. go SendRun()
  53. log.Println("Starting CronWXwork...")
  54. c := cron.New()
  55. _, err := c.AddFunc("30 00 * * *", Getuseinfor) //* * * * *, 从分钟开始
  56. if err != nil {
  57. println("cron4 err", err.Error())
  58. }
  59. _, err = c.AddFunc("0/1 * * * *", GetMsg) //* * * * *, 从分钟开始
  60. if err != nil {
  61. println("cron5 err", err.Error())
  62. }
  63. c.Start()
  64. }
  65. func Getuseinfor1() {
  66. logging.Error("PostDataByNames========= ")
  67. }
  68. func Getuseinfor() {
  69. defer func(){ // 必须要先声明defer
  70. if err:=recover();err!=nil{
  71. logging.Error("Getuseinfor pnic err",err) // 这里的err其实就是panic传入的内容,55
  72. }
  73. }()
  74. value := make(url.Values, 1)
  75. value.Add("department_id", "1")
  76. value.Add("fetch_child", "1")
  77. msgmap := make(map[string]interface{})
  78. resp, err := contact.UserList(App, value)
  79. if err != nil {
  80. println("contact.UserList err", err.Error())
  81. }
  82. err = json.Unmarshal(resp, &msgmap)
  83. if err != nil {
  84. println("json.Unmarshal err", err.Error())
  85. }
  86. tx := models.Engine.NewSession()
  87. err1 := tx.Begin()
  88. defer func() {
  89. switch {
  90. case err1 != nil:
  91. logging.Error("tx.Begin 事务启动失败__error:", err.Error())
  92. if tx != nil {
  93. tx.Rollback()
  94. }
  95. default:
  96. if tx != nil {
  97. err = tx.Commit()
  98. }
  99. }
  100. if tx != nil {
  101. tx.Close()
  102. }
  103. }()
  104. if _, ok := msgmap["userlist"]; ok {
  105. for _, value := range msgmap["userlist"].([]interface{}) {
  106. userid := value.(map[string]interface{})["userid"]
  107. name := value.(map[string]interface{})["name"]
  108. var department interface{}
  109. if len(value.(map[string]interface{})["department"].([]interface{})) > 0 {
  110. department = value.(map[string]interface{})["department"].([]interface{})[0]
  111. }
  112. var empcode interface{}
  113. if len(value.(map[string]interface{})["extattr"].(map[string]interface{})["attrs"].([]interface{})) == 1 {
  114. empcode = value.(map[string]interface{})["extattr"].(map[string]interface{})["attrs"].([]interface{})[0].(map[string]interface{})["value"]
  115. } else if len(value.(map[string]interface{})["extattr"].(map[string]interface{})["attrs"].([]interface{})) > 1 {
  116. for _, va := range value.(map[string]interface{})["extattr"].(map[string]interface{})["attrs"].([]interface{}) {
  117. if va.(map[string]interface{})["name"].(string) == "工号" {
  118. empcode = va.(map[string]interface{})["value"]
  119. break
  120. }
  121. }
  122. }
  123. //jvalue,_ :=json.Marshal(value)
  124. _, err = tx.Exec("insert into wxworkuser(userid,name,department,empcode)values(?,?,?,?)ON DUPLICATE KEY UPDATE empcode =?,department=?", userid, name, department, empcode, empcode,department)
  125. //_,err =tx.Exec("insert into wxworkuser(userid,name,department,empcode,json)values(?,?,?,?,?)ON DUPLICATE KEY UPDATE empcode =?",userid,name,department,empcode,string(jvalue),empcode)
  126. if err != nil {
  127. logging.Error("insert into wxworkuser err ", err.Error())
  128. }
  129. }
  130. }
  131. logging.Info("update wxworkuser success ")
  132. }
  133. func SendRun() {
  134. defer func(){
  135. if err:=recover();err!=nil{
  136. logging.Error("GetMsg pnic err",err)
  137. }
  138. }()
  139. for{
  140. msgs := <- MsgChan
  141. println(len(msgs))
  142. for _, value := range msgs {
  143. content := make(map[string]interface{})
  144. content["content"] = value["msg"].(string)
  145. msg := UserMsg{
  146. Touser: value["userid"].(string),
  147. Agentid: setting.ServerSetting.WXworkAgentid,
  148. Text: content,
  149. Msgtype: "text",
  150. }
  151. msgbyte, err := json.Marshal(msg)
  152. if err != nil {
  153. logging.Error("json.Marshal err ", err.Error())
  154. }
  155. _, err = message1.Send(App, msgbyte)
  156. if err != nil {
  157. logging.Error("message1.Send err ", err.Error())
  158. fmt.Println("message1.Send err",err.Error())
  159. }else{
  160. }
  161. //println("resp==========",string(resp))
  162. }
  163. }
  164. }
  165. func GetMsgv1(){
  166. //defer func(){ // 必须要先声明defer
  167. // if err:=recover();err!=nil{
  168. // logging.Error("GetMsg pnic err",err) // 这里的err其实就是panic传入的内容,55
  169. // }
  170. //}()
  171. //time.Sleep(time.Second)
  172. //a := 0
  173. //b := 1/a
  174. //println(b)
  175. go GetMsgv2()
  176. }
  177. func GetMsgv2(){
  178. defer func(){ // 必须要先声明defer
  179. if err:=recover();err!=nil{
  180. logging.Error("GetMsg pnic err",err) // 这里的err其实就是panic传入的内容,55
  181. }
  182. }()
  183. time.Sleep(time.Second)
  184. a := 0
  185. b := 1/a
  186. println(b)
  187. }
  188. func GetMsg() {
  189. defer func(){ // 必须要先声明defer
  190. if err:=recover();err!=nil{
  191. logging.Error("GetMsg pnic err",err) // 这里的err其实就是panic传入的内容,55
  192. }
  193. }()
  194. tx := models.Engine.NewSession()
  195. err1 := tx.Begin()
  196. defer func() {
  197. switch {
  198. case err1 != nil:
  199. println("tx.Begin 事务启动失败__error:", err1.Error())
  200. if tx != nil {
  201. tx.Rollback()
  202. }
  203. default:
  204. if tx != nil {
  205. err1 = tx.Commit()
  206. }
  207. }
  208. if tx != nil {
  209. tx.Close()
  210. }
  211. }()
  212. sqls, err := tx.SQL("select sqlstr from apisql where sqlname in ('getWXworkMsg','updateWXworkMsg') order by sqlname").Query().List()
  213. if err != nil {
  214. logging.Error("select from sqls err ", err.Error())
  215. }
  216. if len(sqls)< 2 {
  217. return
  218. }
  219. sqlmsg := sqls[0]["sqlstr"].(string)
  220. sqlupdate := sqls[1]["sqlstr"].(string)
  221. var query []map[string]interface{}
  222. if len(sqls) > 0 {
  223. query, err = tx.SQL(sqlmsg).Query().List()
  224. if err != nil {
  225. logging.Error("select from wxworkmsg err ", err.Error(), len(query))
  226. } else {
  227. _, err = tx.Exec(sqlupdate)
  228. if err != nil {
  229. logging.Error("update wxworkmsg err ", err.Error(), len(query))
  230. }
  231. }
  232. }
  233. if len(query) > 0 {
  234. go func(){
  235. msgs := query
  236. MsgChan <- msgs
  237. } ()
  238. //for _, value := range query {
  239. // content := make(map[string]interface{})
  240. // content["content"] = value["msg"].(string)
  241. // msg := UserMsg{
  242. // Touser: value["userid"].(string),
  243. // Agentid: setting.ServerSetting.WXworkAgentid,
  244. // Text: content,
  245. // Msgtype: "text",
  246. // }
  247. //
  248. // msgbyte, err := json.Marshal(msg)
  249. // if err != nil {
  250. // logging.Error("json.Marshal err ", err.Error())
  251. // }
  252. // _, err = message1.Send(App, msgbyte)
  253. // if err != nil {
  254. // logging.Error("message1.Send err ", err.Error())
  255. // }
  256. // //println("resp==========",string(resp))
  257. //}
  258. }
  259. }
  260. func SendMsgtest() {
  261. message1.Send(App, []byte(`{
  262. "touser": "18322596935",
  263. "toparty": "PartyID1|PartyID2",
  264. "totag": "TagID1 | TagID2",
  265. "msgtype": "text",
  266. "agentid": 1000022,
  267. "text": {
  268. "content": "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。"
  269. },
  270. "safe": 0,
  271. "enable_id_trans": 0,
  272. "enable_duplicate_check": 0
  273. }`))
  274. }
  275. func initOffiAccount() {
  276. // 加载配置文件
  277. // 创建公众号实例
  278. OffiAccount = offiaccount.New(offiaccount.Config{
  279. Appid: "wxe1cc563ba393dd1a",
  280. Secret: "25e56243da9581eab6f4d67a12ef4658",
  281. Token: "123",
  282. EncodingAESKey: "6yYJ4sS5y1hJgvIXEqavV2rmCutyXkywndxUQFgX54f",
  283. })
  284. //payload := []byte(`
  285. //{
  286. // "button":[
  287. // {
  288. // "name":"菜单",
  289. // "sub_button":[
  290. // {
  291. // "type":"view",
  292. // "name":"搜索",
  293. // "url":"http://www.baidu.com/"
  294. // }]
  295. // }]
  296. //}`)
  297. //resp, err := menu.Create(OffiAccount, payload)
  298. //fmt.Println(resp, err)
  299. //guide.SetGuideConfig(OffiAccount,[]byte("欢迎关注"))
  300. }
  301. func initWXwork() {
  302. // 加载配置文件
  303. // 创建企业微信实例
  304. Corp = corporation.New(corporation.Config{Corpid: setting.ServerSetting.WXworkCorpid})
  305. App = Corp.NewApp(corporation.AppConfig{
  306. AgentId: setting.ServerSetting.WXworkAgentid,
  307. Secret: setting.ServerSetting.WXworkSecret,
  308. Token: "",
  309. EncodingAESKey: "",
  310. })
  311. MsgChan = make(chan []map[string]interface{},1000)
  312. }
  313. func InitRouter() *gin.Engine {
  314. r := gin.New()
  315. // ginpprof.Wrap(r)
  316. r.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
  317. // 你的自定义格式
  318. return fmt.Sprintf(" %+v \n",
  319. param.Keys,
  320. )
  321. }))
  322. r.Use(gin.Logger()) // 日志
  323. //r.Use(Cors()) // 跨域请求rolemenus
  324. r.Use(gin.Recovery())
  325. r.GET("/", func(c *gin.Context) {
  326. //OffiAccount.Server.EchoStr(c.Writer, c.Request)
  327. config, err := jsapiConfig(c)
  328. if err != nil {
  329. fmt.Println("==========1", err)
  330. return
  331. }
  332. t1, err := template.ParseFiles("index.html")
  333. if err != nil {
  334. fmt.Println("==========2", err)
  335. return
  336. }
  337. println("===========", t1.Name())
  338. t1.Execute(c.Writer, config)
  339. })
  340. r.POST("/", HandleMessage)
  341. return r
  342. }
  343. func jsapiConfig(c *gin.Context) (config template.JS, err error) {
  344. // 优先从环缓存获取
  345. jsapi_ticket, err := OffiAccount.AccessToken.Cache.Fetch("jsapi_ticket:" + OffiAccount.Config.Appid)
  346. if len(jsapi_ticket) == 0 {
  347. var ttl int64
  348. jsapi_ticket, ttl, err = oauth.GetJSApiTicket(OffiAccount)
  349. if err != nil {
  350. return
  351. }
  352. err = OffiAccount.AccessToken.Cache.Save("jsapi_ticket:"+OffiAccount.Config.Appid, jsapi_ticket, time.Duration(ttl)*time.Second)
  353. if err != nil {
  354. return
  355. }
  356. }
  357. nonceStr := util.GetRandString(6)
  358. timestamp := strconv.FormatInt(time.Now().Unix(), 10)
  359. pageUrl := "http://" + c.Request.Host + c.Request.RequestURI
  360. plain := "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + pageUrl
  361. signature := fmt.Sprintf("%x", sha1.Sum([]byte(plain)))
  362. fmt.Println(plain, signature)
  363. configMap := map[string]string{
  364. "url": pageUrl,
  365. "nonceStr": nonceStr,
  366. "appid": OffiAccount.Config.Appid,
  367. "timestamp": timestamp,
  368. "signature": signature,
  369. }
  370. marshal, err := json.Marshal(configMap)
  371. if err != nil {
  372. return
  373. }
  374. return template.JS(marshal), nil
  375. }
  376. func HandleMessage(c *gin.Context) {
  377. // 区分不同账号
  378. //account := path.Base(c.Request.URL.Path)
  379. // 调用相应公众号服务
  380. body, _ := ioutil.ReadAll(c.Request.Body)
  381. log.Println(string(body))
  382. message, err := OffiAccount.Server.ParseXML(body)
  383. if err != nil {
  384. log.Println(err)
  385. }
  386. var output interface{}
  387. switch message.(type) {
  388. case type_message.MessageText: // 文本 消息
  389. msg := message.(type_message.MessageText)
  390. // 回复文本消息
  391. output = type_message.ReplyMessageText{
  392. ReplyMessage: type_message.ReplyMessage{
  393. ToUserName: type_message.CDATA(msg.FromUserName),
  394. FromUserName: type_message.CDATA(msg.ToUserName),
  395. CreateTime: strconv.FormatInt(time.Now().Unix(), 10),
  396. MsgType: type_message.ReplyMsgTypeText,
  397. },
  398. Content: type_message.CDATA(msg.Content),
  399. }
  400. resp, err := template1.Send(OffiAccount, []byte(`
  401. {
  402. "touser":"`+msg.FromUserName+`",
  403. "template_id":"BtkN1rWKOJtKP0C64lGxIrPzLRFsYFas-4gupX2-pFo",
  404. "data":{
  405. "first": {
  406. "value":"恭喜你购买成功!",
  407. "color":"#173177"
  408. },
  409. "keyword1":{
  410. "value":"巧克力",
  411. "color":"#173177"
  412. },
  413. "keyword2": {
  414. "value":"39.8元",
  415. "color":"#173177"
  416. },
  417. "keyword3": {
  418. "value":"2014年9月22日",
  419. "color":"#173177"
  420. },
  421. "remark":{
  422. "value":"欢迎再次购买!",
  423. "color":"#173177"
  424. }
  425. }
  426. }`))
  427. println("msg", resp, err, msg.FromUserName)
  428. }
  429. //var value url.Values
  430. //value.Add("access_token","40_oJz5xKDgTEAPXV66Ydlx3Xu-9OsltBLEfuIZ7qPkaxJBafOCr6B83Td2t5B5glJ8dpCvEnPUTrgnbmFI7T6AYE6jYL5iJOo7UcdvCg9437lc8OfyyzsEFMUZF4JekDYQUqjiAiaLrmwRwbwrGCTjAJAMIZ")
  431. //println(value.Get("access_token"))
  432. res, _ := user1.Get(OffiAccount, nil)
  433. println("res======", string(res))
  434. OffiAccount.Server.Response(c.Writer, c.Request, output)
  435. }