/// <summary> /// 正式提交订单 /// </summary> protected override bool SubmitOrderInternal() { if (!base.SubmitOrderInternal()) { return(false); } if (!_orderInfoChecked && !CheckOrderInfo()) { return(false); } if (NeedVc == true && RandCode.IsNullOrEmpty()) { SetSubmitOrderError("[NEEDVC] 请输入验证码"); return(false); } if (NeedVcTime > 0) { var safeTime = NeedVcTime - (int)(DateTime.Now - VcBaseTime.Value).TotalMilliseconds; StateMessage = $"Delayed for {safeTime}ms"; Trace.TraceInformation($"SUMITORDER: DELAY {safeTime}ms"); if (safeTime > 0) { Thread.Sleep(safeTime); } } if (!RandCode.IsNullOrEmpty()) { StateMessage = "正在校验验证码..."; //var result = Session.NetClient.RunRequestLoop( // () => Session.NetClient.Create(HttpMethod.Post, // "passcodeNew/checkRandCodeAnsyn", // currentPage, // new {randCode = RandCode, rand = "randp", _json_att = Session.Attributes ?? "", REPEAT_SUBMIT_TOKEN = Token}, // new {data = new {result = 0}}, isXhr: true // ), // _ => StateMessage = $"[{_}] 正在校验验证码..."); //Session.LastCheckRandCodeTime = DateTime.Now; //if (!result.IsValid()) //{ // SetSubmitOrderError("校验验证码时网络错误,请重试"); // return; //} //if (result.Result.data.result != 1) //{ // SetSubmitOrderError("验证码错误,请重试。"); // return; //} var result = Session.NetClient.VerifyRandCode(Query.Resign ? RandCodeType.RandpResign : RandCodeType.Randp, RandCode, null, _ => StateMessage = $"[{_}] 正在检查验证码……"); if (!result.IsNullOrEmpty()) { SetSubmitOrderError(result.DefaultForEmpty("验证码错误")); return(false); } } //检测队列信息。仅异步模式下需要。 if (Async) { var queueSeat = Passengers[0].SeatType; StateMessage = "正在检测排队信息...."; var checkQueueData = new NameValueCollection { { "train_date", Date.Date.ToString("R") }, //checkQueueData.Add("train_date", "Mon Apr 28 2014 00:00:00 GMT+0800 (中国标准时间)"); { "train_no", Train.Id }, { "stationTrainCode", Train.Code }, { "seatType", queueSeat.ToString() }, { "fromStationTelecode", Train.FromStation.Code }, { "toStationTelecode", Train.ToStation.Code }, { "leftTicket", LeftTicketStr }, { "purpose_codes", _purposeCode } }; if (_isCheckOrderInfo != null) { checkQueueData.Add("isCheckOrderInfo", _isCheckOrderInfo); } checkQueueData.Add("_json_att", Session.Attributes ?? ""); checkQueueData.Add("train_location", TrainLocation); checkQueueData.Add("REPEAT_SUBMIT_TOKEN", Token); var checkQueueResult = Session.NetClient.RunRequestLoop( _ => Session.NetClient.Create <GetQueueCountResponse>(HttpMethod.Post, "confirmPassenger/getQueueCount", _currentPage, checkQueueData), _ => StateMessage = $"[{_}] 正在检测排队信息...." ); if (!checkQueueResult.IsValid()) { SetSubmitOrderError("网络错误:" + checkQueueResult?.GetErrorMsg()); return(false); } if (!checkQueueResult.Result.Status || checkQueueResult.Result.Data == null) { SetSubmitOrderError(checkQueueResult.Result.Messages.JoinAsString("").DefaultForEmpty("系统忙,请重试")); return(false); } if (checkQueueResult.Result.Data.isRelogin == "Y") { SetSubmitOrderError("登录状态异常,请重新登录。"); return(false); } SetTicketCount(queueSeat, checkQueueResult.Result.Data.ticket); if (!CheckTicketCount()) { return(false); } WaitCount = checkQueueResult.Result.Data.countT.ToInt32(); if (checkQueueResult.Result.Data.op_2 == "true") { if (OrderConfiguration.Instance.IgnoreQueueError) { QueueWarning = true; } else { SetSubmitOrderError("排队人数过多,不允许提交订单。排队人数=" + (WaitCount > 0 ? WaitCount.ToString() : "<已无票>")); return(false); } } } //开始提交订单 StateMessage = "正在提交订单..."; //座位 var(seats, beds) = BuildSeatInfo(); var orderData = new NameValueCollection { { "passengerTicketStr", PassengerString[0] }, { "oldPassengerStr", PassengerString[1] }, { "purpose_codes", _purposeCode }, { "key_check_isChange", KeyCheckIsChange }, { "leftTicketStr", LeftTicketStr }, { "train_location", TrainLocation }, { "choose_seats", seats }, { "seatDetailType", beds }, { "whatsSelect", "1" }, //受让人为0 { "roomType", "00" }, //动卧需要 { "dwAll", BuyAllSeat ? "Y" : "N" }, { "_json_att", Session.Attributes ?? "" }, { "REPEAT_SUBMIT_TOKEN", Token } }; if (!RandCode.IsNullOrEmpty()) { orderData.Add("randCode", RandCode); } //Thread.Sleep(Configuration.SubmitOrder.Current.OrderSubmitDelay); #if DEBUG if (TestFlag.BlockOrderSubmit) { SetSubmitOrderError("[测试]余票不足!"); } if (TestFlag.BlockOrderSubmit || TestFlag.FakeOrderSubmit) { return(false); } #endif //confirmPassenger/confirmSingle //confirmPassenger/confirmGo //confirmPassenger/confirmBack //confirmPassenger/confirmResign //延迟 var submiturl = Async ? (Query.Resign ? "confirmPassenger/confirmResignForQueue" : "confirmPassenger/confirmSingleForQueue") : (Query.Resign ? "confirmPassenger/confirmResign" : "confirmPassenger/confirmSingle"); var orderResponse = Session.NetClient.RunRequestLoop( _ => Session.NetClient.Create( FSLib.Network.Http.HttpMethod.Post, submiturl, _currentPage, orderData, new { status = false, data = new { submitStatus = true, errMsg = "" }, messages = new string[0] }), _ => StateMessage = $"[{_}] 正在提交订单..." ); if (orderResponse == null || !orderResponse.IsSuccess) { SetSubmitOrderError("网络错误:[SUBMITORDER] " + orderResponse?.GetErrorMsg()); return(false); } var orderresult = orderResponse.Result; if (orderresult.status) { if (!orderresult.data.submitStatus) { SetSubmitOrderError("提交订单错误:" + orderresult.data.errMsg); } else if (!Async) { LoadOrderIdFromNotComplete(); } } else { SetSubmitOrderError(orderresult.messages.JoinAsString("").DefaultForEmpty("系统忙")); } return(true); }
protected override void PrepareInternal() { base.PrepareInternal(); var(ok, msg) = PreparePassenger(); if (!ok) { SetPrepareOrderError(msg); return; } //如果在进入查票页后没有加载联系人,则自动加载一次联系人。 //创建信息 var json_att = !string.IsNullOrEmpty(Session.Attributes) ? "&_json_att=" + System.Web.HttpUtility.UrlEncode(Session.Attributes) : ""; var purposeCode = IsStudent ? "0X00" : "ADULT"; //检测 StateMessage = "检测订单信息...."; var exdata = ""; if (Session.DynamicJsData != null) { exdata = HttpUtility.UrlEncode(Session.DynamicJsData.Key) + "=" + HttpUtility.UrlEncode(Session.DynamicJsData.EncodedValue) + "&"; } //引发强退 var data = exdata; data += "secretStr" + "=" + Train.SubmitOrderInfo + "&" + "train_date" + "=" + Date.ToString("yyyy-MM-dd") + "&" + "tour_flag" + "=" + "dc" + "&" + "purpose_codes" + "=" + purposeCode + "&" + "query_from_station_name" + "=" + Query.FromStationName + "&" + "query_to_station_name" + "=" + Query.ToStationName + "&" + json_att + "&" + "cancel_flag" + "=2&" + "bed_level_order_num" + "=000000000000000000000000000000&" + "passengerTicketStr" + "=" + PassengerString[0] + "&" + "oldPassengerStr" + "=" + PassengerString[1]; var autosubmitresponse = Session.NetClient.RunRequestLoop(_ => Session.NetClient.Create <AutoSubmitOrderResponse>(HttpMethod.Post, "confirmPassenger/autoSubmitOrderRequest", "leftTicket/init", data, isXhr: true), _ => StateMessage = $"[{_}] 检测订单信息...." ); if (!autosubmitresponse.IsValid()) { SetPrepareOrderError("网络错误:" + autosubmitresponse.GetErrorMsg()); return; } //for test if (!autosubmitresponse.Result.Status) { SetPrepareOrderError(autosubmitresponse.Result.Messages.JoinAsString("").DefaultForEmpty("系统忙。可能是这次登录已经被限制,请等待几分钟再操作,或点击『注销登录』后重新登录。无法解决时请暂时改用浏览器订票。")); return; } var submitOrderResult = autosubmitresponse.Result.Data; if (submitOrderResult == null) { SetPrepareOrderError(autosubmitresponse.Result.Messages.JoinAsString("").DefaultForEmpty("系统返回正常,但是结果不对。可能是这次登录已经被限制,请等待几分钟再操作,或点击『注销登录』后重新登录。无法解决时请暂时改用浏览器订票。")); return; } if (submitOrderResult.isRelogin == "Y") { SetPrepareOrderError("登录状态异常,请重新登录。"); return; } if (submitOrderResult.isNoActive || !submitOrderResult.submitStatus || !submitOrderResult.CheckSeatNum.IsNullOrEmpty()) { SetPrepareOrderError("提交订单失败:" + autosubmitresponse.Result.Data.errMsg); return; } object isCheckOrderInfo; var infoarr = submitOrderResult.result.Split('#'); TrainLocation = infoarr[0]; KeyCheckIsChange = infoarr[1]; LeftTicketStr = infoarr[2]; Async = infoarr[3] == "1"; isCheckOrderInfo = submitOrderResult.isCheckOrderInfo; //是否需要验证码? NeedVc = submitOrderResult.IfShowPassCode == "Y"; NeedVcTime = submitOrderResult.IfShowPassCodeTime; VcBaseTime = DateTime.Now; //判断席别选择是否可用 CanChooseBed = submitOrderResult.canChooseBeds == "Y"; CanChooseSeat = submitOrderResult.canChooseSeats == "Y"; CanChooseBedMiddle = submitOrderResult.isCanChooseMid == "Y"; ChooseSeatTypes = submitOrderResult.choose_Seats; //检测排队 if (Async) { StateMessage = "正在检测排队信息...."; var seatType = Passengers[0].SeatType; var checkQueueData = new NameValueCollection(); checkQueueData.Add("train_date", Date.ToUniversalTime().ToString("R")); checkQueueData.Add("train_no", Train.Id); checkQueueData.Add("stationTrainCode", Train.Code); checkQueueData.Add("seatType", seatType.ToString()); checkQueueData.Add("fromStationTelecode", Train.FromStation.Code); checkQueueData.Add("toStationTelecode", Train.ToStation.Code); checkQueueData.Add("leftTicket", LeftTicketStr); checkQueueData.Add("purpose_codes", purposeCode); if (isCheckOrderInfo != null) { checkQueueData.Add("isCheckOrderInfo", isCheckOrderInfo.ToString()); } checkQueueData.Add("_json_att", Session.Attributes ?? ""); var checkQueueResult = Session.NetClient.RunRequestLoop(_ => Session.NetClient.Create <GetQueueCountResponse>(HttpMethod.Post, "confirmPassenger/getQueueCountAsync", "leftTicket/init", checkQueueData, isXhr: true), _ => StateMessage = $"[{_}] 正在检测排队信息...." ); checkQueueResult.Request.Accept = "application/json, text/javascript, */*; q=0.01"; checkQueueResult.Send(); if (!checkQueueResult.IsValid()) { SetPrepareOrderError("网络错误:[ASW-CQ] " + checkQueueResult.GetErrorMsg()); return; } if (!checkQueueResult.Result.Status) { SetPrepareOrderError(checkQueueResult.Result.Messages.JoinAsString("").DefaultForEmpty("系统忙。可能是这次登录已经被限制,请等待几分钟再操作,或点击『注销登录』后重新登录。无法解决时请暂时改用浏览器订票。")); return; } if (checkQueueResult.Result.Data == null) { SetPrepareOrderError(checkQueueResult.Result.Messages.JoinAsString("").DefaultForEmpty("系统返回正常,但是结果不对。可能是这次登录已经被限制,请等待几分钟再操作,或点击『注销登录』后重新登录。无法解决时请暂时改用浏览器订票。")); return; } if (checkQueueResult.Result.Data.isRelogin == "Y") { SetPrepareOrderError("登录状态异常,请重新登录。"); return; } WaitCount = checkQueueResult.Result.Data.countT.ToInt32(); SetTicketCount(seatType, checkQueueResult.Result.Data.ticket); if (!CheckTicketCount()) { return; } if (checkQueueResult.Result.Data.op_2 == "true") { if (OrderConfiguration.Instance.IgnoreQueueError) { QueueWarning = true; } else { SetPrepareOrderError("排队人数过多,不允许提交订单。排队人数=" + (WaitCount > 0 ? WaitCount.ToString() : "<已无票>")); } } } }