def make_success(order_no): from app.models import Order order = Order.objects.get(order_no=order_no) if order.status != STATUS_WAITING_ISSUE: print "状态不对" return if order.crawl_source == "hn96520": print "源站订单号:", order.raw_order_no code1 = raw_input("请输入取票密码:") code = raw_input("请再次输入取票密码:") if code1 != code: print "两次输入密码不一致" return dx_info = { "time": order.drv_datetime.strftime("%Y-%m-%d %H:%M"), "start": order.line.s_sta_name, "end": order.line.d_sta_name, "code": code, 'raw_order': order.raw_order_no, } dx_tmpl = DUAN_XIN_TEMPL[SOURCE_HN96520] code_list = ["%s" % (code)] msg_list = [dx_tmpl % dx_info] print msg_list[0] order.modify(status=STATUS_ISSUE_SUCC, pick_code_list=code_list, pick_msg_list=msg_list) order.on_issue_success() from tasks import issued_callback issued_callback.delay(order.order_no)
def make_fail(order_no): order = Order.objects.get(order_no=order_no) content = request.form["content"] if order.status not in [7]: return jsonify({"code": 1, "msg": "非下单重试的单不允许失败"}) if not content: return jsonify({"code": 0, "msg":"内容不能为空"}) order.add_trace(OT_REMARK, "%s:%s" % (current_user.username, content)) order.modify(status=5) now = dte.now() order.line.modify(left_tickets=0, update_datetime=now, refresh_datetime=now) issued_callback.delay(order.order_no) return jsonify({"code": 1, "msg": "修改成功"})
def post(self, order_no): order = Order.objects.get_or_404(order_no=order_no) status = int(request.form.get("status")) desc = request.form.get("desc",'') action = request.form.get("action", "set") if order.status in [STATUS_ISSUE_SUCC, STATUS_ISSUE_ING, STATUS_LOCK_FAIL]: return jsonify({"code": 0, "msg": "%s不允许修改"%STATUS_MSG[order.status]}) if not desc and status != STATUS_LOCK_RETRY: return jsonify({"code": 0, "msg": "描述不能为空"}) msg = "%s修改订单状态:%s=>%s 描述:%s" % (current_user.username,STATUS_MSG[order.status], STATUS_MSG[status], desc) order.add_trace(OT_MODIFY_ORDER_STATUS, msg) order.modify(status=status) if status in [STATUS_LOCK_FAIL, STATUS_ISSUE_FAIL]: now = dte.now() if status == STATUS_LOCK_FAIL: order.line.modify(left_tickets=0, update_datetime=now, refresh_datetime=now) issued_callback.delay(order.order_no) return jsonify({"code": 1, "msg": "修改订单状态成功"}) access_log.info("[modify_order_status] %s", msg) return jsonify({"code":1, "msg": "修改订单状态成功"})
def fangbian_callback(): try: order_log.info("[fanbian-callback] %s", request.get_data()) args = json.loads(request.get_data()) data = args["data"] service_id = args["serviceID"] code = args["code"] order = Order.objects.get(order_no=data["merchantOrderNo"]) if service_id == "B001": # 锁票回调 raw_order = data["ticketOrderNo"] if code == 2100: order.modify(status=STATUS_ISSUE_ING, raw_order_no=raw_order) order.on_issueing(reason="code:%s, message:%s" % (code, args["message"])) else: order.modify(status=STATUS_ISSUE_FAIL, raw_order_no=raw_order) order.on_issue_fail(reason="code:%s, message:%s" % (code, args["message"])) issued_callback.delay(order.order_no) elif service_id == "B002": if code == 2102: msg = urllib.unquote(data["exData"].decode("gbk").encode('utf-8')).replace(u"【", "").replace(u"】", " ") order.modify(status=STATUS_ISSUE_SUCC, pick_code_list=[""], pick_msg_list=[msg]) order.on_issue_success() issued_callback.delay(order.order_no) else: order.modify(status=STATUS_ISSUE_FAIL) order.on_issue_fail(reason="code:%s, message:%s" % (code, args["message"])) issued_callback.delay(order.order_no) except: order_log.error("%s\n%s", "".join(traceback.format_exc()), locals()) return "error" return "success"
def get_pay_page(self, order, valid_code="", session=None, pay_channel="alipay" ,**kwargs): if order.status == STATUS_WAITING_ISSUE: res = self.request_order_detail(order) if not res: msg = u'未获取源站订单号,不允许支付' order.modify(status=STATUS_LOCK_RETRY, line=Line.objects.get(line_id=order.line.check_compatible_lines().get("gdsw", "")), crawl_source='gdsw') order.on_lock_retry(reason=msg) order.reload() return {"flag": "error", "content": '重新打开'} else: r = requests.get(order.pay_url) content = r.content.decode('gbk') res = re.findall(r"alert\('(.*?)'\);", content) if res: errmsg = res[0] if u'不可预售' in errmsg: self.close_line(order.line, reason=errmsg) order.modify(status=STATUS_LOCK_FAIL) order.on_lock_fail(reason=errmsg) issued_callback.delay(order.order_no) return {"flag": "error", "content": '锁票失败'} else: order.modify(status=STATUS_LOCK_RETRY) order.on_lock_retry(reason=errmsg) return {"flag": "error", "content": '重新打开'} else: order.update(pay_channel='alipay') return {"flag": "url", "content": order.pay_url} #return {"flag": "html", "content": content} if order.status in [STATUS_LOCK_RETRY, STATUS_WAITING_LOCK]: self.lock_ticket(order) order.reload() if order.status == STATUS_WAITING_ISSUE: return {"flag": "error", "content": '重新打开'}
def refresh_issue(self, order, force=False): """ 出票刷新主流程,子类不用重写 """ old_status = order.status if not self.need_refresh_issue(order, force=force): return order_log.info("[issue-refresh-start] order:%s", order.order_no) ret = self.do_refresh_issue(order) order.reload() code = ret["result_code"] code_status_mapping = { 0: old_status, 1: STATUS_ISSUE_SUCC, 2: STATUS_ISSUE_FAIL, 3: STATUS_GIVE_BACK, 4: STATUS_ISSUE_ING, } if code_status_mapping.get(code, "") == old_status or code == 0: order_log.info("[issue-refresh-result] keeping order:%s, msg:%s", order.order_no, ret["result_msg"]) return elif code == 1: # 出票成功 msg_list = ret["pick_msg_list"] or order.pick_msg_list code_list = ret["pick_code_list"] or order.pick_code_list if not code_list: # 最初设计要求msg_list和code_list长度必须一致 code_list = [""] * len(msg_list) msg = msg_list and msg_list[0] or "" order_log.info( "[issue-refresh-result] order: %s succ. msg:%s, pick_msg: %s", order.order_no, ret["result_msg"], msg) order.modify(status=STATUS_ISSUE_SUCC, pick_code_list=code_list, pick_msg_list=msg_list) order.on_issue_success() issued_callback.delay(order.order_no) elif code == 2: # 出票失败 order_log.info("[issue-refresh-result] order: %s fail. msg:%s", order.order_no, ret["result_msg"]) order.modify(status=STATUS_ISSUE_FAIL) order.on_issue_fail(ret["result_msg"]) issued_callback.delay(order.order_no) elif code == 3: # 源站已退款 order_log.info( "[issue-refresh-result] order: %s give back. msg:%s", order.order_no, ret["result_msg"]) order.modify(status=STATUS_GIVE_BACK) issued_callback.delay(order.order_no) order.on_give_back() elif code == 4: # 正在出票 order_log.info("[issue-refresh-result] order: %s issueing. msg:%s", order.order_no, ret["result_msg"]) order.modify(status=STATUS_ISSUE_ING) order.on_issueing() elif code == 5: # 超时过期, 进入锁票重试 order_log.info("[issue-refresh-result] order: %s expire. msg:%s", order.order_no, ret["result_msg"]) order.modify(pay_order_no="", raw_order_no="", lock_info={}) self.lock_ticket_retry(order, reason=ret["result_msg"]) else: order_log.error( "[issue-refresh-result] order: %s error, 未处理状态 status:%s", order.order_no, code)
def get_pay_page(self, order, valid_code="", session=None, pay_channel="alipay", bank='', **kwargs): rebot = order.get_lock_rebot() headers = rebot.http_header() new_headers = headers if new_headers.has_key('Content-Type'): del new_headers['Content-Type'] is_login = rebot.test_login_status() msg = '' if not is_login: for i in range(3): msg = rebot.login() if msg == "OK": is_login = True break if not is_login: if msg in u'用户名或密码错误': order.change_lock_rebot() order.reload() rebot = order.get_lock_rebot() rebot.modify(ip='') return {"flag": "error", "content": "账号自动登陆失败,请再次重试!"} if order.status in [STATUS_LOCK_RETRY, STATUS_WAITING_LOCK]: self.lock_ticket(order) order.reload() if order.status == STATUS_WAITING_ISSUE: app_rebot = ScqcpAppRebot.objects.get( telephone=order.source_account) res = self.send_order_request_by_web(order, app_rebot) if res: if res.get('drv_date', '') != order.drv_datetime.strftime( "%Y-%m-%d %H:%M:%S"): errmsg = '时间不一致,不允许支付!' self.close_line(order.line, reason=errmsg) order.modify(status=STATUS_LOCK_FAIL) order.on_lock_fail(reason=errmsg) issued_callback.delay(order.order_no) return {"flag": "error", "content": errmsg} else: msg = 'web未获取到支付信息' self.lock_ticket_retry(order, reason=msg) return {"flag": "error", "content": '请重试!'} r = rebot.http_get(order.pay_url, headers=new_headers, cookies=json.loads(rebot.cookies), timeout=30) if "车票已过期" in r.content or "无相关支付信息" in r.content: msg = '车票已过期或者无相关支付信息' self.lock_ticket_retry(order, reason=msg) return {"flag": "error", "content": '请重试!'} # r_url = urllib2.urlparse.urlparse(r.url) # if r_url.path in ["/error.html", "/error.htm"]: # self.lock_ticket_retry(order) # return {"flag": "error", "content": ''} sel = etree.HTML(r.content) plateform = pay_channel try: data = dict( payid=sel.xpath("//input[@name='payid']/@value")[0], bank= bank, #,'BOCB2C',#sel.xpath("//input[@id='s_bank']/@value")[0], plate=sel.xpath("//input[@id='s_plate']/@value")[0], plateform=plateform, qr_pay_mode=0, discountCode=sel.xpath( "//input[@id='discountCode']/@value")[0]) except: rebot.modify(ip="") rebot.modify(cookies="{}") return {"flag": "error", "content": "请重试!"} info_url = "http://scqcp.com:80/ticketOrder/middlePay.html" cookies = json.loads(rebot.cookies) r = rebot.http_post(info_url, data=data, headers=headers, cookies=cookies, timeout=60) cookies.update(dict(r.cookies)) # sel = etree.HTML(r.content) try: data = self.extract_alipay(r.content) pay_money = float(data["total_fee"]) pay_order_no = data["out_trade_no"] if order.pay_money != pay_money or order.pay_order_no != pay_order_no: order.modify(pay_money=pay_money, pay_order_no=pay_order_no, pay_channel='yh') jump_url = "https://mapi.alipay.com/gateway.do?_input_charset=utf-8" headers.update({ "Host": "mapi.alipay.com", "Referer": "http://scqcp.com/ticketOrder/middlePay.html", "Content-Type": "application/x-www-form-urlencoded" }) res = rebot.http_post(jump_url, data=urllib.urlencode(data), headers=headers, cookies=cookies) if u'fastpayLoginForm' not in res.content.decode('gbk'): rebot.modify(ip="") rebot.modify(cookies="{}") return {"flag": "error", "content": "请重试!"} except: rebot.modify(ip="") rebot.modify(cookies="{}") return {"flag": "error", "content": "请重试!"} return {"flag": "html", "content": r.content} return {"flag": "error", "content": "锁票失败, 请重试!"}