|
- //
- // {"access_token":"s0wf65p-KMzvYtH8qPu2qSX_EXLE2NaBgFHl7MZwedc7Kv_hdO0FG1QeUmBYJAGmQqJinPwFr67MRZwJee4rDnGVwhbuIfKs29N4ZJSXFP8fbAheuas08UuRe13UsdCtWSMcAFAGCW","expires_in":7200}
- //
- package main
-
- import (
- "encoding/json"
- "fmt"
- "io/ioutil"
- "log"
- "net/http"
- "time"
- )
-
- //SaveToPath : where the authtoken json file is stored
- const SaveToPath = "/tmp/wechat_hitxy_token"
-
- type authToken struct {
- AccessToken string `json:"access_token"`
- ExpireIn int64 `json:"expires_in"`
- Time time.Time `json:"created_at"`
- }
-
- //GetAccessToken returns a valid access_token for wechat_api
- // the token is auomatically renewed if it's about to expire
- // if error happens, return empty string and error
- // if success, return token string and nil
- func GetAccessToken() (string, error) {
- t, err := readTokenFromFile("/tmp/wechat_hitxy_token")
- if isAuthTokenExpired(t) {
- t, err = renewAuthtoken()
- if err != nil {
- return "", err // cannot get token
- }
- }
- return t.AccessToken, nil
- }
-
- func isAuthTokenExpired(t authToken) bool {
- seconds := fmt.Sprintf("%ds", t.ExpireIn) //7200s
- duration, _ := time.ParseDuration(seconds)
- expire := t.Time.Add(duration)
- return time.Now().After(expire)
- }
-
- //save token to perminant storage
- func writeTokenToFile(body []byte, path string) {
- log.Printf("writing authtoke to %s\r\n", path)
- ioutil.WriteFile(path, body, 0600)
- }
-
- //read token from permenant storage
- func readTokenFromFile(path string) (authToken, error) {
- var m authToken
- log.Printf("read authtoke from %s\r\n", path)
- body, err := ioutil.ReadFile(path)
- json.Unmarshal(body, &m)
- return m, err
- }
-
- //issue web request to get token from wechat
- func renewAuthtoken() (authToken, error) {
- //url := "http://vimeo.com/api/v2/brad/info.json"
- url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", APIConfig.Appid, APIConfig.AppSecret)
- var myClient = &http.Client{Timeout: 20 * time.Second}
- r, err := myClient.Get(url)
- if err != nil {
- return authToken{}, err
- }
- defer r.Body.Close()
-
- var t authToken
- err = json.NewDecoder(r.Body).Decode(&t)
-
- if err != nil {
- return authToken{}, err
- }
-
- t.Time = time.Now()
- b, _ := json.Marshal(&t)
- writeTokenToFile(b, SaveToPath)
- return t, nil
- }
-
- // //debugged http response
- // func dummy() {
- // var body []byte
- // var response *http.Response
- // var request *http.Request
- // url := "http://vimeo.com/api/v2/brad/info.json"
-
- // request, err := http.NewRequest("GET", url, nil)
- // if err == nil {
- // request.Header.Add("Content-Type", "application/json")
- // //debug(httputil.DumpRequestOut(request, true))
- // response, err = (&http.Client{}).Do(request)
- // }
-
- // if err == nil {
- // defer response.Body.Close()
- // //debug(httputil.DumpResponse(response, true))
- // body, err = ioutil.ReadAll(response.Body)
- // //json.NewDecoder(response.Body).Decode(m)
- // }
-
- // if err == nil {
- // writeTokenToFile(body, "/tmp/wechat_hitxy_token")
- // //m.Time = time.Now()
- // } else {
- // log.Fatalf("ERROR: %s", err)
- // }
- // }
|