Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

156 lines
5.3KB

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net/http"
  6. "net/http/httputil"
  7. "time"
  8. )
  9. //PathsConfig all system available pathes
  10. type PathsConfig struct {
  11. Angular2App string `json:"angular2_app"`
  12. }
  13. //TODO: setup GlobalPath Config, from reading file
  14. //GlobalPath all global pathes configurations
  15. var GlobalPath = PathsConfig{
  16. "/mnt/data/workspace/angular.ts/wechat/ng2-admin/dist/"}
  17. //KFUsers info cache about current customer service
  18. var KFUsers kfCache
  19. func main() {
  20. err := readConfig() //wechat API config
  21. if err != nil {
  22. log.Println(err)
  23. log.Fatal("unable to read server_config.json, program quit")
  24. return
  25. }
  26. err = readCRMConfig()
  27. if err != nil {
  28. log.Println(err)
  29. log.Fatal("unable to read crm_config.json, program quit")
  30. }
  31. initAllProc()
  32. setupRootFileServer()
  33. startSessionManager(2048)
  34. KFUsers.kfRenewList()
  35. //always the last one
  36. setupHTTPHandler()
  37. }
  38. func setupHTTPHandler() {
  39. //setup handler
  40. //http.HandleFunc("/", webrootHandler)
  41. http.HandleFunc("/api", apiV1Main)
  42. http.HandleFunc("/upload", uploadHandler)
  43. http.HandleFunc("/crmfiles/", crmAttachmentHandler)
  44. http.HandleFunc("/dumprequest", dumpReuestHandler)
  45. http.HandleFunc("/MP_verify_6JqVkftKr39GMakA.txt", mpDomainAuthSecret)
  46. http.HandleFunc("/profile_newly_register", initialRegistrationHandler)
  47. http.HandleFunc("/iapi/getAccessToken", supplyAccessToken)
  48. http.ListenAndServe(":65500", nil)
  49. }
  50. func startSessionManager(concurrent int) {
  51. m := SessionManager{}
  52. AllInMessage = make(chan InWechatMsg, concurrent)
  53. go m.startSessionManager(AllInMessage)
  54. }
  55. func setupRootFileServer() {
  56. http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  57. http.ServeFile(w, r, GlobalPath.Angular2App+r.URL.Path[1:])
  58. })
  59. //fs := http.FileServer(http.Dir("/mnt/data/workspace/angular.ts/ng2-admin/dist"))
  60. //http.Handle("/test", http.StripPrefix("/test", fs))
  61. //fs := http.FileServer(http.Dir("/mnt/data/workspace/angular.ts/wechat/ng2-admin/dist"))
  62. //http.Handle("/", fs)
  63. }
  64. func dumpReuestHandler(w http.ResponseWriter, r *http.Request) {
  65. logRequestDebug(httputil.DumpRequest(r, true))
  66. w.Header().Set("Content-Type", "application/json; charset=utf-8")
  67. w.Header().Set("Access-Control-Allow-Origin", "http://192.168.1.39:4200")
  68. w.Header().Set("Access-Control-Allow-Headers", "Authorziation11,Authorziation12")
  69. w.Header().Set("Access-Control-Allow-Credentials", "true")
  70. w.Header().Set("Access-Control-Expose-Headers", "Set-Cookie,myheader,*")
  71. w.Header().Set("myheader", "myheader-data")
  72. expiration := time.Now().Add(10 * 365 * 24 * time.Hour)
  73. str := time.Now().String()
  74. cookie := http.Cookie{Name: "username", Value: str, Expires: expiration}
  75. http.SetCookie(w, &cookie)
  76. fmt.Fprintf(w, `{"status":"OK"}`)
  77. for _, c := range r.Cookies() {
  78. log.Println(c.Name)
  79. log.Println(c.Value)
  80. }
  81. }
  82. func supplyAccessToken(w http.ResponseWriter, r *http.Request) {
  83. logRequestDebug(httputil.DumpRequest(r, true))
  84. signature := ""
  85. nonce := ""
  86. timestamp := ""
  87. for _, c := range r.Cookies() {
  88. switch c.Name {
  89. case "signature":
  90. signature = c.Value
  91. case "nonce":
  92. nonce = c.Value
  93. case "timestamp":
  94. timestamp = c.Value
  95. }
  96. }
  97. if verifySignature(signature, timestamp, nonce, IntraAPIConfig.CRMSecrete) {
  98. atk, _ := GetAccessToken()
  99. fmt.Fprint(w, atk)
  100. } else {
  101. fmt.Fprint(w, "fuck this world")
  102. }
  103. }
  104. // 用户在网页授权页同意授权给公众号后,微信会将授权数据传给一个回调页面,回调页面需在此域名下,以确保安全可靠。
  105. // 注意事项:
  106. // 1、回调页面域名或路径需使用字母、数字及“-”的组合(例:wx.qq.com或wx.qq.com/mp),不支持IP地址、端口号及短链域名。填写的域名或路径需与实际回调URL中的域名或路径相同。
  107. // 2、填写的域名须通过ICP备案的验证。
  108. // 3、将文件MP_verify_6JqVkftKr39GMakA.txt(点击下载)上传至填写域名或路径指向的web服务器(或虚拟主机)的目录(若填写域名,将文件放置在域名根目录下,例如wx.qq.com/MP_verify_6JqVkftKr39GMakA.txt;若填写路径,将文件放置在路径目录下,例如wx.qq.com/mp/MP_verify_6JqVkftKr39GMakA.txt),并确保可以访问。
  109. func mpDomainAuthSecret(w http.ResponseWriter, r *http.Request) {
  110. fmt.Fprintf(w, "6JqVkftKr39GMakA")
  111. //由于需要什么ICP备案,这个功能不能使用
  112. }
  113. //for user's initial registration, especially for wechat users
  114. //they visit a url that is specifically designed for them to
  115. //auth and input their profile data.
  116. //the url's query string will contains a token and a signature
  117. //so that it's verified, by single get request, to allow people to
  118. //enter their details into the CRM system.
  119. //
  120. //this handler, check's the query sting ,set an auth cookie to the client
  121. //and serve angular app, through an URL "/profile/edit"
  122. //or if the user has already been registered,
  123. //redirect user to a URL "/pages/dashboard"
  124. //
  125. func initialRegistrationHandler(w http.ResponseWriter, r *http.Request) {
  126. //TODO: verify url parameters and make sure its username is correctly set
  127. //
  128. expiration := time.Now().Add(10 * 365 * 24 * time.Hour)
  129. str := time.Now().String()
  130. cookie := http.Cookie{Name: "username", Value: str, Expires: expiration}
  131. http.SetCookie(w, &cookie)
  132. cookie = http.Cookie{Name: "signature", Value: "abcee", Expires: expiration}
  133. http.SetCookie(w, &cookie)
  134. http.Redirect(w, r, "http://192.168.1.39:4200/#pages/charts/chartist-js", 307) //302 temp redirect
  135. }