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); } }
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()); }
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); } }
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)); }
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)); }
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)); }
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)); }
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)); }
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()); }
public IQueryBuilder <T> Filter(string propertyName, object value, Operator @operator = Operator.Equal) { return(Filter(LambdaUtil.ParsePredicate <T>(propertyName, value, @operator))); }
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()); }