Exemple #1
0
        public ActionResult SpgatewayCustomer()
        {
            Request.LogFormData("SpgatewayCustomer(資料回傳)");

            // Status 回傳狀態
            // MerchantID 回傳訊息
            // TradeInfo 交易資料AES 加密
            // TradeSha 交易資料SHA256 加密
            // Version 串接程式版本
            NameValueCollection collection = Request.Form;

            if (collection["MerchantID"] != null && string.Equals(collection["MerchantID"], _bankInfoModel.MerchantID))
            {
                var decryptTradeInfo = CryptoUtil.DecryptAESHex(collection["TradeInfo"], _bankInfoModel.HashKey, _bankInfoModel.HashIV);

                // 取得回傳參數(ex:key1=value1&key2=value2),儲存為NameValueCollection
                NameValueCollection          decryptTradeCollection = HttpUtility.ParseQueryString(decryptTradeInfo);
                SpgatewayTakeNumberDataModel convertModel           = LambdaUtil.DictionaryToObject <SpgatewayTakeNumberDataModel>(decryptTradeCollection.AllKeys.ToDictionary(k => k, k => decryptTradeCollection[k]));

                LogUtil.WriteLog(JsonConvert.SerializeObject(convertModel));

                // TODO 將回傳訊息寫入資料庫

                return(Content(JsonConvert.SerializeObject(convertModel)));
            }
            else
            {
                LogUtil.WriteLog("MerchantID錯誤");
            }

            return(Content(string.Empty));
        }
        /// <summary>
        /// 静态构造器
        /// </summary>
        static HttpContentExtensions()
        {
            var property = typeof(HttpContent).GetProperty("IsBuffered", BindingFlags.Instance | BindingFlags.NonPublic);

            if (property != null)
            {
                isBuffered = LambdaUtil.CreateGetFunc <HttpContent, bool>(property);
            }
        }
Exemple #3
0
        public void SetTest()
        {
            var model = new Model {
                name = "laojiu"
            };
            var setter = LambdaUtil.CreateSetAction <object, object>(model.GetType().GetProperty("name"));

            setter.Invoke(model, "ee");
            Assert.True("ee" == model.name);
        }
        public IHttpActionResult SpgatewayNotify()
        {
            // 取法同SpgatewayResult
            var httpRequestBase = new HttpRequestWrapper(HttpContext.Current.Request);

            RazorExtensions.LogFormData(httpRequestBase, "SpgatewayNotify(支付完成)");
            // Status 回傳狀態
            // MerchantID 回傳訊息
            // TradeInfo 交易資料AES 加密
            // TradeSha 交易資料SHA256 加密
            // Version 串接程式版本
            NameValueCollection collection = HttpContext.Current.Request.Form;

            if (collection["MerchantID"] != null && string.Equals(collection["MerchantID"], _bankInfoModel.MerchantID) &&
                collection["TradeInfo"] != null && string.Equals(collection["TradeSha"], CryptoUtil.EncryptSHA256($"HashKey={_bankInfoModel.HashKey}&{collection["TradeInfo"]}&HashIV={_bankInfoModel.HashIV}")))
            {
                var decryptTradeInfo = CryptoUtil.DecryptAESHex(collection["TradeInfo"], _bankInfoModel.HashKey, _bankInfoModel.HashIV);

                // 取得回傳參數(ex:key1=value1&key2=value2),儲存為NameValueCollection
                NameValueCollection      decryptTradeCollection = HttpUtility.ParseQueryString(decryptTradeInfo);
                SpgatewayOutputDataModel convertModel           = LambdaUtil.DictionaryToObject <SpgatewayOutputDataModel>(decryptTradeCollection.AllKeys.ToDictionary(k => k, k => decryptTradeCollection[k]));

                //LogUtil.WriteLog(JsonConvert.SerializeObject(convertModel));

                // TODO 將回傳訊息寫入資料庫

                VipOrder pay = db.VipOrders.Find(Convert.ToInt32(convertModel.MerchantOrderNo));
                pay.Message = convertModel.Message;
                pay.Status  = convertModel.Status;
                db.VipOrders.Add(pay);
                // return Content(JsonConvert.SerializeObject(convertModel));

                if (pay.Status == "SUCCESS")
                {
                    //MerchantOrderNo = "O202009100034"
                    //convertModel.MerchantOrderNo
                    VipOrder vip = db.VipOrders.Find(pay.BrandId);
                    vip.Status = "已付款成功";

                    db.Entry(vip).State = EntityState.Modified;
                    db.SaveChanges();
                }
                else//付款失敗
                {
                }
                return(Ok());
            }
            else
            {
                //LogUtil.WriteLog("MerchantID/TradeSha驗證錯誤");
            }

            return(Ok());
        }
Exemple #5
0
        public void CtorTest()
        {
            var value = "name";
            var name  = LambdaUtil.CreateCtorFunc <string, Model>(typeof(Model))(value).name;

            Assert.True(name == value);

            var func  = LambdaUtil.CreateCtorFunc <string, object>(typeof(Model));
            var model = func.Invoke(value) as Model;

            Assert.True(model.name == value);
        }
        /// <summary>
        /// 创建实例工厂
        /// </summary>
        /// <exception cref="ProxyTypeCreateException"></exception>
        /// <returns></returns>
        protected override Func <IHttpApiInterceptor, ApiActionInvoker[], THttpApi> CreateFactory()
        {
            var proxyType = FindProxyType(typeof(THttpApi));

            if (proxyType != null)
            {
                return(LambdaUtil.CreateCtorFunc <IHttpApiInterceptor, ApiActionInvoker[], THttpApi>(proxyType));
            }

            var message = $"找不到{typeof(THttpApi)}的代理类:{GetErrorReason()}";

            throw new ProxyTypeCreateException(typeof(THttpApi), message);
        }
        /// <summary>
        /// 属性描述
        /// </summary>
        /// <param name="property">属性信息</param>
        public PropertyDescriptor(PropertyInfo property)
        {
            this.Name = property.Name;
            this.Info = property;

            if (property.CanRead == true)
            {
                this.geter = LambdaUtil.CreateGetFunc <TDeclaring, TProperty>(property);
            }

            if (property.CanWrite == true)
            {
                this.seter = LambdaUtil.CreateSetAction <TDeclaring, TProperty>(property);
            }
        }
