public async Task <OnchainResponse> CashoutAsync(CashoutModel data)
        {
            var request = new CashoutRequest(data.TransactionId, data.DestinationAddress, data.AssetId, data.Amount);

            var response = await _apiClient.ApiEnqueueTransactionCashoutPostAsync(request);

            return(PrepareOnchainResult(response));
        }
Beispiel #2
0
        public async Task <IActionResult> Cashout([FromBody] CashoutRequest model)
        {
            model.DestinationAddress = model.DestinationAddress.Trim('\n', ' ', '\t');

            if (model.Amount <= 0)
            {
                throw new BackendException("Amount can't be less or equal to zero", ErrorCode.BadInputParameter);
            }

            await ValidateAddress(model.DestinationAddress, false);

            var asset = await _assetRepository.GetItemAsync(model.Asset);

            if (asset == null)
            {
                throw new BackendException("Provided asset is missing in database", ErrorCode.AssetNotFound);
            }

            var transactionId = await _builder.AddTransactionId(model.TransactionId, $"Cashout: {model.ToJson()}");

            if (OpenAssetsHelper.IsBitcoin(model.Asset))
            {
                await _cashoutRequestRepository.CreateCashoutRequest(transactionId, model.Amount, model.DestinationAddress);
            }
            else
            {
                var assetSetting = await _assetSettingCache.GetItemAsync(asset.Id);

                var hotWallet = !string.IsNullOrEmpty(assetSetting.ChangeWallet)
                    ? assetSetting.ChangeWallet
                    : assetSetting.HotWallet;

                await _transactionQueueWriter.AddCommand(transactionId, TransactionCommandType.Transfer, new TransferCommand
                {
                    Amount             = model.Amount,
                    SourceAddress      = hotWallet,
                    Asset              = model.Asset,
                    DestinationAddress = model.DestinationAddress
                }.ToJson());
            }
            return(Ok(new TransactionIdResponse
            {
                TransactionId = transactionId
            }));
        }
Beispiel #3
0
        /// <summary>
        /// 提现申请
        /// </summary>
        /// <param name="request">参数</param>
        public JResult Cashout(CashoutRequest request)
        {
            var response = new JResult()
            {
                Status = false
            };

            using (var tran = new TransactionProvider())
            {
                try
                {
                    //更新会员钱包(钱包金额-提现金额)(升级金额+提现金额/(如果是普通、区域、全国才除)2)
                    if (Using <ICrCustomer>().UpdateWalletAmount(new UpdateWalletAmountRequest()
                    {
                        CustomerSysNo = request.CustomerSysNo,
                        WalletAmount = request.WalletAmount,
                        UpgradeFundAmount = request.UpgradeFundAmount
                    }) <= 0)
                    {
                        throw new Exception("更新会员钱包失败");
                    }
                    //添加提现记录
                    var amount = request.WalletAmount - request.UpgradeFundAmount;
                    var model  = new FnCashout()
                    {
                        CustomerSysNo = request.CustomerSysNo,
                        RealName      = request.Account,
                        CashoutType   = request.CashoutType,
                        Amount        = amount,
                        Remarks       = string.Format("提现金额:{0} 实际到账金额:{1} 升级基金:{2}", request.WalletAmount, request.WalletAmount - request.UpgradeFundAmount, request.UpgradeFundAmount),
                        Status        = amount < 200?FnEnum.CashoutStatus.完成.GetHashCode(): FnEnum.CashoutStatus.处理中.GetHashCode(),//FnEnum.CashoutStatus.处理中.GetHashCode()
                        CreatedDate   = DateTime.Now
                    };

                    var cashoutSysNo = Using <IFnCashout>().Insert(model);
                    if (cashoutSysNo <= 0)
                    {
                        throw new Exception("添加提现记录失败");
                    }

                    if (amount < 200)
                    {
                        var result = FnCashoutApp.Instance.H5CashoutWeiXin(cashoutSysNo, request.CertPath);

                        Log4Helper.WriteInfoLog("EC.H5 提现" + result.ToJson2(), "Cashout");

                        if (!result.Status)
                        {
                            throw new Exception(result.Message);
                        }
                    }

                    tran.Commit();
                    response.Status  = true;
                    response.Message = "提现申请成功、等待管理员审核!";
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    response.Message = ex.Message;
                }
                finally
                {
                    tran.Dispose();
                }
            }

            return(response);
        }
