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

123 lines
3.4KB

  1. //
  2. // {"access_token":"s0wf65p-KMzvYtH8qPu2qSX_EXLE2NaBgFHl7MZwedc7Kv_hdO0FG1QeUmBYJAGmQqJinPwFr67MRZwJee4rDnGVwhbuIfKs29N4ZJSXFP8fbAheuas08UuRe13UsdCtWSMcAFAGCW","expires_in":7200}
  3. //
  4. package main
  5. import (
  6. "encoding/json"
  7. "fmt"
  8. "io/ioutil"
  9. "log"
  10. "net/http"
  11. "time"
  12. )
  13. //SaveToPath : where the AuthToken json file is stored
  14. //const SaveToPath = "/tmp/wechat_hitxy_token"
  15. //AuthToken Access Token, for temporary access WechatAPI
  16. type AuthToken struct {
  17. AccessToken string `json:"access_token"`
  18. ExpireIn int64 `json:"expires_in"`
  19. Time time.Time `json:"created_at"`
  20. }
  21. //WechatAccessToken Global AccessToken
  22. var WechatAccessToken AuthToken
  23. //GetAccessToken returns a valid access_token for wechat_api
  24. // the token is auomatically renewed if it's about to expire
  25. // if error happens, return empty string and error
  26. // if success, return token string and nil
  27. func GetAccessToken() (string, error) {
  28. t, err := readTokenFromFile(APIConfig.AuthTokenSaveTo)
  29. if isAuthTokenExpired(t) {
  30. t, err = renewAuthToken()
  31. if err != nil {
  32. log.Fatal("Cannot renew AccessToken from Wechat Server:")
  33. log.Fatal(err)
  34. return "", err // cannot get token
  35. }
  36. }
  37. WechatAccessToken = t
  38. return t.AccessToken, nil
  39. }
  40. func isAuthTokenExpired(t AuthToken) bool {
  41. seconds := fmt.Sprintf("%ds", t.ExpireIn) //7200s
  42. duration, _ := time.ParseDuration(seconds)
  43. expire := t.Time.Add(duration)
  44. return time.Now().After(expire)
  45. }
  46. //save token to perminant storage
  47. func writeTokenToFile(body []byte, path string) {
  48. log.Printf("writing authtoken to %s\r\n", path)
  49. ioutil.WriteFile(path, body, 0600)
  50. }
  51. //read token from permenant storage
  52. func readTokenFromFile(path string) (AuthToken, error) {
  53. var m AuthToken
  54. log.Printf("read authtoke from %s\r\n", path)
  55. body, err := ioutil.ReadFile(path)
  56. json.Unmarshal(body, &m)
  57. return m, err
  58. }
  59. //issue web request to get token from wechat
  60. func renewAuthToken() (AuthToken, error) {
  61. //url := "http://vimeo.com/api/v2/brad/info.json"
  62. url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", APIConfig.Appid, APIConfig.AppSecret)
  63. var myClient = &http.Client{Timeout: 20 * time.Second}
  64. log.Println("renew access token from Internet api.weixin.qq.com")
  65. r, err := myClient.Get(url)
  66. if err != nil {
  67. log.Fatal("http access api.weixin.qq.com failed")
  68. log.Fatal(err)
  69. return AuthToken{}, err
  70. }
  71. defer r.Body.Close()
  72. var t AuthToken
  73. err = json.NewDecoder(r.Body).Decode(&t)
  74. if err != nil {
  75. return AuthToken{}, err
  76. }
  77. t.Time = time.Now()
  78. b, _ := json.Marshal(&t)
  79. writeTokenToFile(b, APIConfig.AuthTokenSaveTo)
  80. return t, nil
  81. }
  82. // //debugged http response
  83. // func dummy() {
  84. // var body []byte
  85. // var response *http.Response
  86. // var request *http.Request
  87. // url := "http://vimeo.com/api/v2/brad/info.json"
  88. // request, err := http.NewRequest("GET", url, nil)
  89. // if err == nil {
  90. // request.Header.Add("Content-Type", "application/json")
  91. // //debug(httputil.DumpRequestOut(request, true))
  92. // response, err = (&http.Client{}).Do(request)
  93. // }
  94. // if err == nil {
  95. // defer response.Body.Close()
  96. // //debug(httputil.DumpResponse(response, true))
  97. // body, err = ioutil.ReadAll(response.Body)
  98. // //json.NewDecoder(response.Body).Decode(m)
  99. // }
  100. // if err == nil {
  101. // writeTokenToFile(body, "/tmp/wechat_hitxy_token")
  102. // //m.Time = time.Now()
  103. // } else {
  104. // log.Fatalf("ERROR: %s", err)
  105. // }
  106. // }