Exemple #8
0
        public HttpResponseMessage SpgatewayNotify()
        {
            // Status 回傳狀態
            // MerchantID 回傳訊息
            // TradeInfo 交易資料AES 加密
            // TradeSha 交易資料SHA256 加密
            // Version 串接程式版本
            var collection = HttpContext.Current.Request;

            if (collection["MerchantID"] != null && string.Equals(collection["MerchantID"], _bankInfoModel.MerchantID) &&
                collection["TradeInfo"] != null && string.Equals(collection["TradeSha"], CryptoUtil.EncryptSHA256($"HashKey={_bankInfoModel.HashKey}&{collection["TradeInfo"]}&HashIV={_bankInfoModel.HashIV}")))
            {
                var decryptTradeInfo = CryptoUtil.DecryptAESHex(collection["TradeInfo"], _bankInfoModel.HashKey, _bankInfoModel.HashIV);

                // 取得回傳參數(ex:key1=value1&key2=value2),儲存為NameValueCollection
                NameValueCollection      decryptTradeCollection = HttpUtility.ParseQueryString(decryptTradeInfo);
                SpgatewayOutputDataModel convertModel           =
                    LambdaUtil.DictionaryToObject <SpgatewayOutputDataModel>(
                        decryptTradeCollection.AllKeys.ToDictionary(k => k, k => decryptTradeCollection[k]));

                Pay pay = db.Pays.Find(Convert.ToInt32(convertModel.MerchantOrderNo));
                pay.Message = convertModel.Message;
                pay.Status  = convertModel.Status;
                db.Pays.Add(pay);

                if (pay.Status == "SUCCESS")
                {
                    Orders orders = db.Orders.Find(pay.OrderId);
                    orders.Status          = OrderType.已付款;
                    db.Entry(orders).State = EntityState.Modified;

                    db.SaveChanges();
                }
                // TODO 將回傳訊息寫入資料庫
            }

            return(Request.CreateResponse(HttpStatusCode.OK));
        }
Exemple #9
0
        public void GetTest()
        {
            var model = new Model {
                name = "laojiu"
            };
            var p = model.GetType().GetProperty("name");

            var getter = LambdaUtil.CreateGetFunc <Model, string>(p);
            var name   = getter.Invoke(model);

            Assert.True(name == model.name);


            var getter2 = LambdaUtil.CreateGetFunc <object, string>(p);
            var name2   = getter2.Invoke(model);

            Assert.True(name2 == model.name);

            var getter3 = LambdaUtil.CreateGetFunc <object, object>(p.DeclaringType, p.Name);
            var name3   = getter2.Invoke(model).ToString();

            Assert.True(name3 == model.name);

            var kv      = new KeyValuePair <string, int>("k", 10);
            var getter4 = LambdaUtil.CreateGetFunc <object, object>(kv.GetType(), "Value");
            var value   = (int)getter4.Invoke(kv);

            Assert.True(value == kv.Value);

            var getter5 = LambdaUtil.CreateGetFunc <object, int>(kv.GetType(), "Value");

            Assert.True(getter5.Invoke(kv) == kv.Value);

            var getter6 = LambdaUtil.CreateGetFunc <object, long>(kv.GetType(), "Value");

            Assert.True(getter6.Invoke(kv) == kv.Value);
        }
        /// <summary>
        /// 创建实例工厂
        /// </summary>
        /// <exception cref="NotSupportedException"></exception>
        /// <exception cref="ProxyTypeCreateException"></exception>
        /// <returns></returns>
        protected override Func <IHttpApiInterceptor, ApiActionInvoker[], THttpApi> CreateFactory()
        {
            var proxyType = BuildProxyType(typeof(THttpApi), this.ApiMethods);

            return(LambdaUtil.CreateCtorFunc <IHttpApiInterceptor, ApiActionInvoker[], THttpApi>(proxyType));
        }
