示例#1
0
        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"));
        }
示例#3
0
        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);
            }
        }
示例#4
0
        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虛擬帳號, 沒有付款完成
            }
        }