Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

118 lines
3.2KB

  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. return "", err // cannot get token
  33. }
  34. }
  35. WechatAccessToken = t
  36. return t.AccessToken, nil
  37. }
  38. func isAuthTokenExpired(t AuthToken) bool {
  39. seconds := fmt.Sprintf("%ds", t.ExpireIn) //7200s
  40. duration, _ := time.ParseDuration(seconds)
  41. expire := t.Time.Add(duration)
  42. return time.Now().After(expire)
  43. }
  44. //save token to perminant storage
  45. func writeTokenToFile(body []byte, path string) {
  46. log.Printf("writing authtoken to %s\r\n", path)
  47. ioutil.WriteFile(path, body, 0600)
  48. }
  49. //read token from permenant storage
  50. func readTokenFromFile(path string) (AuthToken, error) {
  51. var m AuthToken
  52. log.Printf("read authtoke from %s\r\n", path)
  53. body, err := ioutil.ReadFile(path)
  54. json.Unmarshal(body, &m)
  55. return m, err
  56. }
  57. //issue web request to get token from wechat
  58. func renewAuthToken() (AuthToken, error) {
  59. //url := "http://vimeo.com/api/v2/brad/info.json"
  60. url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", APIConfig.Appid, APIConfig.AppSecret)
  61. var myClient = &http.Client{Timeout: 20 * time.Second}
  62. r, err := myClient.Get(url)
  63. if err != nil {
  64. return AuthToken{}, err
  65. }
  66. defer r.Body.Close()
  67. var t AuthToken
  68. err = json.NewDecoder(r.Body).Decode(&t)
  69. if err != nil {
  70. return AuthToken{}, err
  71. }
  72. t.Time = time.Now()
  73. b, _ := json.Marshal(&t)
  74. writeTokenToFile(b, APIConfig.AuthTokenSaveTo)
  75. return t, nil
  76. }
  77. // //debugged http response
  78. // func dummy() {
  79. // var body []byte
  80. // var response *http.Response
  81. // var request *http.Request
  82. // url := "http://vimeo.com/api/v2/brad/info.json"
  83. // request, err := http.NewRequest("GET", url, nil)
  84. // if err == nil {
  85. // request.Header.Add("Content-Type", "application/json")
  86. // //debug(httputil.DumpRequestOut(request, true))
  87. // response, err = (&http.Client{}).Do(request)
  88. // }
  89. // if err == nil {
  90. // defer response.Body.Close()
  91. // //debug(httputil.DumpResponse(response, true))
  92. // body, err = ioutil.ReadAll(response.Body)
  93. // //json.NewDecoder(response.Body).Decode(m)
  94. // }
  95. // if err == nil {
  96. // writeTokenToFile(body, "/tmp/wechat_hitxy_token")
  97. // //m.Time = time.Now()
  98. // } else {
  99. // log.Fatalf("ERROR: %s", err)
  100. // }
  101. // }