Exemple #11
0
        public HttpResponseMessage SpgatewayPayBill(PayView payView)
        {
            Pay pay_ = new Pay();

            ModelState.Remove("Status");
            ModelState.Remove("Message");

            if (!ModelState.IsValid)
            {
                return(Request.CreateResponse(HttpStatusCode.OK, ModelState));
            }
            pay_.OrderId = payView.OrderId;
            db.Pays.Add(pay_);
            db.SaveChanges();

            Orders orders  = db.Orders.Where(x => x.Id == payView.OrderId).FirstOrDefault();
            string version = "1.5";
            string payType = "CREDIT";
            // 目前時間轉換 +08:00, 防止傳入時間或Server時間時區不同造成錯誤
            DateTimeOffset taipeiStandardTimeOffset = DateTimeOffset.Now.ToOffset(new TimeSpan(8, 0, 0));

            TradeInfo tradeInfo = new TradeInfo()
            {
                // * 商店代號
                MerchantID = _bankInfoModel.MerchantID,
                // * 回傳格式
                RespondType = "String",
                // * TimeStamp
                TimeStamp = taipeiStandardTimeOffset.ToUnixTimeSeconds().ToString(),
                // * 串接程式版本
                Version = version,
                // * 商店訂單編號
                MerchantOrderNo = pay_.Id.ToString(),
                // MerchantOrderNo = ordernumber,
                // * 訂單金額
                Amt = (int)orders.Total,
                // * 商品資訊
                ItemDesc = pay_.OrderId.ToString(),
                // 繳費有效期限(適用於非即時交易)
                ExpireDate = null,
                // 支付完成 返回商店網址
                ReturnURL = _bankInfoModel.ReturnURL,
                // 支付通知網址
                NotifyURL = _bankInfoModel.NotifyURL,
                // 商店取號網址
                CustomerURL = _bankInfoModel.CustomerURL,
                // 支付取消 返回商店網址
                ClientBackURL = null,
                // * 付款人電子信箱
                Email = string.Empty,
                // 付款人電子信箱 是否開放修改(1=可修改 0=不可修改)
                EmailModify = 0,
                // 商店備註
                OrderComment = "商店備註",
                // 信用卡 一次付清啟用(1=啟用、0或者未有此參數=不啟用)
                CREDIT = 1,
                // WEBATM啟用(1=啟用、0或者未有此參數,即代表不開啟)
                //WEBATM = null,
                // ATM 轉帳啟用(1=啟用、0或者未有此參數,即代表不開啟)
                //VACC = null,
                // 超商代碼繳費啟用(1=啟用、0或者未有此參數,即代表不開啟)(當該筆訂單金額小於 30 元或超過 2 萬元時,即使此參數設定為啟用,MPG 付款頁面仍不會顯示此支付方式選項。)
                //CVS = 1,
                // 超商條碼繳費啟用(1=啟用、0或者未有此參數,即代表不開啟)(當該筆訂單金額小於 20 元或超過 4 萬元時,即使此參數設定為啟用,MPG 付款頁面仍不會顯示此支付方式選項。)
                //BARCODE = 1
            };

            if (string.Equals(payType, "CREDIT"))
            {
                tradeInfo.CREDIT = 1;
            }
            else if (string.Equals(payType, "WEBATM"))
            {
                tradeInfo.WEBATM = 1;
            }
            else if (string.Equals(payType, "VACC"))
            {
                // 設定繳費截止日期
                tradeInfo.ExpireDate = taipeiStandardTimeOffset.AddDays(1).ToString("yyyyMMdd");
                tradeInfo.VACC       = 1;
            }
            else if (string.Equals(payType, "CVS"))
            {
                // 設定繳費截止日期
                tradeInfo.ExpireDate = taipeiStandardTimeOffset.AddDays(1).ToString("yyyyMMdd");
                tradeInfo.CVS        = 1;
            }
            else if (string.Equals(payType, "BARCODE"))
            {
                // 設定繳費截止日期
                tradeInfo.ExpireDate = taipeiStandardTimeOffset.AddDays(1).ToString("yyyyMMdd");
                tradeInfo.BARCODE    = 1;
            }

            Atom <string> result = new Atom <string>()
            {
                IsSuccess = true
            };

            var inputModel = new SpgatewayInputModel
            {
                MerchantID = _bankInfoModel.MerchantID,
                Version    = version
            };

            // 將model 轉換為List<KeyValuePair<string, string>>, null值不轉
            List <KeyValuePair <string, string> > tradeData = LambdaUtil.ModelToKeyValuePairList <TradeInfo>(tradeInfo);
            // 將List<KeyValuePair<string, string>> 轉換為 key1=Value1&key2=Value2&key3=Value3...
            var tradeQueryPara = string.Join("&", tradeData.Select(x => $"{x.Key}={x.Value}"));

            // AES 加密
            inputModel.TradeInfo =
                CryptoUtil.EncryptAESHex(tradeQueryPara, _bankInfoModel.HashKey, _bankInfoModel.HashIV);
            // SHA256 加密
            inputModel.TradeSha =
                CryptoUtil.EncryptSHA256(
                    $"HashKey={_bankInfoModel.HashKey}&{inputModel.TradeInfo}&HashIV={_bankInfoModel.HashIV}");

            // 將model 轉換為List<KeyValuePair<string, string>>, null值不轉
            List <KeyValuePair <string, string> > postData =
                LambdaUtil.ModelToKeyValuePairList <SpgatewayInputModel>(inputModel);


            //StringBuilder s = new StringBuilder();
            //s.Append("<html>");
            //s.AppendFormat("<body onload='document.forms[\"form\"].submit()'>");
            //s.AppendFormat("<form name='form' action='{0}' method='post'>", _bankInfoModel.AuthUrl);
            //foreach (KeyValuePair<string, string> item in postData)
            //{
            //    s.AppendFormat("<input type='hidden' name='{0}' value='{1}' />", item.Key, item.Value);
            //}

            //s.Append("</form></body></html>");


            return(Request.CreateResponse(HttpStatusCode.OK, postData));
        }
        public IHttpActionResult SpgatewayPayBill(VipOrder vipOrder)
        {
            //var PayVip = db.VipOrders.Find(vipOrder.BrandId);
            //if (PayVip == null)
            //{
            //    return NotFound();
            //}

            string      token       = Request.Headers.Authorization.Parameter;
            JwtAuthUtil jwtAuthUtil = new JwtAuthUtil();
            int         id          = Convert.ToInt32(jwtAuthUtil.GetId(token));

            // var payBrand = db.Brands.Where(b => b.Id == id);
            vipOrder.BrandId = id;
            db.VipOrders.Add(new VipOrder
            {
                BrandId = id,
            });

            db.SaveChanges();

            string version = "1.5";

            // 目前時間轉換 +08:00, 防止傳入時間或Server時間時區不同造成錯誤
            DateTimeOffset taipeiStandardTimeOffset = DateTimeOffset.Now.ToOffset(new TimeSpan(8, 0, 0));

            TradeInfo tradeInfo = new TradeInfo()
            {
                // * 商店代號
                MerchantID = _bankInfoModel.MerchantID,
                // * 回傳格式
                RespondType = "String",
                // * TimeStamp
                TimeStamp = taipeiStandardTimeOffset.ToUnixTimeSeconds().ToString(),
                // * 串接程式版本
                Version = version,
                // * 商店訂單編號
                //MerchantOrderNo = $"T{DateTime.Now.ToString("yyyyMMddHHmm")}",
                MerchantOrderNo = vipOrder.BrandId.ToString(),
                // * 訂單金額
                Amt = 1200,
                // * 商品資訊
                ItemDesc = "數據分析功能" + vipOrder.BrandId.ToString(),
                // 繳費有效期限(適用於非即時交易)
                ExpireDate = null,
                // 支付完成 返回商店網址
                ReturnURL = _bankInfoModel.ReturnURL,
                // 支付通知網址
                NotifyURL = _bankInfoModel.NotifyURL,
                // 商店取號網址
                CustomerURL = _bankInfoModel.CustomerURL,
                // 支付取消 返回商店網址
                ClientBackURL = null,
                // * 付款人電子信箱
                Email = string.Empty,
                // 付款人電子信箱 是否開放修改(1=可修改 0=不可修改)
                EmailModify = 0,
                // 商店備註
                OrderComment = null,
                // 信用卡 一次付清啟用(1=啟用、0或者未有此參數=不啟用)
                CREDIT = null,
                // WEBATM啟用(1=啟用、0或者未有此參數,即代表不開啟)
                WEBATM = null,
                // ATM 轉帳啟用(1=啟用、0或者未有此參數,即代表不開啟)
                VACC = null,
                // 超商代碼繳費啟用(1=啟用、0或者未有此參數,即代表不開啟)(當該筆訂單金額小於 30 元或超過 2 萬元時,即使此參數設定為啟用,MPG 付款頁面仍不會顯示此支付方式選項。)
                CVS = null,
                // 超商條碼繳費啟用(1=啟用、0或者未有此參數,即代表不開啟)(當該筆訂單金額小於 20 元或超過 4 萬元時,即使此參數設定為啟用,MPG 付款頁面仍不會顯示此支付方式選項。)
                BARCODE = null
            };

            //暫定都信用卡
            tradeInfo.CREDIT = 1;
            //if (string.Equals(payType, "CREDIT"))
            //{
            //    tradeInfo.CREDIT = 1;
            //}
            //else if (string.Equals(payType, "WEBATM"))
            //{
            //    tradeInfo.WEBATM = 1;
            //}
            //else if (string.Equals(payType, "VACC"))
            //{
            //    // 設定繳費截止日期
            //    tradeInfo.ExpireDate = taipeiStandardTimeOffset.AddDays(1).ToString("yyyyMMdd");
            //    tradeInfo.VACC = 1;
            //}
            //else if (string.Equals(payType, "CVS"))
            //{
            //    // 設定繳費截止日期
            //    tradeInfo.ExpireDate = taipeiStandardTimeOffset.AddDays(1).ToString("yyyyMMdd");
            //    tradeInfo.CVS = 1;
            //}
            //else if (string.Equals(payType, "BARCODE"))
            //{
            //    // 設定繳費截止日期
            //    tradeInfo.ExpireDate = taipeiStandardTimeOffset.AddDays(1).ToString("yyyyMMdd");
            //    tradeInfo.BARCODE = 1;
            //}

            Atom <string> result = new Atom <string>()
            {
                IsSuccess = true
            };

            var inputModel = new SpgatewayInputModel
            {
                MerchantID = _bankInfoModel.MerchantID,
                Version    = version
            };

            // 將model 轉換為List<KeyValuePair<string, string>>, null值不轉
            List <KeyValuePair <string, string> > tradeData = LambdaUtil.ModelToKeyValuePairList <TradeInfo>(tradeInfo);
            // 將List<KeyValuePair<string, string>> 轉換為 key1=Value1&key2=Value2&key3=Value3...
            var tradeQueryPara = string.Join("&", tradeData.Select(x => $"{x.Key}={x.Value}"));

            // AES 加密
            inputModel.TradeInfo =
                CryptoUtil.EncryptAESHex(tradeQueryPara, _bankInfoModel.HashKey, _bankInfoModel.HashIV);
            // SHA256 加密
            inputModel.TradeSha =
                CryptoUtil.EncryptSHA256(
                    $"HashKey={_bankInfoModel.HashKey}&{inputModel.TradeInfo}&HashIV={_bankInfoModel.HashIV}");

            // 將model 轉換為List<KeyValuePair<string, string>>, null值不轉
            List <KeyValuePair <string, string> > postData =
                LambdaUtil.ModelToKeyValuePairList <SpgatewayInputModel>(inputModel);



            return(Ok(postData));
        }
