def wx_page_scan_reg_sure(request, confirm_code): # 用户扫码注册 # 检查确认码是否注册生成的 weixinscanconfirm = WeixinScanConfirm.objects.filter( code=confirm_code, del_flag=FALSE_INT, busitype=WEIXIN_SCAN_TYPE_REG).first() if not weixinscanconfirm: raise BusinessException(ERR_QRCODE_TIMEOUT) # 检查微信是否已经注册过 old_weixinaccount = WeixinAccount.objects.filter( openid=weixinscanconfirm.openid, del_flag=FALSE_INT) if old_weixinaccount: # 更新确认状态 weixinscanconfirm.status = WEIXIN_CONFIRM_STATUS_ERROR weixinscanconfirm.desc = ERR_WEIXIN_IS_BIND[1] weixinscanconfirm.save() raise BusinessException(ERR_WEIXIN_IS_BIND) # 手机直接跳转成功页面 cur_domain = get_cur_domain(request) # mobile_sure_url = 'http://%s/wx/mobile/scan/sure' % cur_domain mobile_sure_url = 'http://%s/weixin/wxResult?isSuccess=true&type=%s' % ( cur_domain, weixinscanconfirm.busitype) return HttpResponseRedirect(mobile_sure_url)
def wx_get_qrcode(request, busitype): result = dict() # 如果是老用户绑定,清除原来旧的记录 if int(busitype) == WEIXIN_SCAN_TYPE_OLDUSERBIND: WeixinScanConfirm.objects.filter( account=request.user, busitype=busitype, del_flag=FALSE_INT).update(del_flag=TRUE_INT) # 生成新的二维码记录 confirm_code = get_rand_code() # 安全起见,还是校验一下重复,也可能一辈子都走不到这个逻辑上来 update_cnt = WeixinScanConfirm.objects.filter( code=confirm_code, del_flag=FALSE_INT).update(del_flag=TRUE_INT) if update_cnt: logger.info(u'一定要记录下这历史性的一刻!confirm_code=%s' % confirm_code) weixinscanconfirm = WeixinScanConfirm() weixinscanconfirm.code = confirm_code weixinscanconfirm.state = '' weixinscanconfirm.openid = '' weixinscanconfirm.openid_fh = '' weixinscanconfirm.status = WEIXIN_CONFIRM_STATUS_NONE weixinscanconfirm.account = request.user if int( busitype) == WEIXIN_SCAN_TYPE_OLDUSERBIND else None weixinscanconfirm.busitype = busitype weixinscanconfirm.save() # return HttpResponseForbidden(u'<h1>Forbidden<br/> confirm_code = %s</h1>' % confirm_code) # return HttpResponseRedirect('/page/olduserbind/pc?confirm_code=%s' % confirm_code) cur_domain = get_cur_domain(request) # qrcode_url = 'http://%s/wx/page/scan/qrcode?confirm_code=%s&busitype=%s' % (cur_domain, confirm_code, busitype) # 先拿竞赛网和烽火两个公众号的openid state_url = 'http://%s/wx/page/scan/qrcode?confirm_code=%s' % ( cur_domain, confirm_code) param_dict = { "state": state_url, } param_str = urlencode(param_dict) qrcode_url = "http://%s/wx/authorize?%s" % (cur_domain, param_str) logger.info(qrcode_url) qrcode_img_base64 = get_str_qrcode_base64(qrcode_url) result = { "confirm_code": confirm_code, "base64_image": qrcode_img_base64, "base64_html": r'<img src="data:image/gif;base64,' + qrcode_img_base64 + '">', } return result
def wx_page_scan_qrcode(request, confirm_code): result = dict() weixinscanconfirm = WeixinScanConfirm.objects.filter( code=confirm_code, del_flag=FALSE_INT).first() if not weixinscanconfirm: raise BusinessException(ERR_QRCODE_TIMEOUT) weixinscanconfirm.status = WEIXIN_CONFIRM_STATUS_CONFING weixinscanconfirm.save() cur_domain = get_cur_domain(request) if weixinscanconfirm.busitype == WEIXIN_SCAN_TYPE_OLDUSERBIND: # 老用户绑定流程,跳转到绑定页面 # qrcode_url = 'http://%s/wx/mobile/scan/code/olduserbind?confirm_code=%s&mobile=%s' % (cur_domain, confirm_code, weixinscanconfirm.account.mobile) qrcode_url = 'http://%s/weixin/wxHandle?type=%s&confirm_code=%s&mobile=%s' % ( cur_domain, weixinscanconfirm.busitype, confirm_code, weixinscanconfirm.account.mobile) return HttpResponseRedirect(qrcode_url) elif weixinscanconfirm.busitype == WEIXIN_SCAN_TYPE_REG: # 检查微信是否已经注册过 old_weixinaccount = WeixinAccount.objects.filter( openid=weixinscanconfirm.openid, del_flag=FALSE_INT) if old_weixinaccount: # 更新确认状态 weixinscanconfirm.status = WEIXIN_CONFIRM_STATUS_ERROR weixinscanconfirm.desc = ERR_WEIXIN_IS_BIND[1] weixinscanconfirm.save() raise BusinessException(ERR_WEIXIN_IS_BIND) # qrcode_url = 'http://%s/wx/mobile/scan/code/reg?confirm_code=%s&mobile=%s' % (cur_domain, confirm_code, '') qrcode_url = 'http://%s/weixin/wxHandle?type=%s&confirm_code=%s&mobile=%s' % ( cur_domain, weixinscanconfirm.busitype, confirm_code, '') return HttpResponseRedirect(qrcode_url) elif weixinscanconfirm.busitype == WEIXIN_SCAN_TYPE_LOGIN: # 检查微信是否已经注册过 old_weixinaccount = WeixinAccount.objects.filter( openid=weixinscanconfirm.openid, del_flag=FALSE_INT) if not old_weixinaccount: # 更新确认状态 weixinscanconfirm.status = WEIXIN_CONFIRM_STATUS_ERROR weixinscanconfirm.desc = ERR_WEIXIN_IS_NOT_BIND[1] weixinscanconfirm.save() raise BusinessException(ERR_WEIXIN_IS_NOT_BIND) # qrcode_url = 'http://%s/wx/mobile/scan/code/reg?confirm_code=%s&mobile=%s' % (cur_domain, confirm_code, '') qrcode_url = 'http://%s/weixin/wxHandle?type=%s&confirm_code=%s&mobile=%s' % ( cur_domain, weixinscanconfirm.busitype, confirm_code, '') return HttpResponseRedirect(qrcode_url) else: raise BusinessException(ERR_WEIXIN_BUSITYPE)
def wx_page_scan_login_sure(request, confirm_code): # 检查确认码是否登陆生成的 weixinscanconfirm = WeixinScanConfirm.objects.filter( code=confirm_code, del_flag=FALSE_INT, busitype=WEIXIN_SCAN_TYPE_LOGIN).first() if not weixinscanconfirm: raise BusinessException(ERR_QRCODE_TIMEOUT) # 更新确认状态 weixinscanconfirm.status = WEIXIN_CONFIRM_STATUS_CONFIRM weixinscanconfirm.desc = '' weixinscanconfirm.save() # 手机直接跳转成功页面 cur_domain = get_cur_domain(request) # mobile_sure_url = 'http://%s/wx/mobile/scan/sure' % cur_domain mobile_sure_url = 'http://%s/weixin/wxResult?isSuccess=true&type=%s' % ( cur_domain, weixinscanconfirm.busitype) return HttpResponseRedirect(mobile_sure_url)
def wx_get_code_fh(request): try: state = request.GET.get("state", "") confirm_code = request.GET.get("confirm_code", "") fh_weixindefine = get_weixin_define(settings.WEIXIN_DEFINECODE_FH) if not fh_weixindefine: return HttpResponseForbidden( u'<h1>Forbidden<br/> 烽火公众号系统异常,请联系系统管理员!</h1>') weixin_scope = 'snsapi_base' cur_domain = get_cur_domain(request) state = get_shorturl_id(state)['id'] param_dict = { "appid": fh_weixindefine.app_id, "redirect_uri": 'http://%s%s' % (cur_domain, settings.WEIXIN_REDIRECT_URI_FH), # settings.weixin_redirect_uri "response_type": "code", "scope": weixin_scope, "state": state, "confirm_code": confirm_code, } param_str = urlencode(param_dict) redirect_uri = "https://open.weixin.qq.com/connect/oauth2/authorize?%s#wechat_redirect" % param_str logger.debug(redirect_uri) return HttpResponseRedirect(redirect_uri) except Exception as ex: sErrInfo = traceback.format_exc() logger.error(sErrInfo) logger.error(ex.message) return HttpResponseForbidden(ex.message)
def wx_get_code(request): try: state = request.GET.get("state", "") confirm_code = request.GET.get("confirm_code", "") weixindefine = get_weixin_define(settings.WEIXIN_DEFINECODE_JS) if not weixindefine: return HttpResponseForbidden( u'<h1>Forbidden<br/> 获取竞赛网公众号信息失败,请从手机端扫码登陆使用本系统</h1>') weixin_scope = 'snsapi_base' if weixindefine.only_request_openid else 'snsapi_userinfo' cur_domain = get_cur_domain(request) state = get_shorturl_id(state)['id'] # logger.info(dir(settings)) param_dict = { "appid": weixindefine.app_id, "redirect_uri": 'http://%s%s' % (cur_domain, settings.WEIXIN_REDIRECT_URI), "response_type": "code", "scope": weixin_scope, "state": state, "confirm_code": confirm_code, } param_str = urlencode(param_dict) redirect_uri = "https://open.weixin.qq.com/connect/oauth2/authorize?%s#wechat_redirect" % param_str logger.debug(redirect_uri) return HttpResponseRedirect(redirect_uri) except Exception as ex: sErrInfo = traceback.format_exc() logger.error(sErrInfo) logger.error(ex.message) return HttpResponseForbidden(ex.message)
def wx_page_scan_bind_sure(request, confirm_code): result = dict() weixinscanconfirm = WeixinScanConfirm.objects.filter( code=confirm_code, del_flag=FALSE_INT, busitype=WEIXIN_SCAN_TYPE_OLDUSERBIND).first() if not weixinscanconfirm: raise BusinessException(ERR_QRCODE_TIMEOUT) # 检查用户是否已经绑定微信,绑定规则如下 # 如果已经绑定自己,则提示已经注册 # 如果绑定其它微信(非本次扫码的微信),则绑定后,将微信更新为新的微信 # 如果未绑定的其它微信,但是扫码微信绑定了其它帐户,则将微信绑定到当前帐户,原帐户取消微信绑定。 cur_user_weixinaccount = WeixinAccount.objects.filter( account=weixinscanconfirm.account, del_flag=FALSE_INT).first() old_weixinbind_weixinaccount = WeixinAccount.objects.filter( openid=weixinscanconfirm.openid, del_flag=FALSE_INT).first() if not cur_user_weixinaccount: # 检查当前微信是否绑定了别的帐户,如果绑定了,先将其它帐户进行解绑 if old_weixinbind_weixinaccount: old_weixinbind_weixinaccount.del_flag = TRUE_INT old_weixinbind_weixinaccount.save() # 未绑定微信的,直接绑定用户微信 weixinaccount = WeixinAccount() weixinaccount.account = weixinscanconfirm.account weixinaccount.openid = weixinscanconfirm.openid weixinaccount.openid_fh = weixinscanconfirm.openid_fh weixinaccount.save() # 更新确认状态 weixinscanconfirm.status = WEIXIN_CONFIRM_STATUS_CONFIRM weixinscanconfirm.desc = '' weixinscanconfirm.save() elif cur_user_weixinaccount.openid == weixinscanconfirm.openid: # 已经绑定,并且绑定的微信就是当前扫码需要绑定的微信 # 更新确认状态 weixinscanconfirm.status = WEIXIN_CONFIRM_STATUS_ERROR weixinscanconfirm.desc = ERR_WEIXIN_IS_BIND[1] weixinscanconfirm.save() raise BusinessException(ERR_WEIXIN_IS_BIND) else: # 如果已经绑定微信,且绑定的微信不同,先将当前微信解绑,再将当前微信绑到当前帐户。 if old_weixinbind_weixinaccount: old_weixinbind_weixinaccount.del_flag = TRUE_INT old_weixinbind_weixinaccount.save() cur_user_weixinaccount.openid = weixinscanconfirm.openid cur_user_weixinaccount.openid_fh = weixinscanconfirm.openid_fh cur_user_weixinaccount.save() # 更新确认状态 weixinscanconfirm.status = WEIXIN_CONFIRM_STATUS_CONFIRM weixinscanconfirm.desc = '' weixinscanconfirm.save() cur_domain = get_cur_domain(request) # mobile_sure_url = 'http://%s/wx/mobile/scan/sure' % cur_domain mobile_sure_url = 'http://%s/weixin/wxResult?isSuccess=true&type=%s' % ( cur_domain, weixinscanconfirm.busitype) return HttpResponseRedirect(mobile_sure_url)