wechat.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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. appConf, e := wx_app.GetWxAppConf()
  55. if e != nil {
  56. response.FailMsg("获取失败", "获取小程序配置失败, Err: " + e.Error(), c)
  57. return
  58. }
  59. token, userId, isBind, err := user.WxLogin(appConf.WxPlatform, wxUserInfo)
  60. if err != nil {
  61. response.Fail("登录失败,Err:"+err.Error(), c)
  62. return
  63. }
  64. response.OkData("获取成功", response2.LoginResp{
  65. UserId: userId,
  66. IsBind: isBind,
  67. Authorization: token,
  68. }, c)
  69. }
  70. // 消息解密请求参数
  71. type EncryptReq struct {
  72. Code string `description:"手机号获取凭证"`
  73. EncryptedData string
  74. Iv string
  75. IsBind bool `json:"isBind" description:"是否需要去授权绑定"`
  76. }
  77. // GetEncryptInfo 消息解密
  78. // @Tags 微信相关接口
  79. // @Summary 消息解密
  80. // @Description 消息解密
  81. // @Accept json
  82. // @Product json
  83. // @Param encryptedData query string true "加密数据"
  84. // @Param iv query string true "加密算法初始向量"
  85. // @Success 200 {string} string "获取成功"
  86. // @Router /wechat/getEncryptInfo [post]
  87. func GetEncryptInfo(c *gin.Context) {
  88. var req EncryptReq
  89. err := c.ShouldBind(&req)
  90. if err != nil {
  91. response.Fail("参数异常", c)
  92. return
  93. }
  94. if req.EncryptedData == "" {
  95. response.Fail("参数异常:encryptedData", c)
  96. return
  97. }
  98. if req.Iv == "" {
  99. response.Fail("参数异常:iv", c)
  100. return
  101. }
  102. // 获取登录用户信息
  103. userInfo := user.GetInfoByClaims(c)
  104. if userInfo.RecordInfo.SessionKey == "" {
  105. response.Fail("请重新登录", c)
  106. return
  107. }
  108. decryptData, err := wx_app.GetDecryptInfo(userInfo.RecordInfo.SessionKey, req.EncryptedData, req.Iv)
  109. if err != nil {
  110. response.Fail("获取失败,Err:"+err.Error(), c)
  111. return
  112. }
  113. if !req.IsBind {
  114. response.OkData("获取成功", decryptData, c)
  115. return
  116. }
  117. purePhoneNumber := ""
  118. if req.Code != "" {
  119. // 新版code获取手机号
  120. if phoneInfo, err := wx_app.GetPhoneNumber(req.Code); err != nil {
  121. response.Fail("code获取手机号信息失败, Err:" + err.Error(), c)
  122. return
  123. } else {
  124. purePhoneNumber = phoneInfo.PhoneInfo.PurePhoneNumber
  125. }
  126. } else {
  127. purePhoneNumber = decryptData.PurePhoneNumber
  128. }
  129. //如果需要静默授权绑定,那么就去走静默绑定手机号流程
  130. openId := userInfo.OpenID
  131. //国际区号
  132. countryCode, _ := strconv.Atoi(decryptData.CountryCode)
  133. token, newUserInfo, err, errMsg := userService.BindWxUser(openId, purePhoneNumber, "", "", 3, countryCode, 1)
  134. if err != nil {
  135. if errMsg == "" {
  136. errMsg = "登录失败"
  137. }
  138. response.Fail(errMsg, c)
  139. return
  140. }
  141. response.OkData("登录成功", userResp.LoginResp{
  142. UserID: int(newUserInfo.UserID),
  143. Token: token,
  144. Email: newUserInfo.Email,
  145. Mobile: newUserInfo.Mobile,
  146. }, c)
  147. }
  148. // GetWxJsConf
  149. // @Title 微信获取签名接口
  150. // @Description 微信获取签名接口
  151. // @Param Url query string true "url地址"
  152. // @Success 200 {string} string "获取成功"
  153. // @router /getWxJsConf [get]
  154. func GetWxJsConf(c *gin.Context) {
  155. getUrl := c.DefaultQuery("Url", "")
  156. jsConf, err := wechat.GetJsConfig(getUrl)
  157. if err != nil {
  158. response.Fail("获取失败,Err:"+err.Error(), c)
  159. return
  160. }
  161. //resp := new(models.WechatSign)
  162. //resp.AppId = utils.WxAppId
  163. //resp.NonceStr = nonceString
  164. //resp.Timestamp = timestamp
  165. //resp.Url = getUrl
  166. //resp.Signature = signature
  167. //jsConf.AppID
  168. response.OkData("获取成功", jsConf, c)
  169. }