wechat-test-account.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package channel
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "message-pusher/common"
  6. "net/http"
  7. "time"
  8. )
  9. type wechatTestAccountResponse struct {
  10. ErrorCode int `json:"errcode"`
  11. ErrorMessage string `json:"errmsg"`
  12. AccessToken string `json:"access_token"`
  13. ExpiresIn int `json:"expires_in"`
  14. }
  15. type WeChatTestAccountTokenStoreItem struct {
  16. AppID string
  17. AppSecret string
  18. AccessToken string
  19. }
  20. func (i *WeChatTestAccountTokenStoreItem) Key() string {
  21. return i.AppID + i.AppSecret
  22. }
  23. func (i *WeChatTestAccountTokenStoreItem) Token() string {
  24. return i.AccessToken
  25. }
  26. func (i *WeChatTestAccountTokenStoreItem) Refresh() {
  27. // https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
  28. client := http.Client{
  29. Timeout: 5 * time.Second,
  30. }
  31. req, err := http.NewRequest("GET", fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s",
  32. i.AppID, i.AppSecret), nil)
  33. if err != nil {
  34. common.SysError(err.Error())
  35. return
  36. }
  37. responseData, err := client.Do(req)
  38. if err != nil {
  39. common.SysError("failed to refresh access token: " + err.Error())
  40. return
  41. }
  42. defer responseData.Body.Close()
  43. var res wechatTestAccountResponse
  44. err = json.NewDecoder(responseData.Body).Decode(&res)
  45. if err != nil {
  46. common.SysError("failed to decode wechatTestAccountResponse: " + err.Error())
  47. return
  48. }
  49. if res.ErrorCode != 0 {
  50. common.SysError(res.ErrorMessage)
  51. return
  52. }
  53. i.AccessToken = res.AccessToken
  54. common.SysLog("access token refreshed")
  55. }