/// <summary>
        ///     跳转方式获得数据
        /// </summary>
        /// <param name="info"></param>
        /// <param name="orderInfo"></param>
        /// <param name="postUrl"></param>
        /// <returns></returns>
        public IDictionary <string, string> PayByCounter(MerchantInfo info, CheckoutCounter orderInfo,
                                                         out string postUrl)
        {
            postUrl = host + "/order/gwayOrderPay";
            var dict = new Dictionary <string, string>
            {
                { "orderCode", orderInfo.orderCode },
                { "totalAmount", orderInfo.totalAmount.ToString().PadLeft(12, '0') },
                { "subject", orderInfo.subject },
                { "body", orderInfo.body }
            };

            if (string.IsNullOrEmpty(orderInfo.txnTimeOut))
            {
                dict.Add("txnTimeOut", orderInfo.txnTimeOut);
            }
            dict.Add("payMode", orderInfo.payMode);
            if (string.IsNullOrEmpty(orderInfo.payExtra))
            {
                dict.Add("payExtra", orderInfo.payExtra);
            }
            dict.Add("clientIp", orderInfo.clientIp);
            dict.Add("notifyUrl", orderInfo.notifyUrl);
            dict.Add("frontUrl", orderInfo.frontUrl);
            if (string.IsNullOrEmpty(orderInfo.storeId))
            {
                dict.Add("storeId", orderInfo.storeId);
            }

            if (string.IsNullOrEmpty(orderInfo.terminalId))
            {
                dict.Add("terminalId", orderInfo.terminalId);
            }
            if (string.IsNullOrEmpty(orderInfo.operatorId))
            {
                dict.Add("operatorId", orderInfo.operatorId);
            }

            dict.Add("clearCycle", Convert.ToInt32(orderInfo.clearCycle).ToString());

            if (string.IsNullOrEmpty(orderInfo.riskRateInfo))
            {
                dict.Add("riskRateInfo", orderInfo.riskRateInfo);
            }


            if (string.IsNullOrEmpty(orderInfo.bizExtendParams))
            {
                dict.Add("bizExtendParams", orderInfo.bizExtendParams);
            }
            if (string.IsNullOrEmpty(orderInfo.merchExtendParams))
            {
                dict.Add("merchExtendParams", orderInfo.merchExtendParams);
            }
            if (string.IsNullOrEmpty(orderInfo.extend))
            {
                dict.Add("extend", orderInfo.extend);
            }
            return(dict);
        }
        public ResponsePayment PayByGateway(MerchantInfo info, RequestPayOrderBody body, bool isMobile = false)
        {
            if (info == null)
            {
                throw new ArgumentNullException(nameof(info));
            }

            if (body == null)
            {
                throw new ArgumentNullException(nameof(body));
            }

            body.Valid();

            var header = CreateHeader(info, "sandpay.trade.pay");

            header.ChannelType = isMobile ? "08" : "07";

            header.ProductId = PayMode.GetProduct(body);


            var payment = new RequestPayOrder();


            payment.Header = header;
            payment.Body   = body;

            var helper = new HttpRequestHelper(host);

            return(helper.Post <ResponsePayment, RequestPayOrder>("order/pay", info, payment));
        }
        private RequestHeader CreateHeader(MerchantInfo info, string method)
        {
            var header = new RequestHeader
            {
                Method     = method,
                Mid        = info.MerchantId,
                AccessType = info.AccessType
            };

            return(header);
        }
        public ResponseRefundPayment Refund(MerchantInfo info, RequestRefundBody body, bool isMobile = false)
        {
            var header = CreateHeader(info, "sandpay.trade.refund");

            header.ChannelType = isMobile ? "08" : "07";
            var payment = new RequestRefundPayment();


            payment.Header = header;
            payment.Body   = body;

            var helper = new HttpRequestHelper(host);

            return(helper.Post <ResponseRefundPayment, RequestRefundPayment>("order/refund", info, payment));
        }
        public ResponseQueryPayment Query(MerchantInfo info, RequestQueryBody body, bool isMobile = false)
        {
            var method = "sandpay.trade.query";
            var header = CreateHeader(info, method);

            header.ChannelType = isMobile ? "08" : "07";
            var payment = new RequestQueryPayment();


            payment.Header = header;
            payment.Body   = body;

            var helper = new HttpRequestHelper(host);

            return(helper.Post <ResponseQueryPayment, RequestQueryPayment>("order/query", info, payment));
        }
        public TReps Post <TReps, TRequest>(string url, MerchantInfo info, TRequest request)
        {
            url = url.StartsWith('/') ? url : "/" + url;
            var dataStr = JsonConvert.SerializeObject(request, serializerSettings);

            HttpClient client = new HttpClient();

            var data = new
            {
                sign = info.PrivateSignData(dataStr),
                data = dataStr
            };
            HttpContent content         = new StringContent(JsonConvert.SerializeObject(data, serializerSettings));
            var         responseContent = client.PostAsync(_url + url, content).Result.Content;
            var         json            = responseContent.ReadAsStringAsync().Result;

            json = WebUtility.UrlDecode(json);
            var dict     = System.Web.HttpUtility.ParseQueryString(json);
            var respData = dict["data"];

            return(JsonConvert.DeserializeObject <TReps>(respData));
        }