Beispiel #4
0
 public Task <CashoutResponse> CashoutAsync(CashoutRequest request)
 {
     return(_runner.RunWithDefaultErrorHandlingAsync(() => _cashoutApi.ExecuteAsync(request)));
 }
Beispiel #5
0
        public JsonResult Cashout(CashoutRequest request)
        {
            var response = new JResult()
            {
                Status = false
            };

            var result = VHelper.ValidatorRule(
                new Rule_Number(request.Amount.ToString(), "请输入提现金额!")
                );

            if (!result.IsPass)
            {
                response.Status  = false;
                response.Message = result.Message;
                return(Json(response, JsonRequestBehavior.AllowGet));
            }

            lock (_lock)
            {
                Log4Helper.WriteInfoLog("EC.H5 提现" + result.ToJson2(), "Cashout");
                //当前上下文
                var context = CustomerContext.Context;
                if (context == null)
                {
                    response.Message = "用户已超时、请重新登录﹗";
                    return(Json(response, JsonRequestBehavior.AllowGet));
                }
                if (request.Amount <= 0)
                {
                    response.Message = "提现金额不能为零﹗";
                    return(Json(response, JsonRequestBehavior.AllowGet));
                }

                var periodList = FnCashoutApp.Instance.GetPeriodTimes(new FnCashoutQueryRequest()
                {
                    CustomerSysNo = context.SysNo,
                    StartTime     = DateTime.Now.ToString("yyyy-MM-dd 00:00:00"),
                    EndTime       = DateTime.Now.ToString("yyyy-MM-dd 23:59:59")
                });
                if (periodList != null && periodList.Any())
                {
                    response.Message = "每天只能提现一次﹗";
                    return(Json(response, JsonRequestBehavior.AllowGet));
                }
                //提现金额判断(100元的倍数)
                //var remainder = request.Amount % 100;
                //if (remainder != 0)
                //{
                //    response.Message = "提现金额必须为100的倍数﹗";
                //    return Json(response, JsonRequestBehavior.AllowGet);
                //}
                if (request.Amount < 10)
                {
                    response.Message = "提现金额必须为10元﹗";
                    return(Json(response, JsonRequestBehavior.AllowGet));
                }
                //验证是否填写银行卡
                if (request.CashoutType.Equals(FnEnum.CashoutType.银联.GetHashCode()))
                {
                    if (context.Bank <= 0 && context.BankNumber == "")
                    {
                        response.Message = "请设置银行卡";
                        return(Json(response, JsonRequestBehavior.AllowGet));
                    }
                }
                if (context.WalletAmount >= request.Amount)
                {
                    WeiXinProvider wx = new WeiXinProvider();

                    var certPath = Server.MapPath(@"\cert\apiclient_cert.p12");

                    decimal upgradeFundAmount = 0;

                    if (!context.Grade.Equals(CustomerEnum.Grade.股东.GetHashCode()))
                    {
                        upgradeFundAmount = request.Amount / 2;
                    }

                    response = FnCashoutApp.Instance.Cashout(new CashoutRequest()
                    {
                        CustomerSysNo     = context.SysNo,
                        WalletAmount      = request.Amount,
                        UpgradeFundAmount = upgradeFundAmount,
                        Account           = context.Account,
                        CashoutType       = request.CashoutType,
                        CertPath          = certPath
                    });
                }
                else
                {
                    response.Message = "当前余额不足﹗";
                    return(Json(response, JsonRequestBehavior.AllowGet));
                }
            }
            return(Json(response, JsonRequestBehavior.AllowGet));
        }