Exemple #13
0
        public ActionResult SpgatewayPayBill(int amount, string payType)
        {
            string version = "1.5";

            // 目前時間轉換 +08:00, 防止傳入時間或Server時間時區不同造成錯誤
            DateTimeOffset taipeiStandardTimeOffset = DateTimeOffset.Now.ToOffset(new TimeSpan(8, 0, 0));

            TradeInfo tradeInfo = new TradeInfo()
            {
                // * 商店代號
                MerchantID = _bankInfoModel.MerchantID,
                // * 回傳格式
                RespondType = "String",
                // * TimeStamp
                TimeStamp = taipeiStandardTimeOffset.ToUnixTimeSeconds().ToString(),
                // * 串接程式版本
                Version = version,
                // * 商店訂單編號
                //MerchantOrderNo = $"T{DateTime.Now.ToString("yyyyMMddHHmm")}",
                MerchantOrderNo = taipeiStandardTimeOffset.ToUnixTimeSeconds().ToString(),
                // * 訂單金額
                Amt = amount,
                // * 商品資訊
                ItemDesc = "美甲美睫服務",
                // 繳費有效期限(適用於非即時交易)
                ExpireDate = null,
                // 支付完成 返回商店網址
                ReturnURL = _bankInfoModel.ReturnURL,
                // 支付通知網址
                NotifyURL = _bankInfoModel.NotifyURL,
                // 商店取號網址
                CustomerURL = _bankInfoModel.CustomerURL,
                // 支付取消 返回商店網址
                ClientBackURL = null,
                // * 付款人電子信箱
                Email = string.Empty,
                // 付款人電子信箱 是否開放修改(1=可修改 0=不可修改)
                EmailModify = 0,
                // 商店備註
                OrderComment = null,
                // 信用卡 一次付清啟用(1=啟用、0或者未有此參數=不啟用)
                CREDIT = null,
                // WEBATM啟用(1=啟用、0或者未有此參數,即代表不開啟)
                WEBATM     = null,
                ANDROIDPAY = null,
                SAMSUNGPAY = null,
                // ATM 轉帳啟用(1=啟用、0或者未有此參數,即代表不開啟)
                VACC = null,
                // 超商代碼繳費啟用(1=啟用、0或者未有此參數,即代表不開啟)(當該筆訂單金額小於 30 元或超過 2 萬元時,即使此參數設定為啟用,MPG 付款頁面仍不會顯示此支付方式選項。)
                CVS = null,
                // 超商條碼繳費啟用(1=啟用、0或者未有此參數,即代表不開啟)(當該筆訂單金額小於 20 元或超過 4 萬元時,即使此參數設定為啟用,MPG 付款頁面仍不會顯示此支付方式選項。)
                BARCODE = null
            };

            if (string.Equals(payType, "CREDIT"))
            {
                tradeInfo.CREDIT = 1;
            }
            else if (string.Equals(payType, "WEBATM"))
            {
                tradeInfo.WEBATM = 1;
            }
            else if (string.Equals(payType, "ANDROIDPAY"))
            {
                tradeInfo.ANDROIDPAY = 1;
            }
            else if (string.Equals(payType, "SAMSUNGPAY"))
            {
                tradeInfo.SAMSUNGPAY = 1;
            }
            else if (string.Equals(payType, "VACC"))
            {
                // 設定繳費截止日期
                tradeInfo.ExpireDate = taipeiStandardTimeOffset.AddDays(1).ToString("yyyyMMdd");
                tradeInfo.VACC       = 1;
            }
            else if (string.Equals(payType, "CVS"))
            {
                // 設定繳費截止日期
                tradeInfo.ExpireDate = taipeiStandardTimeOffset.AddDays(1).ToString("yyyyMMdd");
                tradeInfo.CVS        = 1;
            }
            else if (string.Equals(payType, "BARCODE"))
            {
                // 設定繳費截止日期
                tradeInfo.ExpireDate = taipeiStandardTimeOffset.AddDays(1).ToString("yyyyMMdd");
                tradeInfo.BARCODE    = 1;
            }

            Atom <string> result = new Atom <string>()
            {
                IsSuccess = true
            };

            var inputModel = new SpgatewayInputModel
            {
                MerchantID = _bankInfoModel.MerchantID,
                Version    = version
            };

            // 將model 轉換為List<KeyValuePair<string, string>>, null值不轉
            List <KeyValuePair <string, string> > tradeData = LambdaUtil.ModelToKeyValuePairList <TradeInfo>(tradeInfo);
            // 將List<KeyValuePair<string, string>> 轉換為 key1=Value1&key2=Value2&key3=Value3...
            var tradeQueryPara = string.Join("&", tradeData.Select(x => $"{x.Key}={x.Value}"));

            // AES 加密
            inputModel.TradeInfo = CryptoUtil.EncryptAESHex(tradeQueryPara, _bankInfoModel.HashKey, _bankInfoModel.HashIV);
            // SHA256 加密
            inputModel.TradeSha = CryptoUtil.EncryptSHA256($"HashKey={_bankInfoModel.HashKey}&{inputModel.TradeInfo}&HashIV={_bankInfoModel.HashIV}");

            // 將model 轉換為List<KeyValuePair<string, string>>, null值不轉
            List <KeyValuePair <string, string> > postData = LambdaUtil.ModelToKeyValuePairList <SpgatewayInputModel>(inputModel);

            Response.Clear();

            StringBuilder s = new StringBuilder();

            s.Append("<html>");
            s.AppendFormat("<body onload='document.forms[\"form\"].submit()'>");
            s.AppendFormat("<form name='form' action='{0}' method='post'>", _bankInfoModel.AuthUrl);
            foreach (KeyValuePair <string, string> item in postData)
            {
                s.AppendFormat("<input type='hidden' name='{0}' value='{1}' />", item.Key, item.Value);
            }

            s.Append("</form></body></html>");
            Response.Write(s.ToString());
            Response.End();

            return(Content(string.Empty));
        }
