public async Task <(bool ok, string msg, Dictionary <string, string> form)> CreatePayForm(BackupOrderItem order)
        {
            var ctx = await Session.NetClient.RunRequestLoopAsync(
                _ => Session.NetClient.Create <OtnWebResponse <BaseOtnApiResponseWithFlagAndMsg> >(
                    HttpMethod.Post,
                    "afterNateOrder/continuePayNoCompleteMyOrder",
                    data: new { reserve_no = order.ReserveNo })
                );

            if (!ctx.IsValid() || ctx.Result.Data?.Flag != true)
            {
                return(false, ctx.Get12306ErrorMessage(Assets.SR.Error_DefaultServerError), null);
            }

            var ctxPay = await Session.NetClient.RunRequestLoopAsync(
                _ => Session.NetClient.Create(
                    HttpMethod.Post,
                    "afterNatePay/paycheck",
                    result: OtnWebResponse.Create(new { flag = false, payForm = new Dictionary <string, string>() }))
                );

            if (!ctxPay.IsValid() || ctxPay.Result.Data?.flag != true || ctxPay.Result.Data?.payForm == null)
            {
                return(false, ctx.Get12306ErrorMessage(Assets.SR.Error_DefaultServerError), null);
            }

            return(true, null, ctxPay.Result.Data.payForm);
        }
        /// <summary>
        /// 取消排队中订单
        /// </summary>
        /// <returns></returns>
        public async Task <(bool ok, string msg)> CancelWaitingOrderAsync()
        {
            var apiUrl = "afterNateOrder/cancelWaitingHOrder";

            var ctx = await Session.NetClient.RunRequestLoopAsync(
                _ => Session.NetClient.Create(
                    HttpMethod.Post,
                    apiUrl,
                    result: OtnWebResponse.Create(new { flag = false, msg = "" })
                    )
                );

            var result = ctx.Result;

            var error = ctx.Get12306ErrorMessage();

            if (error != null)
            {
                return(false, error);
            }

            if (!result.Data.flag)
            {
                return(false, result.Data.msg.DefaultForEmpty("哎哟……取消排队失败了……"));
            }

            return(true, null);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 获得错误信息
        /// </summary>
        /// <param name="defaultMsg"></param>
        /// <returns></returns>
        public static string GetErrorMessage(this OtnWebResponse response, string defaultMsg = "网络错误")
        {
            if (response == null)
            {
                return(defaultMsg);
            }

            return((response.Messages?.JoinAsString("")).DefaultForEmpty(defaultMsg));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 判断响应是否正常
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="response"></param>
        /// <returns></returns>
        public static bool IsValid <T>(this OtnWebResponse <T> response)
        {
            if (response?.Status != true)
            {
                return(false);
            }

            if (response.Data is BaseOtnApiResponseWithFlagAndMsg tmp1 && tmp1?.Flag != true)
            {
                return(false);
            }

            return(true);
        }
        public async Task <(bool ok, string msg)> CancelNotCompleteOrder(BackupOrderItem order, Func <double, bool> confirm)
        {
            var api  = order.StatusCode == 1 ? "afterNateOrder/cancelNotComplete" : "afterNateOrder/reserveReturnCheck";
            var data = order.StatusCode == 1 ? (object)new { reserve_no = order.ReserveNo } : new { sequence_no = order.ReserveNo };

            var ctx = await Session.NetClient.RunRequestLoopAsync(
                _ => Session.NetClient.Create(
                    HttpMethod.Post,
                    api,
                    data: data,
                    result: OtnWebResponse.Create(new { flag = false, msg = "", data = 0.0 }))
                );

            if (!ctx.IsValid() || ctx.Result.Data?.flag != true)
            {
                return(false, ctx.Get12306ErrorMessage(Assets.SR.Error_DefaultServerError));
            }

            if (order.StatusCode > 1)
            {
                //确认退费
                if (confirm?.Invoke(ctx.Result.Data.data) == false)
                {
                    return(false, "已终止取消订单");
                }

                var ctxRet = await Session.NetClient.RunRequestLoopAsync(
                    _ => Session.NetClient.Create(
                        HttpMethod.Post,
                        "afterNateOrder/reserveReturn",
                        data: data,
                        result: OtnWebResponse.Create(new { flag = false, msg = "" }))
                    );

                if (!ctxRet.IsValid() || ctxRet.Result.Data?.flag != true)
                {
                    return(false, ctxRet.Get12306ErrorMessage(Assets.SR.Error_DefaultServerError));
                }
            }

            return(true, null);
        }
        /// <summary>
        /// 获得已完成订单
        /// </summary>
        /// <returns></returns>
        public async Task <(bool ok, string msg, List <BackupOrderItem>)> GetProcessedHbOrderItemsAsync()
        {
            var apiUrl     = "afterNateOrder/queryProcessedHOrder";
            var pageNo     = 0;
            var pageTotal  = 1;
            var resultList = new List <BackupOrderItem>();


            while (pageNo < pageTotal)
            {
                var ctx = await Session.NetClient.RunRequestLoopAsync(
                    _ => Session.NetClient.Create(
                        HttpMethod.Post,
                        apiUrl,
                        data: new
                {
                    page_no          = pageNo,
                    query_start_date = DateTime.Now.ToString("yyyy-MM-dd"),
                    query_end_date   = DateTime.Now.Date.AddDays(22).ToString("yyyy-MM-dd")
                },
                        result: OtnWebResponse.Create(new { list = new List <BackupOrderItem>() })
                        )
                    );

                if (!ctx.IsValid() || !ctx.Result.IsValid() || ctx.Result.Data.list == null)
                {
                    return(false, ctx.Get12306ErrorMessage(), null);
                }

                resultList.AddRange(ctx.Result.Data.list);
                if (ctx.Result.Data?.list?.Count > 0)
                {
                    pageTotal = Math.Max(pageTotal, ctx.Result.Data.list[0].TotalPage);
                }

                pageNo++;
            }

            return(true, null, resultList);
        }
        public async Task <(bool success, string message)> SubmitOrderRequestAsync()
        {
            var data = new
            {
                secretList = Session.BackupOrderCart.ToSecretList()
            };
            var ctx = await Session.NetClient.RunRequestLoopAsync(_ => Session.NetClient.Create <OtnWebResponse <SubmitBackupOrderResponse> >(HttpMethod.Post, "afterNate/submitOrderRequest", data: data));

            var result = ctx.Result;

            var error = ctx.Get12306ErrorMessage();

            if (error != null)
            {
                return(false, error);
            }

            if (!result.Data.Flag)
            {
                if (result.Data.FaceCheck.HasValue)
                {
                    return(false, GetFaceCheckMsg(result.Data.FaceCheck.Value));
                }

                return(false, result.GetErrorMessages(JsonConvert.SerializeObject(result.Data)));
            }

            //测试 1:初始化
            var ctxInit = await Session.NetClient.RunRequestLoopAsync(_ => Session.NetClient.Create(HttpMethod.Post, "afterNate/passengerInitApi", result: OtnWebResponse.Create(new
            {
                checkcode = 0,
                if_check_slide_passcode       = 0,
                if_check_slide_passcode_token = "",
                isLimitTran  = "Y",
                jzdhDateE    = "",
                jzdhDateS    = "",
                jzdhHourE    = "",
                jzdhHourS    = "",
                limitTranStr = new List <string>(),
                result_code  = 0
            })));

            if (!ctxInit.IsValid() || !ctxInit.Result.Status)
            {
                return(false, ctxInit.Get12306ErrorMessage());
            }
            if (ctxInit.Result.Data.result_code != 0)
            {
                return(false, $"无效响应:{ctxInit.ResponseContent.RawStringResult}");
            }
            //时间
            var initData = ctxInit.Result.Data;
            var cart     = Session.BackupOrderCart;

            if (!initData.jzdhDateS.IsNullOrEmpty() && !initData.jzdhHourS.IsNullOrEmpty())
            {
                cart.HbStartTime = DateTime.Parse(initData.jzdhDateS).Add(TimeSpan.Parse(initData.jzdhHourS));
            }
            else
            {
                cart.HbStartTime = DateTime.Now;
            }

            if (!initData.jzdhDateE.IsNullOrEmpty() && !initData.jzdhHourE.IsNullOrEmpty())
            {
                cart.HbEndTime = DateTime.Parse(initData.jzdhDateE).Add(TimeSpan.Parse(initData.jzdhHourE));
            }
            else
            {
                cart.HbEndTime = cart.Items.Select(s => s.Train.Date).Min().AddDays(-1).AddHours(19).AddMinutes(30);
            }

            //滑动验证
            cart.SlideToken      = initData.if_check_slide_passcode_token;
            cart.NeedSlideVc     = initData.if_check_slide_passcode == 1;
            cart.SlideCSessionId = null;
            cart.SlideSig        = null;

            return(true, null);
        }
        public async Task <(int level, string info)> GetSuccessRateAsync(string submitInfo, char seat)
        {
            var data = new
            {
                successSecret = $"{submitInfo}#{seat}"
            };
            var ctx = await Session.NetClient.RunRequestLoopAsync(_ =>
                                                                  Session.NetClient.Create(HttpMethod.Post, "afterNate/getSuccessRate", data: data, result: OtnWebResponse.Create(new { flag = FSLib.Extension.CollectionUtility.CreateAnymousTypeList(new { level = 0, info = "" }) }))
                                                                  );

            var result = ctx.Result;

            var error = ctx.Get12306ErrorMessage();

            if (error != null || !(result.Data?.flag?.Count > 0))
            {
                return(0, "查询候补人数出错");
            }

            return(result.Data.flag[0].level, result.Data.flag[0].info);
        }