oauth.go 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package oauth
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/lin-jim-leon/douyin/util"
  6. "net/url"
  7. )
  8. const (
  9. redirectOauthURL string = "https://open.douyin.com/platform/oauth/connect?client_key=%s&response_type=code&scope=%s&redirect_uri=%s"
  10. accessTokenUrl string = "https://open.douyin.com/oauth/access_token?client_key=%s&client_secret=%s&code=%s&grant_type=authorization_code"
  11. refreshTokenURL string = "https://open.douyin.com/oauth/oauth/refresh_token?client_key=%s&grant_type=refresh_token&refresh_token=%s"
  12. )
  13. // GetRedirectURL 获取授权码的url地址
  14. func GetRedirectURL(redirecturl string, ClientKey string, Scopes string) string {
  15. uri := url.QueryEscape(redirecturl)
  16. return fmt.Sprintf(redirectOauthURL, ClientKey, Scopes, uri)
  17. }
  18. // AccessToken返回结构体
  19. type ainfo struct {
  20. //util.CommonError
  21. AccessToken string `json:"access_token"`
  22. Description string `json:"description"`
  23. ErrorCode int `json:"error_code"`
  24. ExpiresIn int `json:"expires_in"`
  25. OpenId string `json:"open_id"`
  26. RefreshExpiresIn int `json:"refresh_expires_in"`
  27. RefreshToken string `json:"refresh_token"`
  28. Scope string `json:"scope"`
  29. }
  30. // AccessToken返回response
  31. type AccessTokenRes struct {
  32. Message string `json:"message"`
  33. Data ainfo `json:"data"`
  34. }
  35. // GetAccessToken 通过网页授权的code 换取access_token
  36. func GetAccessToken(ClientKey string, ClientSecret string, code string) (accessToken AccessTokenRes, err error) {
  37. uri := fmt.Sprintf(accessTokenUrl, ClientKey, ClientSecret, code)
  38. var response []byte
  39. response, err = util.HTTPGet(uri)
  40. if err != nil {
  41. return AccessTokenRes{}, err
  42. }
  43. var result AccessTokenRes
  44. err = json.Unmarshal(response, &result)
  45. if err != nil {
  46. return AccessTokenRes{}, err
  47. }
  48. if result.Data.ErrorCode != 0 {
  49. return AccessTokenRes{}, fmt.Errorf("GetAccessToken error: error_code=%v, description=%v", result.Data.ErrorCode, result.Data.Description)
  50. }
  51. return result, nil
  52. }
  53. // RefreshAccessToken 刷新AccessToken.
  54. // 当access_token过期(过期时间15天)后,可以通过该接口使用refresh_token(过期时间30天)进行刷新
  55. func RefreshAccessToken(refreshkey string, clientkey string) (accessToken AccessTokenRes, err error) {
  56. req := url.Values{}
  57. req.Set("client_key", clientkey)
  58. req.Set("refresh_token", refreshkey)
  59. req.Set("grant_type", "refresh_token")
  60. data := req.Encode()
  61. var response []byte
  62. response, err = util.HTTPPost(refreshTokenURL, data, "application/x-www-form-urlencoded")
  63. if err != nil {
  64. return AccessTokenRes{}, err
  65. }
  66. var result AccessTokenRes
  67. err = json.Unmarshal(response, &result)
  68. if err != nil {
  69. return AccessTokenRes{}, err
  70. }
  71. if result.Data.ErrorCode != 0 {
  72. return AccessTokenRes{}, fmt.Errorf("GetAccessToken error: error_code=%v, description=%v", result.Data.ErrorCode, result.Data.Description)
  73. }
  74. return result, nil
  75. }