wechat.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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. Unionid string `json:"unionid"`
  19. Scope string `json:"scope"`
  20. Errcode int `json:"errcode"`
  21. Errmsg string `json:"errmsg"`
  22. }
  23. func WxGetUserOpenIdByCode(code string) (item *WxAccessToken, err error) {
  24. if code == "" {
  25. err = errors.New("code is empty")
  26. return nil, err
  27. }
  28. requestUrl := `https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code`
  29. requestUrl = fmt.Sprintf(requestUrl, utils.WxAppId, utils.WxAppSecret, code)
  30. result, err := http.Get(requestUrl)
  31. if err != nil {
  32. return nil, err
  33. }
  34. utils.FileLog.Info("WxGetUserOpenIdByCode:%s", string(result))
  35. err = json.Unmarshal(result, &item)
  36. return
  37. }
  38. type WxToken struct {
  39. AccessToken string `json:"access_token"`
  40. ExpiresIn int `json:"expires_in"`
  41. Errcode int `json:"errcode"`
  42. Errmsg string `json:"errmsg"`
  43. }
  44. func WxGetToken() (item *WxToken, err error) {
  45. requestUrl := `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s`
  46. requestUrl = fmt.Sprintf(requestUrl, utils.WxAppId, utils.WxAppSecret)
  47. fmt.Println("requestUrl:", requestUrl)
  48. result, err := http.Get(requestUrl)
  49. if err != nil {
  50. return nil, err
  51. }
  52. err = json.Unmarshal(result, &item)
  53. fmt.Println("WxGetToken start")
  54. fmt.Println(string(result))
  55. fmt.Println("WxGetToken end")
  56. return
  57. }
  58. func WxGetAccessToken() (accessToken string, err error) {
  59. wxToken, err := models.GetWxToken()
  60. fmt.Println(err, wxToken)
  61. if err != nil && err.Error() != utils.ErrNoRow() {
  62. return
  63. }
  64. //wx_token 不存在
  65. if wxToken == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
  66. token, err := WxGetToken()
  67. if err != nil {
  68. return accessToken, err
  69. }
  70. if token.Errmsg != "" {
  71. err = errors.New("获取access_token 失败 errcode:" + token.Errmsg + " ;errmsg:" + token.Errmsg)
  72. return "", err
  73. }
  74. expiresIn := time.Now().Add(110 * time.Minute).Unix()
  75. err = models.AddWxToken(token.AccessToken, expiresIn)
  76. if err != nil {
  77. err = errors.New("新增wx_token失败" + err.Error())
  78. return accessToken, err
  79. }
  80. accessToken = token.AccessToken
  81. } else {
  82. if wxToken.ExpiresIn <= time.Now().Unix() {
  83. token, err := WxGetToken()
  84. if err != nil {
  85. return accessToken, err
  86. }
  87. if token.Errmsg != "" {
  88. err = errors.New("获取access_token 失败 errcode:" + token.Errmsg + " ;errmsg:" + token.Errmsg)
  89. return "", err
  90. }
  91. expiresIn := time.Now().Add(110 * time.Minute).Unix()
  92. err = models.UpdateWxToken(token.AccessToken, expiresIn, wxToken.Id)
  93. if err != nil {
  94. err = errors.New("修改wx_token失败" + err.Error())
  95. return accessToken, err
  96. }
  97. accessToken = token.AccessToken
  98. } else {
  99. accessToken = wxToken.AccessToken
  100. }
  101. }
  102. return
  103. }
  104. type WxUserInfo struct {
  105. Openid string `json:"openid"`
  106. Nickname string `json:"nickname"`
  107. Sex int `json:"sex"`
  108. Language string `json:"language"`
  109. City string `json:"city"`
  110. Province string `json:"province"`
  111. Country string `json:"country"`
  112. Headimgurl string `json:"headimgurl"`
  113. SubscribeTime int `json:"subscribe_time"`
  114. Unionid string `json:"unionid"`
  115. Remark string `json:"remark"`
  116. Groupid int `json:"groupid"`
  117. SubscribeScene string `json:"subscribe_scene"`
  118. Errcode int `json:"errcode"`
  119. Errmsg string `json:"errmsg"`
  120. }
  121. func WxGetUserInfo(openId, accessToken string) (item *WxUserInfo, err error) {
  122. requestUrl := `https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s`
  123. requestUrl = fmt.Sprintf(requestUrl, accessToken, openId)
  124. result, err := http.Get(requestUrl)
  125. if err != nil {
  126. return
  127. }
  128. fmt.Println("result:", string(result))
  129. utils.FileLog.Info("WxGetUserInfo:%s openId:%s,accessToken:%s ", string(result), openId, accessToken)
  130. utils.FileLog.Info("WxGetUserInfo Result:%s ", string(result))
  131. err = json.Unmarshal(result, &item)
  132. return
  133. }
  134. func GetWxTicket(accessToken string) (string, error) {
  135. Url := strings.Join([]string{"https://api.weixin.qq.com/cgi-bin/ticket/getticket",
  136. "?access_token=", accessToken,
  137. "&type=jsapi"}, "")
  138. infoBody, err := http.Get(Url)
  139. if err != nil {
  140. return "", err
  141. }
  142. atr := models.WxTicket{}
  143. err = json.Unmarshal(infoBody, &atr)
  144. fmt.Println("ticket result:", string(infoBody))
  145. if err != nil {
  146. return atr.Errmsg, err
  147. } else {
  148. return atr.Ticket, nil
  149. }
  150. }
  151. func GetWxSignature(ticket, url, noncestr string) (string, string, int64) {
  152. timestamp := time.Now().Unix()
  153. signStr := strings.Join([]string{"jsapi_ticket=", ticket,
  154. "&noncestr=", noncestr,
  155. "&timestamp=", strconv.FormatInt(timestamp, 10), "&url=", url}, "")
  156. signature := utils.Sha1(signStr)
  157. fmt.Println("signStr", signStr)
  158. return signature, noncestr, timestamp
  159. }
  160. type WxUserDetail struct {
  161. Unionid string
  162. Headimgurl string
  163. Nickname string
  164. }
  165. func FixUnionId() {
  166. accessToken := `41_fMVI8r0fzoDjGOsKjMBhVN9b0j34TWTFNHIX1cQ4IOJ8SnJ2Cjz6MhvHvtH9gU_ztKo-rRQopCgSjNSZB5z25KgB5o61822LDH1sR5ow_Rfoa_Ro6KwcdP2Gp_naNM0AwMGZaF5OMifMny-FFEXfAJAXWP`
  167. users, err := models.GetOpenIdAll()
  168. if err != nil {
  169. fmt.Println("GetOpenIdAll Err:" + err.Error())
  170. return
  171. }
  172. for _, v := range users {
  173. openId := v.OpenId
  174. fmt.Println("openId:",openId,v.UserId)
  175. userInfoUrl := `https://api.weixin.qq.com/cgi-bin/user/info?access_token=` + accessToken + `&openid=` + openId + `&lang=zh_CN`
  176. result, err := http.Get(userInfoUrl)
  177. fmt.Println("err:", err)
  178. utils.FileLog.Info("%s", string(result))
  179. item := new(WxUserDetail)
  180. err = json.Unmarshal(result, &item)
  181. if err != nil {
  182. fmt.Println("json.Unmarshal Err:" + err.Error())
  183. return
  184. }
  185. if item.Unionid != "" {
  186. err = models.ModifyWxUserUnionId(item.Unionid, v.UserId)
  187. if err!=nil {
  188. fmt.Println("ModifyWxUserUnionId Err:"+err.Error())
  189. return
  190. }
  191. //return
  192. }
  193. }
  194. }