Exemple #14
0
        public IHttpActionResult SpgatewayPayBill(Order order)
        {
            string      error_message = "下單錯誤,請至伺服器log查詢錯誤訊息";
            string      token         = Request.Headers.Authorization.Parameter;
            JwtAuthUtil jwtAuthUtil   = new JwtAuthUtil();
            string      userseq       = jwtAuthUtil.Getuserseq(token);

            //後端 判斷日期有沒有被下訂
            List <Order>  orders = db.Order.Where(x => x.state == (int)Orderstate.已付款 && x.roomseq == order.roomseq).ToList(); //已下的訂單
            List <string> date   = new List <string>();                                                                        //排除的日期

            foreach (Order o in orders)
            {
                date.AddRange(Utility.Data(o.orderdates.Value, o.orderdatee.Value));
            }
            if (date.Contains(order.orderdates.Value.ToString("yyyy-MM-dd")) ||
                date.Contains(order.orderdatee.Value.ToString("yyyy-MM-dd")))
            {
                error_message = "日期已被下訂";
                return(Ok(new
                {
                    result = error_message
                }));
            }

            Room    room    = db.Room.Find(order.roomseq);
            Company company = db.Company.Find(room.companyseq);

            order.companyseq  = room.companyseq;
            order.companyname = company.companybrand;
            order.roomname    = room.roomname;
            order.memberseq   = userseq; //登入者 流水號
            order.country     = company.country;
            order.area        = company.area;
            order.address     = company.address;
            //order.name 前端傳進
            //order.tel 前端傳進
            //order.pettype
            //order.petsize
            //數量前端傳 金額room表拿
            //order.petamount
            order.roomprice      = room.roomprice;
            order.roomamount_amt = room.roomamount_amt;
            //是否有勾 前端傳  重新回room表拿金額
            order.medicine_infeed_amt = room.medicine_infeed_amt;
            order.medicine_paste_amt  = room.medicine_paste_amt;
            order.medicine_pill_amt   = room.medicine_pill_amt;
            order.bath_amt            = room.bath_amt;
            order.hair_amt            = room.hair_amt;
            order.nails_amt           = room.nails_amt;
            order.state = 0; //未付款
            //orderdatee orderdates
            #region 金額       // 處理金額
            TimeSpan s   = new TimeSpan(order.orderdatee.Value.Ticks - order.orderdates.Value.Ticks);
            int      amt = 0;
            amt += (room.roomprice.Value + room.roomamount_amt.Value * (order.petamount.Value - 1)) * (s.Days + 1); //每間金額 * 天數  //隻 * 每隻金額

            if (order.medicine_infeed.Value)                                                                        //判斷藥
            {
                amt = amt + room.medicine_infeed_amt.Value * (order.petamount.Value);
            }
            if (order.medicine_paste.Value)
            {
                amt = amt + room.medicine_paste_amt.Value * (order.petamount.Value);
            }
            if (order.medicine_pill.Value)
            {
                amt = amt + room.medicine_pill_amt.Value * (order.petamount.Value);
            }

            if (order.bath.Value) //判斷加購
            {
                amt = amt + room.bath_amt.Value * (order.petamount.Value);
            }
            if (order.hair.Value)
            {
                amt = amt + room.hair_amt.Value * (order.petamount.Value);
            }
            if (order.nails.Value)
            {
                amt = amt + room.nails_amt.Value * (order.petamount.Value);
            }

            //amt += room.roomprice.Value * (s.Days+1);
            //amt += order.petamount.Value * room.roomamount_amt.Value; //隻 * 每隻金額

            #endregion

            order.amt      = amt;
            order.postday  = DateTime.Now;
            order.del_flag = "N";
            db.Order.Add(order);

            ModelState.Clear();
            Validate(order);

            if (!ModelState.IsValid)
            {
                Utility.log("下單 pay/Getinfo", ModelState.ToString());
                return(Ok(new
                {
                    result = error_message
                }));
            }

            db.SaveChanges();

            string version = "1.5";

            // 目前時間轉換 +08:00, 防止傳入時間或Server時間時區不同造成錯誤
            DateTimeOffset taipeiStandardTimeOffset = DateTimeOffset.Now.ToOffset(new TimeSpan(8, 0, 0));

            TradeInfo tradeInfo = new TradeInfo()
            {
                // * 商店代號
                MerchantID = _bankInfoModel.MerchantID,
                // * 回傳格式
                RespondType = "String",
                // * TimeStamp
                TimeStamp = taipeiStandardTimeOffset.ToUnixTimeSeconds().ToString(),
                // * 串接程式版本
                Version = version,
                // * 商店訂單編號
                //MerchantOrderNo = $"T{DateTime.Now.ToString("yyyyMMddHHmm")}",
                MerchantOrderNo = order.orderseq,
                // * 訂單金額
                Amt = order.amt.Value,
                // * 商品資訊
                ItemDesc = "pertrip交易訂單" + order.orderseq,
                // 繳費有效期限(適用於非即時交易)
                ExpireDate = null,
                // 支付完成 返回商店網址
                ReturnURL = _bankInfoModel.ReturnURL,
                // 支付通知網址
                NotifyURL = _bankInfoModel.NotifyURL,
                // 商店取號網址
                CustomerURL = _bankInfoModel.CustomerURL,
                // 支付取消 返回商店網址
                ClientBackURL = null,
                // * 付款人電子信箱
                Email = string.Empty,
                // 付款人電子信箱 是否開放修改(1=可修改 0=不可修改)
                EmailModify = 0,
                // 商店備註
                OrderComment = null,
                // 信用卡 一次付清啟用(1=啟用、0或者未有此參數=不啟用)
                CREDIT = null,
                // WEBATM啟用(1=啟用、0或者未有此參數,即代表不開啟)
                WEBATM = null,
                // ATM 轉帳啟用(1=啟用、0或者未有此參數,即代表不開啟)
                VACC = null,
                // 超商代碼繳費啟用(1=啟用、0或者未有此參數,即代表不開啟)(當該筆訂單金額小於 30 元或超過 2 萬元時,即使此參數設定為啟用,MPG 付款頁面仍不會顯示此支付方式選項。)
                CVS = null,
                // 超商條碼繳費啟用(1=啟用、0或者未有此參數,即代表不開啟)(當該筆訂單金額小於 20 元或超過 4 萬元時,即使此參數設定為啟用,MPG 付款頁面仍不會顯示此支付方式選項。)
                BARCODE = null
            };
            //暫定都信用卡
            tradeInfo.CREDIT = 1;
            //if (string.Equals(payType, "CREDIT"))
            //{
            //    tradeInfo.CREDIT = 1;
            //}
            //else if (string.Equals(payType, "WEBATM"))
            //{
            //    tradeInfo.WEBATM = 1;
            //}
            //else if (string.Equals(payType, "VACC"))
            //{
            //    // 設定繳費截止日期
            //    tradeInfo.ExpireDate = taipeiStandardTimeOffset.AddDays(1).ToString("yyyyMMdd");
            //    tradeInfo.VACC = 1;
            //}
            //else if (string.Equals(payType, "CVS"))
            //{
            //    // 設定繳費截止日期
            //    tradeInfo.ExpireDate = taipeiStandardTimeOffset.AddDays(1).ToString("yyyyMMdd");
            //    tradeInfo.CVS = 1;
            //}
            //else if (string.Equals(payType, "BARCODE"))
            //{
            //    // 設定繳費截止日期
            //    tradeInfo.ExpireDate = taipeiStandardTimeOffset.AddDays(1).ToString("yyyyMMdd");
            //    tradeInfo.BARCODE = 1;
            //}

            Atom <string> result = new Atom <string>()
            {
                IsSuccess = true
            };

            var inputModel = new SpgatewayInputModel
            {
                MerchantID = _bankInfoModel.MerchantID,
                Version    = version
            };

            // 將model 轉換為List<KeyValuePair<string, string>>, null值不轉
            List <KeyValuePair <string, string> > tradeData = LambdaUtil.ModelToKeyValuePairList <TradeInfo>(tradeInfo);
            // 將List<KeyValuePair<string, string>> 轉換為 key1=Value1&key2=Value2&key3=Value3...
            var tradeQueryPara = string.Join("&", tradeData.Select(x => $"{x.Key}={x.Value}"));
            // AES 加密
            inputModel.TradeInfo = CryptoUtil.EncryptAESHex(tradeQueryPara, _bankInfoModel.HashKey, _bankInfoModel.HashIV);
            // SHA256 加密
            inputModel.TradeSha = CryptoUtil.EncryptSHA256($"HashKey={_bankInfoModel.HashKey}&{inputModel.TradeInfo}&HashIV={_bankInfoModel.HashIV}");

            // 將model 轉換為List<KeyValuePair<string, string>>, null值不轉
            List <KeyValuePair <string, string> > postData = LambdaUtil.ModelToKeyValuePairList <SpgatewayInputModel>(inputModel);



            return(Ok(postData));
        }
