admin_wx.go 6.4 KB

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