async Task <Subscribe> HandleSimulatePayAsync(Pay pay, TradeResultModel model) { string userId = pay.Bill.UserId; if (userId != _adminSettings.Id) { return(null); } if (!model.Payed) { return(null); } if (pay.HasMoney) { return(null); //不處理重複發送的資料 } pay.Money = Convert.ToDecimal(model.Amount); pay.PayedDate = model.PayedDate.ToDatetimeOrNull(); pay.TradeNo = model.TradeNo; pay.TradeData = model.Data; pay.Removed = false; await _paysService.UpdateAsync(pay); if (pay.Bill.Removed) { pay.Bill.Removed = false; await _billsService.UpdateAsync(pay.Bill); } return(await OnPayedAsync(pay)); }
public async Task <ActionResult> Store() { TradeResultModel tradeResultModel = null; try { tradeResultModel = _subscribesService.ResolveTradeResult(Request); } catch (Exception ex) { _logger.LogException(ex); if (ex is EcPayTradeFeedBackFailed) { // rtnCode 不是 1 也不是 2 _logger.LogInfo("ResolveTradeResult: 1|OK"); return(Ok("1|OK")); } else if (ex is EcPayTradeFeedBackError) { _logger.LogInfo($"ResolveTradeResult: 0|{ex.Message}"); return(Ok($"0|{ex.Message}")); } else { throw ex; } } var subscribe = await _subscribesService.StorePayAsync(tradeResultModel); if (subscribe != null) { //付款訂閱完成 BackgroundJob.Enqueue(() => NotifyUserAsync(subscribe.UserId)); } return(Ok("1|OK")); }
public TradeResultModel ResolveTradeResult(HttpRequest request) { List <string> enErrors = new List <string>(); Hashtable htFeedback = null; try { using (var oPayment = new AllInOne()) { oPayment.HashKey = ECPayHashKey; oPayment.HashIV = ECPayHashIV; /* 取回付款結果 */ enErrors.AddRange(oPayment.CheckOutFeedback(request, ref htFeedback)); } if (enErrors.IsNullOrEmpty()) { _appLogger.LogInfo($"htFeedback: {JsonConvert.SerializeObject(htFeedback)}"); var tradeResultModel = new TradeResultModel() { Provider = _ecpaySettings.Id, Code = htFeedback["MerchantTradeNo"].ToString(), TradeNo = htFeedback["TradeNo"].ToString(), Amount = htFeedback["TradeAmt"].ToString().ToInt() }; var rtnCode = htFeedback["RtnCode"].ToString().ToInt(); if (rtnCode == 1) //付款成功 { bool simulatePaid = false; if (htFeedback.ContainsKey("SimulatePaid")) { simulatePaid = htFeedback["SimulatePaid"].ToString().ToInt() > 0; } tradeResultModel.Simulate = simulatePaid; //是否為模擬的付款紀錄 tradeResultModel.Payed = true; tradeResultModel.PayedDate = htFeedback["PaymentDate"].ToString(); tradeResultModel.PayWay = GetPaymentType(htFeedback["PaymentType"].ToString()); } else if (rtnCode == 2) //ATM 取號成功 { tradeResultModel.Payed = false; tradeResultModel.PayWay = GetPaymentType(htFeedback["PaymentType"].ToString()); tradeResultModel.BankCode = htFeedback["BankCode"].ToString(); tradeResultModel.BankAccount = htFeedback["vAccount"].ToString(); tradeResultModel.ExpireDate = htFeedback["ExpireDate"].ToString(); } else { //Failed throw new EcPayTradeFeedBackFailed($"htFeedback: {JsonConvert.SerializeObject(htFeedback)}"); } tradeResultModel.Data = JsonConvert.SerializeObject(htFeedback); return(tradeResultModel); } else { //has error throw new EcPayTradeFeedBackError(String.Join("\\r\\n", enErrors)); } } catch (Exception ex) { throw new EcPayTradeFeedBackError(ex.Message, ex); } }
public async Task <Subscribe> StorePayAsync(TradeResultModel model) { var pay = _paysService.FindByCode(model.Code); if (pay == null) { throw new PayNotFound($"code: {model.Code}"); } if (model.Simulate) { return(await HandleSimulatePayAsync(pay, model)); } if (model.Payed) //付款成功的資料 { if (pay.HasMoney) { return(null); //不處理重複發送的資料 } pay.Money = Convert.ToDecimal(model.Amount); pay.PayedDate = model.PayedDate.ToDatetimeOrNull(); pay.TradeNo = model.TradeNo; pay.TradeData = model.Data; pay.Removed = false; await _paysService.UpdateAsync(pay); if (pay.Bill.Removed) { pay.Bill.Removed = false; await _billsService.UpdateAsync(pay.Bill); } return(await OnPayedAsync(pay)); } else { if (String.IsNullOrEmpty(model.BankAccount)) { return(null); } DateTime?expireDate = model.ExpireDate.ToEndDate(); // 獲取ATM虛擬帳號 pay.BankCode = model.BankCode; pay.BankAccount = model.BankAccount; if (!String.IsNullOrEmpty(model.PayWay)) { pay.PayWay = model.PayWay; } await _paysService.UpdateAsync(pay); if (expireDate.HasValue) { pay.Bill.DeadLine = expireDate; await _billsService.UpdateAsync(pay.Bill); } return(null); //只獲取ATM虛擬帳號, 沒有付款完成 } }