Exemple #15
0
        public ActionResult SpgatewayReturn()
        {
            Request.LogFormData("SpgatewayReturn(支付完成)");

            // Status 回傳狀態
            // MerchantID 回傳訊息
            // TradeInfo 交易資料AES 加密
            // TradeSha 交易資料SHA256 加密
            // Version 串接程式版本
            NameValueCollection collection = Request.Form;

            if (collection["MerchantID"] != null && string.Equals(collection["MerchantID"], _bankInfoModel.MerchantID) &&
                collection["TradeInfo"] != null && string.Equals(collection["TradeSha"], CryptoUtil.EncryptSHA256($"HashKey={_bankInfoModel.HashKey}&{collection["TradeInfo"]}&HashIV={_bankInfoModel.HashIV}")))
            {
                var decryptTradeInfo = CryptoUtil.DecryptAESHex(collection["TradeInfo"], _bankInfoModel.HashKey, _bankInfoModel.HashIV);

                // 取得回傳參數(ex:key1=value1&key2=value2),儲存為NameValueCollection
                NameValueCollection      decryptTradeCollection = HttpUtility.ParseQueryString(decryptTradeInfo);
                SpgatewayOutputDataModel convertModel           = LambdaUtil.DictionaryToObject <SpgatewayOutputDataModel>(decryptTradeCollection.AllKeys.ToDictionary(k => k, k => decryptTradeCollection[k]));

                LogUtil.WriteLog(JsonConvert.SerializeObject(convertModel));

                // TODO 將回傳訊息寫入資料庫
                intoDB DB        = new intoDB();
                var    Status    = convertModel.Status;
                var    OrderNo   = convertModel.MerchantOrderNo;
                var    PayWay    = convertModel.PaymentType;
                var    PayWay_id = 0;

                switch (PayWay)
                {
                case "CREDIT":
                    PayWay_id = 1;
                    break;

                case "SAMSUNGPAY":
                    PayWay_id = 2;
                    break;

                case "ANDROIDPAY":
                    PayWay_id = 3;
                    break;

                case "WEBATM":
                    PayWay_id = 4;
                    break;

                case "VACC":
                    PayWay_id = 5;
                    break;

                default:
                    PayWay_id = 6;
                    break;
                }

                if (Status == "SUCCESS")
                {
                    var data = Data;
                    AccountDetailService Account = new AccountDetailService();
                    var user_name = HttpContext.User.Identity.Name;
                    var viewmodel = Account.get_account_detail(user_name);
                    DB._intoDB(data, Status, OrderNo, PayWay_id, viewmodel.Cust_id);
                }
            }
            else
            {
                LogUtil.WriteLog("MerchantID/TradeSha驗證錯誤");
            }

            return(View());
        }
