wechat.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package wechat
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "hongze/hongze_yb/controller/response"
  5. response2 "hongze/hongze_yb/models/response"
  6. userResp "hongze/hongze_yb/models/response/user"
  7. "hongze/hongze_yb/services/user"
  8. userService "hongze/hongze_yb/services/user"
  9. "hongze/hongze_yb/services/wechat"
  10. "hongze/hongze_yb/services/wx_app"
  11. "strconv"
  12. )
  13. func GetQrCode(c *gin.Context) {
  14. //wxApp := wx_app.GetWxApp()
  15. //response.OkData("获取成功", qrCode, c)
  16. }
  17. func GetUserInfo(c *gin.Context) {
  18. openid := `oN0jD1S3P-FVosLhq-YiVOXldtRo`
  19. userInfo, err := wechat.GetUserInfo(openid)
  20. if err != nil {
  21. response.Fail("获取失败,Err:"+err.Error(), c)
  22. return
  23. }
  24. response.OkData("获取成功", userInfo, c)
  25. }
  26. func GetUserSession(c *gin.Context) {
  27. code, _ := c.GetQuery("code")
  28. //c.Sho
  29. //fmt.Println(c.Request.)
  30. userInfo, err := wx_app.GetSession(code)
  31. if err != nil {
  32. response.Fail("获取失败,Err:"+err.Error(), c)
  33. return
  34. }
  35. response.OkData("获取成功", userInfo, c)
  36. }
  37. // Login 微信登录
  38. // @Tags 微信相关接口
  39. // @Summary 微信登录
  40. // @Description 微信登录
  41. // @Accept json
  42. // @Product json
  43. // @Param code query string true "微信code"
  44. // @Success 200 {object} response.LoginResp
  45. // @Router /wechat/login [get]
  46. func Login(c *gin.Context) {
  47. //code, _ := c.GetQuery("code")
  48. code := c.DefaultQuery("code", "")
  49. wxUserInfo, err := wx_app.GetSession(code)
  50. if err != nil {
  51. response.Fail("获取失败,Err:"+err.Error(), c)
  52. return
  53. }
  54. token, userId, isBind, err := user.WxLogin(wx_app.WxPlatform, wxUserInfo)
  55. if err != nil {
  56. response.Fail("登录失败,Err:"+err.Error(), c)
  57. return
  58. }
  59. response.OkData("获取成功", response2.LoginResp{
  60. UserId: userId,
  61. IsBind: isBind,
  62. Authorization: token,
  63. }, c)
  64. }
  65. // 消息解密请求参数
  66. type EncryptReq struct {
  67. Code string `description:"手机号获取凭证"`
  68. EncryptedData string
  69. Iv string
  70. IsBind bool `json:"isBind" description:"是否需要去授权绑定"`
  71. }
  72. // GetEncryptInfo 消息解密
  73. // @Tags 微信相关接口
  74. // @Summary 消息解密
  75. // @Description 消息解密
  76. // @Accept json
  77. // @Product json
  78. // @Param encryptedData query string true "加密数据"
  79. // @Param iv query string true "加密算法初始向量"
  80. // @Success 200 {string} string "获取成功"
  81. // @Router /wechat/getEncryptInfo [post]
  82. func GetEncryptInfo(c *gin.Context) {
  83. var req EncryptReq
  84. err := c.ShouldBind(&req)
  85. if err != nil {
  86. response.Fail("参数异常", c)
  87. return
  88. }
  89. if req.EncryptedData == "" {
  90. response.Fail("参数异常:encryptedData", c)
  91. return
  92. }
  93. if req.Iv == "" {
  94. response.Fail("参数异常:iv", c)
  95. return
  96. }
  97. // 获取登录用户信息
  98. userInfo := user.GetInfoByClaims(c)
  99. if userInfo.RecordInfo.SessionKey == "" {
  100. response.Fail("请重新登录", c)
  101. return
  102. }
  103. decryptData, err := wx_app.GetDecryptInfo(userInfo.RecordInfo.SessionKey, req.EncryptedData, req.Iv)
  104. if err != nil {
  105. response.Fail("获取失败,Err:"+err.Error(), c)
  106. return
  107. }
  108. if !req.IsBind {
  109. response.OkData("获取成功", decryptData, c)
  110. return
  111. }
  112. purePhoneNumber := ""
  113. if req.Code != "" {
  114. // 新版code获取手机号
  115. if phoneInfo, err := wx_app.GetPhoneNumber(req.Code); err != nil {
  116. response.Fail("code获取手机号信息失败, Err:" + err.Error(), c)
  117. return
  118. } else {
  119. purePhoneNumber = phoneInfo.PhoneInfo.PurePhoneNumber
  120. }
  121. } else {
  122. purePhoneNumber = decryptData.PurePhoneNumber
  123. }
  124. //如果需要静默授权绑定,那么就去走静默绑定手机号流程
  125. openId := userInfo.OpenID
  126. //国际区号
  127. countryCode, _ := strconv.Atoi(decryptData.CountryCode)
  128. token, newUserInfo, err, errMsg := userService.BindWxUser(openId, purePhoneNumber, "", "", 3, countryCode, 1)
  129. if err != nil {
  130. if errMsg == "" {
  131. errMsg = "登录失败"
  132. }
  133. response.Fail(errMsg, c)
  134. return
  135. }
  136. response.OkData("登录成功", userResp.LoginResp{
  137. UserID: int(newUserInfo.UserID),
  138. Token: token,
  139. Email: newUserInfo.Email,
  140. Mobile: newUserInfo.Mobile,
  141. }, c)
  142. }
  143. // GetWxJsConf
  144. // @Title 微信获取签名接口
  145. // @Description 微信获取签名接口
  146. // @Param Url query string true "url地址"
  147. // @Success 200 {string} string "获取成功"
  148. // @router /getWxJsConf [get]
  149. func GetWxJsConf(c *gin.Context) {
  150. getUrl := c.DefaultQuery("Url", "")
  151. jsConf, err := wechat.GetJsConfig(getUrl)
  152. if err != nil {
  153. response.Fail("获取失败,Err:"+err.Error(), c)
  154. return
  155. }
  156. //resp := new(models.WechatSign)
  157. //resp.AppId = utils.WxAppId
  158. //resp.NonceStr = nonceString
  159. //resp.Timestamp = timestamp
  160. //resp.Url = getUrl
  161. //resp.Signature = signature
  162. //jsConf.AppID
  163. response.OkData("获取成功", jsConf, c)
  164. }