Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

113 lines
2.9KB

  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. type authToken struct {
  16. AccessToken string `json:"access_token"`
  17. ExpireIn int64 `json:"expires_in"`
  18. Time time.Time `json:"created_at"`
  19. }
  20. //GetAccessToken returns a valid access_token for wechat_api
  21. // the token is auomatically renewed if it's about to expire
  22. // if error happens, return empty string and error
  23. // if success, return token string and nil
  24. func GetAccessToken() (string, error) {
  25. t, err := readTokenFromFile("/tmp/wechat_hitxy_token")
  26. if isAuthTokenExpired(t) {
  27. t, err = renewAuthtoken()
  28. if err != nil {
  29. return "", err // cannot get token
  30. }
  31. }
  32. return t.AccessToken, nil
  33. }
  34. func isAuthTokenExpired(t authToken) bool {
  35. seconds := fmt.Sprintf("%ds", t.ExpireIn) //7200s
  36. duration, _ := time.ParseDuration(seconds)
  37. expire := t.Time.Add(duration)
  38. return time.Now().After(expire)
  39. }
  40. //save token to perminant storage
  41. func writeTokenToFile(body []byte, path string) {
  42. log.Printf("writing authtoke to %s\r\n", path)
  43. ioutil.WriteFile(path, body, 0600)
  44. }
  45. //read token from permenant storage
  46. func readTokenFromFile(path string) (authToken, error) {
  47. var m authToken
  48. log.Printf("read authtoke from %s\r\n", path)
  49. body, err := ioutil.ReadFile(path)
  50. json.Unmarshal(body, &m)
  51. return m, err
  52. }
  53. //issue web request to get token from wechat
  54. func renewAuthtoken() (authToken, error) {
  55. //url := "http://vimeo.com/api/v2/brad/info.json"
  56. url := "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx876e233fde456b7b&secret=4a91aa328569b10a9fb97adeb8b0af58"
  57. var myClient = &http.Client{Timeout: 20 * time.Second}
  58. r, err := myClient.Get(url)
  59. if err != nil {
  60. return authToken{}, err
  61. }
  62. defer r.Body.Close()
  63. var t authToken
  64. err = json.NewDecoder(r.Body).Decode(&t)
  65. if err != nil {
  66. return authToken{}, err
  67. }
  68. t.Time = time.Now()
  69. b, _ := json.Marshal(&t)
  70. writeTokenToFile(b, SaveToPath)
  71. return t, nil
  72. }
  73. //debugged http response
  74. func dummy() {
  75. var body []byte
  76. var response *http.Response
  77. var request *http.Request
  78. url := "http://vimeo.com/api/v2/brad/info.json"
  79. request, err := http.NewRequest("GET", url, nil)
  80. if err == nil {
  81. request.Header.Add("Content-Type", "application/json")
  82. //debug(httputil.DumpRequestOut(request, true))
  83. response, err = (&http.Client{}).Do(request)
  84. }
  85. if err == nil {
  86. defer response.Body.Close()
  87. //debug(httputil.DumpResponse(response, true))
  88. body, err = ioutil.ReadAll(response.Body)
  89. //json.NewDecoder(response.Body).Decode(m)
  90. }
  91. if err == nil {
  92. writeTokenToFile(body, "/tmp/wechat_hitxy_token")
  93. //m.Time = time.Now()
  94. } else {
  95. log.Fatalf("ERROR: %s", err)
  96. }
  97. }