wechat.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package models
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "hongze/hongze_cygx/utils"
  6. "rdluck_tools/orm"
  7. "time"
  8. "rdluck_tools/http"
  9. )
  10. type WxLoginReq struct {
  11. Code string `description:"微信code"`
  12. }
  13. type WxToken struct {
  14. AccessToken string
  15. ExpiresIn int64
  16. Id int64
  17. }
  18. func GetWxAccessToken() (accessTokenStr string, err error) {
  19. o := orm.NewOrm()
  20. sql := `SELECT * FROM wx_token LIMIT 1`
  21. wxToken := new(WxToken)
  22. err = o.Raw(sql).QueryRow(&wxToken)
  23. if err != nil && err.Error() != utils.ErrNoRow() {
  24. utils.FileLog.Info("Get wxToken Err:", err.Error())
  25. return
  26. }
  27. //Token不存在
  28. if wxToken == nil {
  29. fmt.Println("wxToken is empty")
  30. accessToken, err := GetWxToken()
  31. if err != nil {
  32. return "", err
  33. }
  34. if accessToken.AccessToken != "" {
  35. expiresIn := time.Now().Add(time.Duration(accessToken.ExpiresIn) * time.Second).Unix()
  36. addSql := "insert into wx_token (access_token,expires_in) values (?,?)"
  37. _, err = o.Raw(addSql, accessToken.AccessToken, expiresIn).Exec()
  38. accessTokenStr = accessToken.AccessToken
  39. }
  40. return accessTokenStr, err
  41. } else {
  42. //判断token是否过期
  43. if time.Now().Unix() > wxToken.ExpiresIn {
  44. accessToken, err := GetWxToken()
  45. if err != nil {
  46. return "", err
  47. }
  48. if accessToken.AccessToken != "" {
  49. expiresIn := time.Now().Add(time.Duration(accessToken.ExpiresIn) * time.Second).Unix()
  50. updateSql := "update wx_token set access_token = ?,expires_in = ? "
  51. _, err = o.Raw(updateSql, accessToken.AccessToken, expiresIn).Exec()
  52. accessTokenStr = accessToken.AccessToken
  53. fmt.Println("更新 TOKEN:", err)
  54. }
  55. return accessTokenStr, err
  56. } else {
  57. return wxToken.AccessToken, nil
  58. }
  59. }
  60. return
  61. }
  62. func GetWxToken() (item *WxAccessToken, err error) {
  63. getUrl := "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + utils.WxPublicAppId + "&secret=" + utils.WxPublicAppSecret
  64. result, err := http.Get(getUrl)
  65. if err != nil {
  66. utils.FileLog.Info("GetWxToken Err:", err.Error())
  67. return
  68. }
  69. err = json.Unmarshal(result, &item)
  70. if err != nil {
  71. fmt.Println("GetWxToken Unmarshal Err:%s", err.Error())
  72. return
  73. }
  74. if item.Errmsg != "" {
  75. utils.FileLog.Info("GetWxToken fail result:%s", string(result))
  76. }
  77. return
  78. }
  79. type WxAccessToken struct {
  80. AccessToken string `json:"access_token"`
  81. ExpiresIn int `json:"expires_in"`
  82. RefreshToken string `json:"refresh_token"`
  83. Openid string `json:"openid"`
  84. Unionid string `json:"unionid"`
  85. Scope string `json:"scope"`
  86. Errcode int `json:"errcode"`
  87. Errmsg string `json:"errmsg"`
  88. }