wechat.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package services
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "hongze/hongze_api/models"
  7. "hongze/hongze_api/utils"
  8. "rdluck_tools/http"
  9. "strconv"
  10. "strings"
  11. "time"
  12. )
  13. type WxAccessToken struct {
  14. AccessToken string `json:"access_token"`
  15. ExpiresIn int `json:"expires_in"`
  16. RefreshToken string `json:"refresh_token"`
  17. Openid string `json:"openid"`
  18. Scope string `json:"scope"`
  19. Errcode int `json:"errcode"`
  20. Errmsg string `json:"errmsg"`
  21. }
  22. func WxGetUserOpenIdByCode(code string) (item *WxAccessToken, err error) {
  23. if code == "" {
  24. err = errors.New("code is empty")
  25. return nil, err
  26. }
  27. requestUrl := `https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code`
  28. requestUrl = fmt.Sprintf(requestUrl, utils.WxAppId, utils.WxAppSecret, code)
  29. result, err := http.Get(requestUrl)
  30. if err != nil {
  31. return nil, err
  32. }
  33. utils.FileLog.Info("WxGetUserOpenIdByCode:%s",string(result))
  34. err = json.Unmarshal(result, &item)
  35. return
  36. }
  37. type WxToken struct {
  38. AccessToken string `json:"access_token"`
  39. ExpiresIn int `json:"expires_in"`
  40. Errcode int `json:"errcode"`
  41. Errmsg string `json:"errmsg"`
  42. }
  43. func WxGetToken() (item *WxToken, err error) {
  44. requestUrl := `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s`
  45. requestUrl = fmt.Sprintf(requestUrl, utils.WxAppId, utils.WxAppSecret)
  46. fmt.Println("requestUrl:", requestUrl)
  47. result, err := http.Get(requestUrl)
  48. if err != nil {
  49. return nil, err
  50. }
  51. err = json.Unmarshal(result, &item)
  52. fmt.Println("WxGetToken start")
  53. fmt.Println(string(result))
  54. fmt.Println("WxGetToken end")
  55. return
  56. }
  57. func WxGetAccessToken() (accessToken string, err error) {
  58. wxToken, err := models.GetWxToken()
  59. fmt.Println(err,wxToken)
  60. if err != nil && err.Error() != utils.ErrNoRow() {
  61. return
  62. }
  63. //wx_token 不存在
  64. if wxToken == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
  65. token, err := WxGetToken()
  66. if err != nil {
  67. return accessToken, err
  68. }
  69. if token.Errmsg != "" {
  70. err = errors.New("获取access_token 失败 errcode:" + token.Errmsg + " ;errmsg:" + token.Errmsg)
  71. return "", err
  72. }
  73. expiresIn := time.Now().Add(110 * time.Minute).Unix()
  74. err = models.AddWxToken(token.AccessToken, expiresIn)
  75. if err != nil {
  76. err = errors.New("新增wx_token失败" + err.Error())
  77. return accessToken, err
  78. }
  79. accessToken = token.AccessToken
  80. } else {
  81. if wxToken.ExpiresIn <= time.Now().Unix() {
  82. token, err := WxGetToken()
  83. if err != nil {
  84. return accessToken, err
  85. }
  86. if token.Errmsg != "" {
  87. err = errors.New("获取access_token 失败 errcode:" + token.Errmsg + " ;errmsg:" + token.Errmsg)
  88. return "", err
  89. }
  90. expiresIn := time.Now().Add(110 * time.Minute).Unix()
  91. err = models.UpdateWxToken(token.AccessToken, expiresIn, wxToken.Id)
  92. if err != nil {
  93. err = errors.New("修改wx_token失败" + err.Error())
  94. return accessToken, err
  95. }
  96. accessToken = token.AccessToken
  97. } else {
  98. accessToken = wxToken.AccessToken
  99. }
  100. }
  101. return
  102. }
  103. type WxUserInfo struct {
  104. Openid string `json:"openid"`
  105. Nickname string `json:"nickname"`
  106. Sex int `json:"sex"`
  107. Language string `json:"language"`
  108. City string `json:"city"`
  109. Province string `json:"province"`
  110. Country string `json:"country"`
  111. Headimgurl string `json:"headimgurl"`
  112. SubscribeTime int `json:"subscribe_time"`
  113. Unionid string `json:"unionid"`
  114. Remark string `json:"remark"`
  115. Groupid int `json:"groupid"`
  116. SubscribeScene string `json:"subscribe_scene"`
  117. Errcode int `json:"errcode"`
  118. Errmsg string `json:"errmsg"`
  119. }
  120. func WxGetUserInfo(openId,accessToken string) (item *WxUserInfo, err error) {
  121. requestUrl := `https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s`
  122. requestUrl = fmt.Sprintf(requestUrl, accessToken, openId)
  123. result, err := http.Get(requestUrl)
  124. if err != nil {
  125. return
  126. }
  127. utils.FileLog.Info("WxGetUserInfo:%s openId:%s,accessToken:%s ",string(result),openId,accessToken)
  128. err = json.Unmarshal(result, &item)
  129. return
  130. }
  131. func GetWxTicket(accessToken string) (string, error) {
  132. Url := strings.Join([]string{"https://api.weixin.qq.com/cgi-bin/ticket/getticket",
  133. "?access_token=", accessToken,
  134. "&type=jsapi"}, "")
  135. infoBody, err := http.Get(Url)
  136. if err != nil {
  137. return "", err
  138. }
  139. atr := models.WxTicket{}
  140. err = json.Unmarshal(infoBody, &atr)
  141. fmt.Println("ticket result:", string(infoBody))
  142. if err != nil {
  143. return atr.Errmsg, err
  144. } else {
  145. return atr.Ticket, nil
  146. }
  147. }
  148. func GetWxSignature(ticket, url, noncestr string) (string, string, int64) {
  149. timestamp := time.Now().Unix()
  150. signStr := strings.Join([]string{"jsapi_ticket=", ticket,
  151. "&noncestr=", noncestr,
  152. "&timestamp=", strconv.FormatInt(timestamp, 10), "&url=", url}, "")
  153. signature := utils.Sha1(signStr)
  154. fmt.Println("signStr", signStr)
  155. return signature, noncestr, timestamp
  156. }