Exemple #16
0
 public IQueryBuilder <T> Filter(string propertyName, object value, Operator @operator = Operator.Equal)
 {
     return(Filter(LambdaUtil.ParsePredicate <T>(propertyName, value, @operator)));
 }
Exemple #17
0
        public IHttpActionResult SpgatewayNotify()
        {
            // 取法同SpgatewayResult
            var httpRequestBase = new HttpRequestWrapper(HttpContext.Current.Request);

            RazorExtensions.LogFormData(httpRequestBase, "SpgatewayNotify(支付完成)");
            // Status 回傳狀態
            // MerchantID 回傳訊息
            // TradeInfo 交易資料AES 加密
            // TradeSha 交易資料SHA256 加密
            // Version 串接程式版本
            NameValueCollection collection = HttpContext.Current.Request.Form;

            if (collection["MerchantID"] != null && string.Equals(collection["MerchantID"], _bankInfoModel.MerchantID) &&
                collection["TradeInfo"] != null && string.Equals(collection["TradeSha"], CryptoUtil.EncryptSHA256($"HashKey={_bankInfoModel.HashKey}&{collection["TradeInfo"]}&HashIV={_bankInfoModel.HashIV}")))
            {
                var decryptTradeInfo = CryptoUtil.DecryptAESHex(collection["TradeInfo"], _bankInfoModel.HashKey, _bankInfoModel.HashIV);

                // 取得回傳參數(ex:key1=value1&key2=value2),儲存為NameValueCollection
                NameValueCollection      decryptTradeCollection = HttpUtility.ParseQueryString(decryptTradeInfo);
                SpgatewayOutputDataModel convertModel           = LambdaUtil.DictionaryToObject <SpgatewayOutputDataModel>(decryptTradeCollection.AllKeys.ToDictionary(k => k, k => decryptTradeCollection[k]));

                //LogUtil.WriteLog(JsonConvert.SerializeObject(convertModel));

                // TODO 將回傳訊息寫入資料庫

                // return Content(JsonConvert.SerializeObject(convertModel));

                if (convertModel.Status == "SUCCESS")
                {
                    //MerchantOrderNo = "O202009100034"
                    //convertModel.MerchantOrderNo
                    Order order = db.Order.Find(convertModel.MerchantOrderNo);
                    order.state           = 1;
                    db.Entry(order).State = EntityState.Modified;
                    db.SaveChanges();

                    //signalr即時通知 改寫法
                    Utility.signalR_notice(order.memberseq, order.companyseq, order.orderseq, "", Noticetype.單通知);
                    var context   = GlobalHost.ConnectionManager.GetHubContext <DefaultHub>();
                    var connectid = db.Signalr.Where(x => x.whoseq == order.companyseq).Select(x => x.connectid).ToList();//需要通知的廠商signalr connectid
                    var notices   = db.Notice.Where(x => x.toseq == order.companyseq).ToList();
                    var unread    = notices.Where(x => x.state == Convert.ToBoolean(Noticestate.未讀)).Count();

                    List <Notice> notices_ = notices.OrderBy(x => x.state).ThenByDescending(x => x.postday).Take(10).ToList();
                    var           result   = new
                    {
                        unread  = unread,
                        notices = notices_.Select(
                            x => new
                        {
                            x.noticeseq,
                            x.fromseq,
                            x.toseq,
                            state = Enum.Parse(typeof(Noticestate), x.state.GetHashCode().ToString()).ToString(),
                            x.text,
                            type = Enum.Parse(typeof(Noticetype), x.type.ToString()).ToString(),
                            time = Convert.ToDateTime(x.postday).ToString("yyyy-MM-dd HH:mm")
                        })
                    };
                    foreach (var c in connectid)
                    {
                        context.Clients.Client(c).Get(result);
                    }

                    ////signalr即時通知
                    //Utility.signalR_notice(order.memberseq, order.companyseq, order.orderseq, "", Noticetype.下單通知);
                    //var context = GlobalHost.ConnectionManager.GetHubContext<DefaultHub>();
                    //var connectid = db.Signalr.Where(x => x.whoseq == order.companyseq).Select(x => x.connectid).ToList();//需要通知的廠商signalr connectid
                    //foreach (var c in connectid)
                    //{
                    //    context.Clients.Client(c).Get();
                    //}
                }
                else//付款失敗
                {
                }
                return(Ok());
            }
            else
            {
                //LogUtil.WriteLog("MerchantID/TradeSha驗證錯誤");
            }

            return(Ok());
        }