admin_wx.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "hongze/hongze_mobile_admin/models/tables/admin"
  5. "hongze/hongze_mobile_admin/services"
  6. "hongze/hongze_mobile_admin/utils"
  7. "time"
  8. )
  9. type AdminWxController struct {
  10. BaseCommon
  11. }
  12. // SendSmsCode
  13. // @Title 发送短信验证码
  14. // @Description 发送短信验证码
  15. // @Param Mobile query string true "手机号"
  16. // @Param Token query string true "授权token"
  17. // @Success 200 {object} wechat.WxLoginResp
  18. // @router /send_sms_code [post]
  19. func (c *AdminWxController) SendSmsCode() {
  20. var req admin.SmsCodeReq
  21. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  22. if err != nil {
  23. c.FailWithMessage("参数解析异常!", "参数解析失败,Err:"+err.Error())
  24. return
  25. }
  26. if req.Mobile == "" {
  27. c.FailWithMessage("请输入手机号", "请输入手机号")
  28. return
  29. }
  30. if req.Token == "" {
  31. c.FailWithMessage("请输入授权标识", "请输入授权标识")
  32. return
  33. }
  34. //获取token,如果没有token不允许发送验证码
  35. infoJson, err := utils.Rc.RedisString(utils.HZ_MOBILE_ADMIN_WXLOGIN_TOKEN+req.Token)
  36. if err != nil {
  37. c.FailWithMessage("授权信息不存在", "授权信息不存在"+err.Error())
  38. return
  39. }
  40. info := map[string]string{"open_id":"", "union_id":""}
  41. err = json.Unmarshal([]byte(infoJson), &info)
  42. if err != nil {
  43. c.FailWithMessage("授权信息解析失败", "授权信息解析失败"+err.Error())
  44. return
  45. }
  46. openId := info["open_id"]
  47. if openId == "" {
  48. c.FailWithMessage("授权信息不存在", "授权信息不存在")
  49. return
  50. }
  51. //如果该token中的openID已经被其他手机号绑定,则不允许发送验证码
  52. adminInfo, err := admin.GetAdminWxByAdminOpenId(openId)
  53. if err != nil {
  54. if err.Error() == utils.ErrNoRow() {
  55. err = nil
  56. }else{
  57. c.FailWithMessage("查询管理员信息失败", "查询管理员信息失败"+err.Error())
  58. return
  59. }
  60. }else{
  61. if adminInfo.Mobile != req.Mobile {
  62. c.FailWithMessage("该微信已被其他账号绑定", "该微信已被其他账号绑定")
  63. return
  64. }else{
  65. resp := &admin.WxSmsResp{
  66. BindFlag: true,
  67. }
  68. c.OkDetailed(resp, "已绑定")
  69. return
  70. }
  71. }
  72. //判断手机号是否已绑定,如果已绑定openId,并且和token相等,则不允许发送验证码
  73. adminMobileInfo, err := admin.GetAdminByMobile(req.Mobile)
  74. if err != nil {
  75. if err.Error() == utils.ErrNoRow() {
  76. c.FailWithMessage("管理员账号不存在", "管理员账号不存在")
  77. return
  78. }
  79. c.FailWithMessage("管理员账号查询失败", "管理员账号查询失败"+err.Error())
  80. return
  81. }
  82. if adminMobileInfo.OpenId == openId {
  83. resp := &admin.WxSmsResp{
  84. BindFlag: true,
  85. }
  86. c.OkDetailed(resp, "已绑定")
  87. return
  88. }
  89. //发送短信
  90. code := utils.GetRandDigit(4)
  91. err = services.SendSmsCode(req.Mobile,"",utils.LOGIN_CODE, code)
  92. if err != nil {
  93. c.FailWithMessage("发送验证码失败", "发送验证码失败"+err.Error())
  94. return
  95. }
  96. //存储验证码
  97. err = utils.Rc.Put(utils.HZ_MOBILE_ADMIN_WXLOGIN_MOBILE_CODE+req.Mobile, code, 5*time.Minute)
  98. if err != nil {
  99. c.FailWithMessage("发送验证码失败", "保存验证码到redis中失败"+err.Error())
  100. return
  101. }
  102. resp := &admin.WxSmsResp{
  103. SmsFlag: true,
  104. }
  105. c.OkDetailed(resp, "发送成功")
  106. return
  107. }
  108. // BindMobile
  109. // @Title 绑定手机号
  110. // @Description 绑定手机号
  111. // @Param Mobile query string true "手机号"
  112. // @Param Token query string true "授权token"
  113. // @Param Code query string true "短信验证码"
  114. // @Success 200 {object} wechat.WxLoginResp
  115. // @router /bind_mobile [post]
  116. func (c *AdminWxController) BindMobile() {
  117. var req admin.BindMobileReq
  118. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  119. if err != nil {
  120. c.FailWithMessage("参数解析异常!", "参数解析失败,Err:"+err.Error())
  121. return
  122. }
  123. if req.Mobile == "" {
  124. c.FailWithMessage("请输入手机号", "请输入手机号")
  125. return
  126. }
  127. if req.Token == "" {
  128. c.FailWithMessage("请输入授权标识", "请输入授权标识")
  129. return
  130. }
  131. if req.Code == "" {
  132. c.FailWithMessage("请输入验证码", "请输入验证码")
  133. return
  134. }
  135. //校验验证码
  136. _, err = utils.Rc.RedisString(utils.HZ_MOBILE_ADMIN_WXLOGIN_MOBILE_CODE+req.Mobile)
  137. if err != nil {
  138. c.FailWithMessage("验证码错误或者已过期", "验证码错误或者已过期"+err.Error())
  139. return
  140. }
  141. //获取token,如果没有token不允许发送验证码
  142. infoJson, err := utils.Rc.RedisString(utils.HZ_MOBILE_ADMIN_WXLOGIN_TOKEN+req.Token)
  143. if err != nil {
  144. c.FailWithMessage("授权信息不存在", "授权信息不存在"+err.Error())
  145. return
  146. }
  147. info := map[string]string{"open_id":"", "union_id":""}
  148. err = json.Unmarshal([]byte(infoJson), &info)
  149. if err != nil {
  150. c.FailWithMessage("授权信息解析失败", "授权信息解析失败"+err.Error())
  151. return
  152. }
  153. openId := info["open_id"]
  154. unionId := info["union_id"]
  155. if openId == "" {
  156. c.FailWithMessage("授权信息不存在", "授权信息不存在")
  157. return
  158. }
  159. //如果该token中的openID已经被其他手机号绑定,则绑定openId
  160. adminInfo, err := admin.GetAdminWxByAdminOpenId(openId)
  161. if err != nil {
  162. if err.Error() == utils.ErrNoRow() {
  163. err = nil
  164. }else{
  165. c.FailWithMessage("查询管理员信息失败", "查询管理员信息失败"+err.Error())
  166. return
  167. }
  168. }else{
  169. if adminInfo.Mobile != req.Mobile {
  170. c.FailWithMessage("该微信已被其他账号绑定", "该微信已被其他账号绑定")
  171. return
  172. }else{
  173. c.Ok()
  174. return
  175. }
  176. }
  177. //判断手机号是否已绑定,如果已绑定openId,并且和token不相等,则更新
  178. adminMobileInfo, err := admin.GetAdminByMobile(req.Mobile)
  179. if err != nil {
  180. if err.Error() == utils.ErrNoRow() {
  181. c.FailWithMessage("管理员账号不存在", "管理员账号不存在")
  182. return
  183. }
  184. c.FailWithMessage("管理员账号查询失败", "管理员账号查询失败"+err.Error())
  185. return
  186. }
  187. if adminMobileInfo.OpenId == openId {
  188. c.Ok()
  189. return
  190. }
  191. //更新openid
  192. err = admin.UpdateAdminOpenIdUnionId(adminMobileInfo.AdminId, openId, unionId)
  193. if err != nil {
  194. c.FailWithMessage("绑定手机号失败", "绑定手机号失败"+err.Error())
  195. return
  196. }
  197. c.Ok()
  198. return
  199. }