init.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. package apps
  2. import (
  3. "fmt"
  4. "regexp"
  5. "strings"
  6. // "time"
  7. "github.com/astaxie/beego"
  8. "github.com/astaxie/beego/context"
  9. "github.com/user_agent"
  10. // "github.com/uuid"
  11. // "fohow.com/apps/controllers/user_controller"
  12. // "fohow.com/apps/models/balance_model"
  13. "fohow.com/apps/models/channel_gzh_qrcode_model"
  14. "fohow.com/apps/models/user_model"
  15. // "fohow.com/libs/tool"
  16. // "fohow.com/libs/wx_mp"
  17. )
  18. const (
  19. SessionUserKey = "uid"
  20. SessionWxUserKey = "wxuid" //用于小程序
  21. // SessionWxXcxUserKey = "wxxcxuid"
  22. XcxSessionKey = "XcxSessionKey" // 小程序用于加密解密数据的key
  23. )
  24. var (
  25. // 共用
  26. OtherSNotAllow = []string{"othersNotAllow", "非店长无法在专区下单!"}
  27. AlreadyShop = []string{"alreadyShop", "您已经是店主,请勿重复申请"}
  28. ShopNoRepit = []string{"shopNoRepit", "请勿重复申请"}
  29. NoCart = []string{"noCart", "请选择您需要结算的产品"}
  30. NoExist = []string{"noExist", "不存在"}
  31. HasOver = []string{"hasOver", "已结束"}
  32. NoShopSale = []string{"noShopSale", "该商品非专区商品"}
  33. HasPaied = []string{"hasPaied", "已支付"}
  34. AccountError = []string{"accountError", "账户异常"}
  35. GongZhongHaoNoExist = []string{"gongZhongHaoNoExist", "公众号不存在"}
  36. Error = []string{"error", "未知错误"}
  37. TypeError = []string{"error", "类型错误"}
  38. CountError = []string{"countError", "数量错误"}
  39. RegisterUserError = []string{"registerUserError", "注册会员错误"}
  40. BindingWxPhoneError = []string{"bindingWxPhone", "绑定失败"}
  41. XcxAuthorizeError = []string{"XcxAuthorizeError", "授权失败"}
  42. PicVerifyCodeError = []string{"picVerifyCodeError", "图片验证码错误"}
  43. WxUserInfoError = []string{"wxUserInfoError", "微信会员信息错误!"}
  44. ChannelNotMatch = []string{"channelNotMatch", "渠道不匹配"}
  45. ChanneloExist = []string{"channelNoExist", "渠道不存在"}
  46. UploadFileError = []string{"uploadFileError", "上传文件失败!"}
  47. UploadFileTypeInvalid = []string{"uploadFileTypeError", "上传文件类型错误!仅支持以下格式:doc|docx|pdf|ppt|pptx|zip"}
  48. UploadImgTypeInvalid = []string{"uploadImgTypeError", "上传文件类型错误!仅支持以下格式:png|jpg|jpeg"}
  49. // 登录相关
  50. HasLogin = []string{"hasLogin", "已登录"}
  51. HasLogout = []string{"hasLogout", "已登出"}
  52. UserNeedLogin = []string{"userNeedLogin", "需要用户登录"}
  53. UserAuthorizeFailed = []string{"userAuthorizeFailed", "用户授权失败"}
  54. UserNeedTel = []string{"userNeedTel", "需要用户绑定手机"}
  55. UserTelNotMatch = []string{"userTelNotMatch", "手机号码不匹配,请使用当前登录用户的号码"}
  56. WxUserNeedLogin = []string{"wxUserNeedLogin", "需要微信用户登录"}
  57. NotWeixinClient = []string{"notWeixinClient", "不是微信客户端"}
  58. SignupNotOpen = []string{"signupNotOpen", "注册暂未开放,敬请期待"}
  59. // 支付相关
  60. PayWayNoMatch = []string{"payWayNoMatch", "请选择正确的支付方式"}
  61. //请输入充值数额
  62. RechargeCountWrong = []string{"rechargeCountWrong", "请输入充值数额"}
  63. // 关注
  64. WxUserNeedSubscribe = []string{"wxUserNeedSubscribe", "请先关注公众号"}
  65. TGDKjNeedSub = []string{"TGDKjNeedSub", "请先进入公众号领取大刀"}
  66. BlackUser = []string{"blackUser", "对不起,您已被拉黑"}
  67. BlackUrl = []string{"blackUrl", "对不起,网址不允许访问"}
  68. BlackOrder = []string{"blackOrder", "该订单作弊,已被拉黑"}
  69. CreateOrderFail = []string{"createOrderFail", "创建订单失败"}
  70. OnlyPlayInWeixin = []string{"onlyPlayInWeixin", "只能在微信客户端进行"}
  71. OrderNotExist = []string{"orderNotExist", "订单不存在"}
  72. OrderExist = []string{"orderExist", "订单已存在"}
  73. PayFail = []string{"payFail", "支付失败"}
  74. ParamsError = []string{"paramsError", "参数错误"}
  75. ValidParamsError = []string{"validateParamsError", "验证参数错误"}
  76. ParamsRequired = []string{"paramsRequired", "缺少参数"}
  77. ProductStockZero = []string{"productStockZero", "商品库存为零"}
  78. ProductStockNotEnough = []string{"productStockNotEnough", "商品库存不足"}
  79. ProductNotExist = []string{"productNotExist", "产品不存在"}
  80. ProductNotApproved = []string{"productNotApproved", "产品还未上架"}
  81. ProductOffSale = []string{"productOffSale", "产品已经下架"}
  82. OverLimitCount = []string{"overLimitCount", "超过限购数量"}
  83. PurchasedReachLimit = []string{"purchasedReachLimit", "已购买总数已达到限购数量"}
  84. RedirectTo = []string{"redirectTo", "302跳转"}
  85. ReduceFail = []string{"reduceFail", "帮砍失败"}
  86. UserNotExist = []string{"userNotExist", "用户不存在"}
  87. AddressNotExist = []string{"addressNotExist", "地址不存在"}
  88. UserAddressFull = []string{"userAddressFull", "最多添加5条地址"}
  89. UploadUserHeadError = []string{"uploadUserHeadError", "上传头像错误"}
  90. AddressNotMatch = []string{"addressNotMatch", "地址不匹配"}
  91. NotUnPay = []string{"notUnPay", "无法支付,该订单已支付或者已过期"}
  92. NotRightPayWay = []string{"notRightPayWay", "无法支付,该订单只支持微信支付"}
  93. HasAlreadyPay = []string{"hasAlreadyPay", "该订单已支付过"}
  94. NotPayInTime = []string{"notPayInTime", "没在规定时间内完成支付"}
  95. PayWayNotAllow = []string{"payWayNotAllow", "不支持该支付方式"}
  96. PayNoAuthed = []string{"payNoAuthed", "支付未授权"}
  97. PhoneInvalid = []string{"phoneInvalid", "手机号码格式不正确"}
  98. PhoneExist = []string{"phoneExist", "手机号码已被注册,请更换其他号码"}
  99. SMSInvalid = []string{"smsInvalid", "短信验证码不正确"}
  100. CodesSendTooOften = []string{"codesSendTooOften", "短信验证码发送过于频繁,请半小时后重试"}
  101. WxMenusCreatedFailed = []string{"wxMenusCreatedFailed", "微信菜单创建失败"}
  102. //小程序相关
  103. XcxGetSessionKeyError = []string{"xcxGetSessionKeyError", "获取session key失败"}
  104. RailAdminIPReduced = []string{"railsAdminIPReduced", "拒绝此IP访问,权限不够"}
  105. TelCodesError = []string{"telCodeError", "验证码错误"}
  106. TelCodesTypeError = []string{"telCodesTypeError", "验证码类型错误"}
  107. PasswordError = []string{"passwordError", "密码错误"}
  108. LoginPwdSameWithTradePwdError = []string{"loginPwdSameWithTradePwdError", "登录密码与交易密码不能相同,请重新设置"}
  109. OrginalPasswordError = []string{"orginalPasswordError", "原始密码错误"}
  110. TelCodesExpired = []string{"telCodeExpired", "验证码已过期"}
  111. LoginPasswordError = []string{"loginPasswordError", "登录密码错误"}
  112. TradePasswordError = []string{"tradePasswordError", "交易密码错误"}
  113. TradePasswordEmptry = []string{"tradePasswordEmpty", "未设置交易密码"}
  114. UpdatePasswordError = []string{"updatePasswordError", "更新密码出错"}
  115. PasswordLengthError = []string{"passwordLengthError", "密码长度错误,需要6-20位"}
  116. GetCaptchaError = []string{"getCaptchaError", "获取图片验证码错误"}
  117. BindingBankCardEmpty = []string{"bindingBankCardEmpty", "绑定银行卡错误,请完善银行卡信息"}
  118. BindingWxUserError = []string{"bindingWxUserError", "绑定微信错误,请重试"}
  119. BindingUserTelError = []string{"bindingUserTelError", "绑定电话错误,请重试"}
  120. BindingIdCardEmpty = []string{"bindingIdCardEmpty", "绑定身份证错误,请填写真实姓名及身份证号"}
  121. UserHasBindIdCard = []string{"userHasBindIdCard", "该用户已绑定了身份证,请联系客服更改"}
  122. BindingIdCardExist = []string{"bindingIdCardExist", "该身份证已被绑定,请更换其他身份证"}
  123. BindingIdCardLengthError = []string{"bindingIdCardLengthError", "身份证位数不合法"}
  124. BindingTelExisted = []string{"bindingTelExisted", "该号码已绑定了微信用户,请尝试其他号码"}
  125. WxUserHasBindingTel = []string{"wxUserHasBindingTel", "该微信用户已经绑定了手机,请勿重复绑定"}
  126. WxUserNotExist = []string{"wxUserNotExist", "微信用户不存在"}
  127. WxUserNotRegistD5c = []string{"wxUserNotRegistD5c", "用户在第五创没有绑定手机号码"}
  128. IdCardAgeNotBeAdult = []string{"idCardAgeNotBeAdult", "未满18岁,身份认证失败"}
  129. // 工具tool相关
  130. DownloadError = []string{"downloadError", "阿里云下载文件错误"}
  131. ConvertToBase64Error = []string{"convertToBase64Error", "转base64错误"}
  132. //资金账户相关
  133. BalanceNotExist = []string{"balanceNotExist", "资金明细不存在"}
  134. BalanceNotEnough = []string{"balanceNotEnough", "余额不足"}
  135. BalanceNotEnoughForCharge = []string{"balanceNotEnoughForCharge", "可提现余额不足支付手续费,无法提现"}
  136. TakeCashAmountLessThanCharge = []string{"balanceAmountLessThanCharge", "提现金额需大于手续费金额"}
  137. TakeCashAmountInvalid = []string{"takeCashAmountInvalid", "提现金额不合法,仅支持小数点后两位。如:88.88"}
  138. RechargeAmountInvalid = []string{"RechargeAmountInvalid", "充值金额不合法,仅支持小数点后两位。如:88.88"}
  139. BankCardNotFound = []string{"bankCardNotFound", "请先绑定银行卡"}
  140. BankCardNoInvalid = []string{"bankCardNoInvalid", "银行卡号不合法,请重新输入"}
  141. BankCardNotMatch = []string{"bankCardNotMatch", "银行卡号不匹配,请使用实名认证的本人银行卡绑定,如认证信息有误,请联系客服更改"}
  142. BankCardHasNoRecordOnLianLianPay = []string{"bankCardHasNoRecordOnLianLianPay", "该银行卡在连连支付无记录,请先充值"}
  143. BankCardCountLimit = []string{"bankCardCountLimit", "银行卡绑定数量限制"}
  144. CanNotDeleteDefaultBankCard = []string{"canNotDeleteDefaultBankCard", "不能删除默认银行卡"}
  145. BankCardHasBound = []string{"bankCardHasBound", "该银行卡已有绑定记录"}
  146. //春节红包
  147. ActivityNotStart = []string{"activityNotStart", "活动尚未开始"}
  148. ActivityIsEnd = []string{"activityIsEnd", "活动已经结束"}
  149. HasGotLuckyMoney = []string{"hasGotLuckyMoney", "你已经拿过红包了"}
  150. //商家
  151. OrderNotBelongToCurrentUser = []string{"orderNotBelongToCurrentUser", "订单不属于当前用户。"}
  152. OrderStatusNotSuit = []string{"orderStatusNotSuit", "只能处理待发货、待收货的订单"}
  153. OrderAlreadyDispatch = []string{"orderAlreadyDispatch", "该订单已经被处理发货"}
  154. OrderAlreadyRefund = []string{"orderAlreadyRefund", "该订单已经被处理退款"}
  155. OrderRefundFaild = []string{"orderRefundFaild", "退款失败,请联系客服"}
  156. CurrentMerIsNotSuperAdminMerchant = []string{"currentMerIsNotSuperAdminMerchant", "当前用户不是商家超级管理员"}
  157. CurrentMerIsNotManageTheProduct = []string{"currentMerIsNotManageTheProduct", "当前用户不负责管理该商品"}
  158. //移动讯兑
  159. DataUnMarsha1Error = []string{"dataUnMarsha1Error", "数据解析错误"}
  160. //项目
  161. ProjectNoExist = []string{"projectNoExist", "项目不存在"}
  162. ProjectInvestWayNoExist = []string{"projectInvestWayNoExist", "该资助方式不存在"}
  163. //微信公众号登录
  164. NetworkBusy = []string{"networkBusy", "对不起,网络繁忙,请稍后再试"}
  165. //秒杀活动
  166. SeckillNotStart = []string{"seckillNotStart", "秒杀活动尚未开始"}
  167. SeckillIsEnd = []string{"seckillIsEnd", "秒杀活动已经结束"}
  168. SeckillNotAllow = []string{"seckillNotAllow", "秒杀商品不允许加入购物车"}
  169. OnlyNew = []string{"onlyNew", "仅限新人购买"}
  170. )
  171. type BaseController struct {
  172. beego.Controller
  173. OnlyCheckUserLoginAction []string
  174. ExceptCheckUserLoginAction []string
  175. OnlyCheckWxUserLoginAction []string
  176. ExceptCheckWxUserLoginAction []string
  177. UserNeedLoginAction []string
  178. }
  179. type Result struct {
  180. Status int `json:"status"`
  181. Result []interface{} `json:"result"`
  182. }
  183. //定义正确结果集
  184. func (self *BaseController) FormatResult(result []interface{}) *Result {
  185. return &Result{
  186. Status: 200,
  187. Result: result,
  188. }
  189. }
  190. func (self *BaseController) GetCurrentUserId() int64 {
  191. uId, _ := self.GetSession(SessionUserKey).(int64)
  192. return uId
  193. }
  194. func (self *BaseController) GetCurrentUser(useCache bool) *user_model.User {
  195. id := self.GetCurrentUserId()
  196. if id <= 0 {
  197. return nil
  198. }
  199. u := user_model.GetUserById(id, useCache)
  200. if u == nil {
  201. beego.BeeLogger.Error("User Not Found, uid=%d", id)
  202. }
  203. return u
  204. }
  205. func (self *BaseController) GetCurrentWxUserId() int64 {
  206. id, _ := self.GetSession(SessionWxUserKey).(int64)
  207. return id
  208. }
  209. func (self *BaseController) GetCurrentWxUser(useCache bool) *user_model.WxUser {
  210. id := self.GetCurrentWxUserId()
  211. if id <= 0 {
  212. return nil
  213. }
  214. u := user_model.GetWxUserById(id, useCache)
  215. if u == nil {
  216. beego.BeeLogger.Error("WxUser Not Found, id=%d", id)
  217. }
  218. return u
  219. }
  220. // //检查是否是邀请注册,绑定上下级关系, 发送微信通知。使用范围:注册、绑定手机、拉新专题
  221. // func (self *BaseController) CheckInviteBinding(user *user_model.User) {
  222. // if user == nil {
  223. // return
  224. // }
  225. // //邀请注册,绑定关系
  226. // inviteKey := beego.AppConfig.String("InviteName")
  227. // inviterId := self.Ctx.GetCookie(inviteKey)
  228. // if inviterId != "" {
  229. // id, err := strconv.ParseInt(inviterId, 10, 64)
  230. // if err == nil {
  231. // inviter := user_model.GetUserById(id, true)
  232. // if inviter != nil && user.InviteId == 0 {
  233. // //绑定关系
  234. // user.InviteId = id
  235. // go user.Save()
  236. // //增加邀请收益统计记录, 记录注册用户的ip
  237. // ip := self.Ctx.Input.IP()
  238. // new(user_model.UserInviteBenefitStat).Create(user.Id, user.InviteId,
  239. // 1, 0, time.Now(), ip)
  240. // //给邀请人发邀请成功的通知
  241. // WxInviter := user_model.GetWxUserByUserId(inviter.Id, true)
  242. // if WxInviter != nil {
  243. // //给邀请人发注册成功通知
  244. // openId := WxInviter.MpOpenid
  245. // url := fmt.Sprintf("%s/v1/cfc/36", beego.AppConfig.String("ApiHost"))
  246. // title := "有人通过您的邀请,并成功注册\n"
  247. // telwStar := tool.ReplaceTelMid4(inviter.Tel)
  248. // nickName, account := telwStar, telwStar
  249. // if user.Nickname != "" {
  250. // nickName = user.Nickname
  251. // }
  252. // cTime := inviter.CreatedAt.Format("2006-01-02 15:04:05")
  253. // remark := "\n点击详情,可以看一看TA"
  254. // wx_mp.TmplmsgInviteSignUp(openId, url, title, nickName, account, cTime, remark)
  255. // }
  256. // //给新人发红包,并发通知
  257. // c := int64(user_model.BenefitNewUser)
  258. // s := balance_model.BALANCE_SOURCE_SIGN_UP_ONLINE
  259. // remark := balance_model.BALANCE_SOURCE_SIGN_UP_ONLINE_NAME
  260. // rId := ""
  261. // balance := new(balance_model.Balance).Create(user.Id, c, s, rId, remark, 1)
  262. // if balance != nil {
  263. // wxUser := user_model.GetWxUserByUserId(user.Id, true)
  264. // //发送红包的通知
  265. // if wxUser != nil {
  266. // openId := wxUser.MpOpenid
  267. // url := fmt.Sprintf("%s/v1/cfc/37", beego.AppConfig.String("ApiHost"))
  268. // first := "注册成功,返现金额已到账\n"
  269. // count := fmt.Sprintf("%0.2f 元", float64(c)/100.0)
  270. // //新用户,余额是0
  271. // leftAmount := c //balance_model.GetUserTotalBalance(user.Id)
  272. // balance := fmt.Sprintf("%0.2f 元", float64(leftAmount)/100.0)
  273. // ctime := time.Now().Format("2006-01-02 15:04:05")
  274. // remark := "\n点击立即提现>"
  275. // wx_mp.TmplmsgBalanceChange(openId, url, first, ctime, count, balance, remark)
  276. // }
  277. // }
  278. // }
  279. // }
  280. // }
  281. // }
  282. //检验是否需要关注
  283. //sceneId, 关注场景id
  284. func (self *BaseController) CheckWxUserSubscribe(sceneId int64) {
  285. beego.BeeLogger.Info("check wx_user subscribe")
  286. ctx := self.Ctx
  287. if !isWxClient(ctx) {
  288. return
  289. }
  290. wxUserId, ok := ctx.Input.Session(SessionWxUserKey).(int64)
  291. if ok {
  292. wxUser := user_model.GetWxUserById(wxUserId, false)
  293. if wxUser == nil {
  294. beego.BeeLogger.Error("WxUser Not Found, id=%d", wxUserId)
  295. } else {
  296. if wxUser.Subscribe == 0 {
  297. qrcode := channel_gzh_qrcode_model.GetBySceneId(sceneId, true)
  298. if qrcode == nil {
  299. //默认二维码
  300. qrcode = channel_gzh_qrcode_model.GetBySceneId(25, true)
  301. }
  302. qrcodeUrl := qrcode.QrcodeImg
  303. errCode := &ErrCode{
  304. Code: WxUserNeedSubscribe[0],
  305. Msg: WxUserNeedSubscribe[1],
  306. Redirect: qrcodeUrl,
  307. Data: nil,
  308. }
  309. ctx.Output.SetStatus(403)
  310. ctx.Output.JSON(errCode, true, true)
  311. self.StopRun()
  312. }
  313. }
  314. } else {
  315. beego.BeeLogger.Error("WxUser Not Login")
  316. }
  317. }
  318. func checkWxUserLogin(ctx *context.Context) {
  319. // TODO : 整个项目也应该更加适合采用 token 机制
  320. beego.BeeLogger.Info("check wx_user login")
  321. if !isWxClient(ctx) {
  322. return
  323. }
  324. wxUserId, ok := ctx.Input.Session(SessionWxUserKey).(int64)
  325. if ok {
  326. _, ok := ctx.Input.Session(SessionUserKey).(int64)
  327. if !ok {
  328. // 如果微信用户登录了,且有绑定了user,则设置用户登录
  329. wxUser := user_model.GetWxUserById(wxUserId, true)
  330. beego.BeeLogger.Warn("wx_user has login, ", wxUser)
  331. if wxUser != nil && int(wxUser.UserId) > 0 {
  332. ctx.Output.Session(SessionUserKey, wxUser.UserId)
  333. }
  334. }
  335. } else {
  336. // beego.BeeLogger.Warn("---------------%v", ctx.Input.IsAjax())
  337. // beego.BeeLogger.Warn("---------------%s", ctx.Input)
  338. // if ctx.Input.IsAjax() {
  339. beego.BeeLogger.Info("show the request : %s from UserAgent: %s", ctx.Input.URI(), ctx.Input.UserAgent())
  340. uri := ctx.Input.URI()
  341. //外链进来需要自动登录
  342. if strings.Contains(uri, "/v1/cfc/") && isWxClient(ctx) {
  343. // 微信用户自动登录
  344. url := fmt.Sprintf("%s/login/mp?cb=%s%s",
  345. beego.AppConfig.String("ApiHost"),
  346. ctx.Input.Site(), ctx.Input.URI())
  347. ctx.Redirect(302, url)
  348. return
  349. } else {
  350. errCode := &ErrCode{
  351. Code: UserNeedLogin[0],
  352. Msg: UserNeedLogin[1],
  353. Redirect: "",
  354. Data: nil,
  355. }
  356. ctx.Output.SetStatus(401)
  357. ctx.Output.JSON(errCode, true, true)
  358. return
  359. }
  360. // } else {
  361. // // FIXME : 这里 IsAjax 判断是否有问题? 微信来的应该属于api请求
  362. // beego.BeeLogger.Debug("WEIXIN user not login", ctx.Input)
  363. // errCode := &ErrCode{
  364. // Code: UserNeedLogin[0], // FIXME : 这里应该 是 WxUserNeedLogin, 因为前端编码用了UserNeedLogin,以后一起修改
  365. // Msg: UserNeedLogin[1],
  366. // Redirect: "",
  367. // Data: nil,
  368. // }
  369. // ctx.Output.SetStatus(401)
  370. // ctx.Output.JSON(errCode, true, true)
  371. // return
  372. // beego.BeeLogger.Warn("this is not a ajax request!")
  373. // 微信用户自动登录
  374. // if isWxClient(ctx) {
  375. // // beego.BeeLogger.Warn("---------------%s", ctx.Input.Site())
  376. // url := fmt.Sprintf("%s/login/mp?cb=%s%s",
  377. // beego.AppConfig.String("ApiHost"),
  378. // ctx.Input.Site(), ctx.Input.URI())
  379. // // beego.BeeLogger.Warn("auto login mp cb url=%s", url)
  380. // ctx.Redirect(302, url)
  381. // return
  382. // }
  383. // }
  384. }
  385. }
  386. func checkUserLogin(ctx *context.Context) {
  387. beego.BeeLogger.Info("check user login")
  388. userId, ok := ctx.Input.Session(SessionUserKey).(int64)
  389. if ok {
  390. _, ok := ctx.Input.Session(SessionWxUserKey).(int64)
  391. if !ok {
  392. beego.BeeLogger.Info("user has login, try to set seesion[wx_user]")
  393. // 如果用户登录了,且有绑定了wx_user,则设置微信用户登录
  394. wxUser := user_model.GetWxUserByUserId(userId, true)
  395. if wxUser != nil {
  396. ctx.Output.Session(SessionWxUserKey, wxUser.Id)
  397. }
  398. }
  399. } else {
  400. _, ok := ctx.Input.Session(SessionWxUserKey).(int64)
  401. if ok {
  402. beego.BeeLogger.Info("user not login, wx_user is login,and try to ask user binding tel.")
  403. // 如果用户没登录了,但采用微信账户登录,则需要微信用户绑定手机从而创建用户记录
  404. errCode := &ErrCode{
  405. Code: UserNeedTel[0],
  406. Msg: UserNeedTel[1],
  407. Redirect: fmt.Sprintf("%s/user/binding/state", beego.AppConfig.String("WWWHost")),
  408. Data: nil,
  409. }
  410. ctx.Output.SetStatus(401)
  411. ctx.Output.JSON(errCode, true, true)
  412. return
  413. }
  414. errCode := &ErrCode{
  415. Code: UserNeedLogin[0],
  416. Msg: UserNeedLogin[1],
  417. Redirect: "",
  418. Data: nil,
  419. }
  420. ctx.Output.SetStatus(401)
  421. ctx.Output.JSON(errCode, true, true)
  422. return
  423. }
  424. }
  425. //检查来自大后台的请求是否为服务器IP
  426. func CheckIsInvokeFromRailsAdmin(ctx *context.Context) {
  427. s := strings.Split(ctx.Request.RemoteAddr, ":")
  428. ip := s[0]
  429. beego.BeeLogger.Debug("railsadmin request ip is: %s", ip)
  430. if ip != beego.AppConfig.String("RailsAdminAddr") {
  431. errCode := &ErrCode{
  432. Code: RailAdminIPReduced[0],
  433. Msg: RailAdminIPReduced[1],
  434. Redirect: "",
  435. Data: nil,
  436. }
  437. ctx.Output.SetStatus(403)
  438. ctx.Output.JSON(errCode, true, true)
  439. }
  440. }
  441. func (self *BaseController) Prepare() {
  442. beego.BeeLogger.Info("invote controller Prepare func")
  443. needChkWxUserLogin := true
  444. needChkUserLogin := true
  445. // needChkWxUserSubscribe := false
  446. _, actionName := self.GetControllerAndAction()
  447. if len(self.ExceptCheckWxUserLoginAction) > 0 {
  448. for _, an := range self.ExceptCheckWxUserLoginAction {
  449. if strings.ToLower(an) == "*" || strings.ToLower(an) == strings.ToLower(actionName) {
  450. needChkWxUserLogin = false
  451. break
  452. }
  453. }
  454. }
  455. if len(self.ExceptCheckUserLoginAction) > 0 {
  456. for _, an := range self.ExceptCheckUserLoginAction {
  457. if strings.ToLower(an) == "*" || strings.ToLower(an) == strings.ToLower(actionName) {
  458. needChkUserLogin = false
  459. break
  460. }
  461. }
  462. }
  463. if needChkWxUserLogin {
  464. checkWxUserLogin(self.Ctx)
  465. }
  466. if needChkUserLogin {
  467. checkUserLogin(self.Ctx)
  468. }
  469. }
  470. type ErrCode struct {
  471. Status int `json:"status"`
  472. Code string `json:"err_code"`
  473. Msg string `json:"err_msg"`
  474. Redirect string `json:"redirect_to"`
  475. Data map[string]string `json:"data"`
  476. }
  477. //定义返回错误信息
  478. func (self *BaseController) ReturnError(status int, code []string, redirect string, data map[string]string) {
  479. errCode := &ErrCode{
  480. Status: status,
  481. Code: code[0],
  482. Msg: code[1],
  483. Redirect: redirect,
  484. Data: data,
  485. }
  486. // jsonErrCode, err := json.Marshal(errCode)
  487. // if err != nil {
  488. // beego.BeeLogger.Error("json encode error=[%s]", err)
  489. // }
  490. self.Ctx.Output.SetStatus(status)
  491. // self.Ctx.Output.Header("Content-Type", "application/json; charset=utf-8")
  492. self.Ctx.Output.JSON(errCode, true, true)
  493. self.StopRun()
  494. // self.ServeJson(status, string(jsonErrCode))
  495. }
  496. //TODO校验是否微信客户端
  497. func (self *BaseController) IsWxClient() bool {
  498. return isWxClient(self.Ctx)
  499. }
  500. //TODO校验是否微信客户端
  501. func isWxClient(ctx *context.Context) bool {
  502. agent := ctx.Input.UserAgent()
  503. b := getRealBrowser(agent)
  504. isWxClient := b == "wx"
  505. return isWxClient
  506. }
  507. // 是否是手机端
  508. func (self *BaseController) IsMobile() bool {
  509. ua := strings.ToLower(self.Ctx.Input.UserAgent())
  510. if ua == "" {
  511. return true
  512. }
  513. ok, _ := regexp.MatchString("iphone|nokia|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|cldc|midp|wap|mobile", ua)
  514. return ok
  515. }
  516. // 是否是开发模式
  517. func (self *BaseController) IsDev() bool {
  518. //return beego.BConfig.RunMode == beego.DEV
  519. return beego.AppConfig.String("Env") != "production"
  520. }
  521. func getRealBrowser(ua string) string {
  522. userAgent := user_agent.New(ua)
  523. browser, _ := userAgent.Browser()
  524. browser = strings.ToLower(browser)
  525. if browser == "internet explorer" {
  526. browser = "ie"
  527. }
  528. lowerUa := strings.ToLower(ua)
  529. // beego.BeeLogger.Warning("ua=%s", lowerUa)
  530. if strings.Contains(lowerUa, "micromessenger") {
  531. browser = "wx"
  532. }
  533. if strings.Contains(lowerUa, "wechatdevtools") {
  534. browser = "wx"
  535. }
  536. return browser
  537. }
  538. func (self *BaseController) GetFullImgUrl(img string) string {
  539. if img == "" {
  540. return ""
  541. }
  542. if strings.HasPrefix(img, "http://") || strings.HasPrefix(img, "https://") {
  543. return img
  544. } else {
  545. return fmt.Sprintf("%s/%s", beego.AppConfig.String("AliCDNImgHost"), img)
  546. }
  547. }
  548. func (self *BaseController) GetCdnFullImgUrl(img string) string {
  549. if img == "" {
  550. return ""
  551. }
  552. if strings.HasPrefix(img, "http://") || strings.HasPrefix(img, "https://") {
  553. return img
  554. } else {
  555. return fmt.Sprintf("%s/%s", beego.AppConfig.String("AliCDNImgHost"), img)
  556. }
  557. }