예제 #1
0
 public OnlineDeposit(Guid id,
                      string transactionNumber,
                      OnlineDepositRequest request,
                      OnlineDepositParams depositParams,
                      Guid brandId,
                      DateTimeOffset now)
 {
     if (request.Amount <= 0)
     {
         throw new ArgumentException("Amount must be greater than 0.");
     }
     Data = new Data.OnlineDeposit
     {
         Id                = id,
         BrandId           = brandId,
         PlayerId          = request.PlayerId,
         TransactionNumber = transactionNumber,
         Amount            = request.Amount,
         CreatedBy         = request.RequestedBy,
         Created           = now,
         Status            = OnlineDepositStatus.New,
         Method            = depositParams.Method,
         Channel           = depositParams.Channel,
         MerchantId        = depositParams.MerchantId,
         Currency          = depositParams.Currency,
         Language          = depositParams.Language,
         ReturnUrl         = depositParams.ReturnUrl,
         NotifyUrl         = depositParams.NotifyUrl,
         BonusCode         = request.BonusCode,
         BonusId           = request.BonusId
     };
 }
예제 #2
0
        public async Task <SubmitOnlineDepositRequestResult> SubmitOnlineDepositRequest(OnlineDepositRequest request)
        {
            var validationResult = new OnlineDepositRequestValidator(_repository).Validate(request);

            if (!validationResult.IsValid)
            {
                throw new RegoValidationException(validationResult);
            }

            var player = _repository.Players.FirstOrDefault(x => x.Id == request.PlayerId);

            var paymentGetewaySettings = _paymentGatewaySettingsQueries.GetOnePaymentGatewaySettingsByPlayerId(player.Id);

            if (paymentGetewaySettings == null)
            {
                throw new RegoException("PaymentGatewaySettings not found");
            }

            var method     = paymentGetewaySettings.OnlinePaymentMethodName;
            var channel    = paymentGetewaySettings.Channel;
            var paymentUrl = paymentGetewaySettings.EntryPoint;

            _validator.ValidatePaymentSetting(request.PlayerId, method, request.Amount, player.CurrencyCode);

            var number = GenerateOrderId(method, channel);

            var merchantId = GetDepositMerchantId();

            var hashKey = GetDepositHashKey();

            var depositParams = new OnlineDepositParams();

            depositParams.Method     = method;
            depositParams.Channel    = channel;
            depositParams.Amount     = request.Amount;
            depositParams.MerchantId = merchantId;
            depositParams.OrderId    = number;
            depositParams.Currency   = player.CurrencyCode;
            depositParams.Language   = request.CultureCode;
            depositParams.ReturnUrl  = request.ReturnUrl;
            depositParams.NotifyUrl  = request.NotifyUrl;
            depositParams.Signature  = EncryptHelper.GetMD5HashInHexadecimalFormat(depositParams.SignParams + hashKey);

            var id = Guid.NewGuid();

            var brandId = player.BrandId;

            var now = _paymentQueries.GetBrandDateTimeOffset(brandId);

            var onlineDepositEntity = new Entities.OnlineDeposit(id, number, request, depositParams, brandId, now);

            var submitEvent = onlineDepositEntity.Submit();

            using (var scope = CustomTransactionScope.GetTransactionScopeAsync())
            {
                if (!string.IsNullOrWhiteSpace(request.BonusCode) || (request.BonusId.HasValue && request.BonusId != Guid.Empty))
                {
                    var bonusRedemptionId = await _bonusApiProxy.ApplyForBonusAsync(new DepositBonusApplication
                    {
                        PlayerId  = request.PlayerId,
                        BonusId   = request.BonusId,
                        Amount    = request.Amount,
                        DepositId = onlineDepositEntity.Data.Id,
                        BonusCode = onlineDepositEntity.Data.BonusCode
                    });

                    onlineDepositEntity.SetBonusRedemption(bonusRedemptionId);
                }
                _repository.OnlineDeposits.Add(onlineDepositEntity.Data);

                _eventBus.Publish(submitEvent);

                _repository.SaveChanges();

                scope.Complete();
            }

            return(new SubmitOnlineDepositRequestResult
            {
                DepositId = id,
                RedirectUrl = new Uri(paymentUrl),
                RedirectParams = depositParams
            });
        }