예제 #1
0
        public IActionResult TopupQuery(long id)
        {
            var currentUser = _partnerManager.GetPartnerById(this.HttpContext.User.Identity.Name);
            var collection  = new RechargeRepo(_db, _partnerManager).GetRechargeByApiTransaction(id, currentUser.Account);

            if (collection == null)
            {
                return(Ok(new { resultCode = 0, resultDesc = "OK", success = "no", status = "notFound", queryTime = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") }));
            }
            if (collection.Status == 0)
            {
                return(Ok(new { resultCode = 0, resultDesc = "OK", success = "no", status = "pending", queryTime = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") }));
            }
            if (collection.Status > 1)
            {
                return(Ok(new { resultCode = 0, resultDesc = "OK", success = "no", status = "failed", queryTime = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") }));
            }

            return(Ok(new {
                resultCode = 0,
                resultDesc = "OK",
                success = "yes",
                status = "done",
                data = new
                {
                    subsNo = collection.SubsNo,
                    amt = collection.Amount,
                    seq = collection.ApiTransaction
                },
                queryTime = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")
            }));
        }
예제 #2
0
        public async Task <RechargeResponseDto> DoRecharge(GrappedRecharge recharge)
        {
            //Thread.Sleep(2000);
            #region Local test
            var result = new RechargeResponseDto();

            var watch = System.Diagnostics.Stopwatch.StartNew();
            BasicHttpBinding httpBinding = new BasicHttpBinding();
            EndpointAddress  p           = new EndpointAddress(SharedParams.OCSEndpoint);

            //Start Send Request------------------------------ -
            var payService = new CBSService.CBSInterfaceAccountMgrClient(httpBinding, p);
            {
                /// payService = SharedParams.OCSEndpoint;
                CBSService.PaymentRequestMsg msg       = new CBSService.PaymentRequestMsg();
                CBSService.RequestHeader     reqheader = new CBSService.RequestHeader();

                reqheader.SessionEntity          = new CBSService.SessionEntityType();
                reqheader.SessionEntity.Name     = SharedParams.OCSApiUser;
                reqheader.SessionEntity.Password = SharedParams.OCSApiPassword;
                reqheader.TransactionId          = "";
                reqheader.SequenceId             = "1";
                reqheader.CommandId   = "Payment";
                reqheader.Version     = "1";
                reqheader.SerialNo    = "";
                reqheader.RequestType = CBSService.RequestHeaderRequestType.Event;
                reqheader.SessionEntity.RemoteAddress = SharedParams.PaymentRemoteAddress;
                msg.RequestHeader  = reqheader;
                msg.PaymentRequest = new CBSService.PaymentRequest();
                msg.PaymentRequest.SubscriberNo    = recharge.SubscriberNo;
                msg.PaymentRequest.PaymentAmt      = Convert.ToInt64(recharge.Amount) * 100;
                msg.PaymentRequest.PaymentMode     = "1000";
                msg.PaymentRequest.TransactionCode = $"VTU{recharge.Id}";
                msg.PaymentRequest.RefillProfileID = recharge.Amount.ToString();


                try
                {
                    var requestResult = await payService.PaymentAsync(msg);

                    if (requestResult != null)
                    {
                        result.ResultCode = requestResult.PaymentResultMsg.ResultHeader.ResultCode;
                        result.ResultDesc = requestResult.PaymentResultMsg.ResultHeader.ResultDesc;
                        result.TransNo    = requestResult.PaymentResultMsg.PaymentResult.InternalSerialNo;
                    }
                    else
                    {
                        result.ResultCode = "-1001";
                        result.ResultDesc = "OCS return null";
                    }
                }
                catch (Exception ex)
                {
                    result.ResultCode = "-1000";
                    result.ResultDesc = ex.GetType().Name + "-" + ex.Message;
                }
            }
            //}
            // End Send Request -------------------------------
            //await HTTPClientWrapper<RechargeResponseDto>.Get("");
            watch.Stop();
            double elapsedMs  = watch.ElapsedMilliseconds;
            var    collection = new RechargeCollection();
            collection.Id         = recharge.MasterId;
            collection.Status.Id  = result.ResultCode == SharedParams.SuccessPaymentCode ? 1 : 2;
            collection.RefNo      = result.ResultCode.ToString();
            collection.RefMessage = result.ResultDesc;
            collection.RefTransNo = result.TransNo;
            collection.RefTime    = DateTime.Now;
            collection.DebugInfo  = result.ResultDesc + " OCS(" + elapsedMs + ")";
            resultDisplayMsg      = collection.DebugInfo;
            elapsedMs             = 0;
            watch = System.Diagnostics.Stopwatch.StartNew();
            var dbResult = new RechargeRepo(db, null).UpdateWithBalance(collection);
            watch.Stop();
            elapsedMs         = watch.ElapsedMilliseconds;
            resultDisplayMsg += " DB(" + elapsedMs + ")";
            return(result);

            #endregion
        }
예제 #3
0
        public async Task <IActionResult> Pay(TopupDto topup)
        {
            if (!Utility.ValidYMobileNo(topup.subsNo))
            {
                return(BadRequest(new ApiResponse(-3000, "Sorry, the target mobile was wrong")));
            }
            var currentUser = _partnerManager.GetPartnerById(this.HttpContext.User.Identity.Name);
            var recharge    = new RechargeCollection();

            recharge.SubscriberNo     = topup.subsNo;
            recharge.Amount           = topup.amt;
            recharge.PointOfSale      = currentUser;
            recharge.QueueNo          = 0;
            recharge.AccessChannel.Id = "api";
            recharge.ApiTransaction   = topup.seq;
            var result = new RechargeRepo(_db, _partnerManager).Create(recharge);

            if (!result.Success)
            {
                if (result.AffectedCount == -513)
                {
                    return(Unauthorized(new ApiResponse(-3003, "Sorry, undefined rule")));
                }
                if (result.AffectedCount == -501)
                {
                    return(BadRequest(new ApiResponse(-3004, $"Sorry, your balance was not enough {(currentUser.Balance - currentUser.Reserved).ToString("N0")}")));
                }
                if (result.AffectedCount == -502)
                {
                    return(BadRequest(new ApiResponse(-3005, $"Sorry, amount less than min limit")));
                }
                if (result.AffectedCount == -503)
                {
                    return(BadRequest(new ApiResponse(-3006, "Sorry, amount more than max limit")));
                }
                if (result.AffectedCount == -511)
                {
                    return(BadRequest(new ApiResponse(-3007, "Sorry, your account was invalid")));
                }
                if (result.AffectedCount == -512)
                {
                    return(BadRequest(new ApiResponse(-3008, "Sorry, inconsistent data")));
                }
                if (result.AffectedCount == -514)
                {
                    return(BadRequest(new ApiResponse(-3009, $"Sorry, duplicated sequence {topup.seq}")));
                }
                if (result.AffectedCount == -515)
                {
                    return(BadRequest(new ApiResponse(-3010, $"Sorry, amount not allowed")));
                }
                return(BadRequest(new ApiResponse(500, $"Sorry, {result.Error}")));
            }
            recharge.Id = result.AffectedCount;
            // call web service
            var endpoint      = _config["OCS:Endpoint"];
            var apiUser       = _config["OCS:User"];
            var apiPassword   = _config["OCS:Password"];
            var remoteAddress = _config["OCS:RemoteAddress"];
            var successCode   = _config["OCS:SuccessCode"];
            var watch         = System.Diagnostics.Stopwatch.StartNew();
            var payResult     = await new TopupService(_db, _partnerManager).DoRecharge(recharge, endpoint, apiUser, apiPassword, remoteAddress, successCode);

            watch.Stop();
            double elapsedMs = watch.ElapsedMilliseconds;

            payResult.DebugInfo = payResult.RefMessage + " OCS(" + elapsedMs + ")";
            var dbResult = new RechargeRepo(_db, null).UpdateWithBalance(payResult);

            if (!dbResult.Success)
            {
                _logger.LogError($"EMERGENCY-CHECk PayId={payResult.Id} {dbResult.Error}");
            }
            if (payResult.Status.Id == 1)
            {
                new NotificationRepo(_db, _partnerManager).SendNotification("Recharge.Create", payResult.Id, payResult, 1);
            }
            var finalResult = JsonSerializer.Serialize(new
            {
                resultCode = payResult.Status.Id == 1 ? 0 : payResult.Status.Id,
                resultDesc = payResult.RefMessage,
                sequence   = payResult.ApiTransaction,
                payId      = recharge.Id,
                duration   = elapsedMs
            });

            return(Ok(finalResult));
        }
예제 #4
0
        public IActionResult Index(RechargeQuery model, [FromQuery(Name = "direction")] string direction)
        {
            model.Error = string.Empty;

            var currUserId    = partner.GetCurrentUserId(this.HttpContext);
            var currRoleId    = partner.GetCurrentUserRole(this.HttpContext);
            var currAccountId = partner.GetCurrentUserAccount(this.HttpContext);
            var permission    = partnerActivity.GetPartAct("Recharge.Query", currRoleId);

            if (permission == null || permission.Details == null)
            {
                toastNotification.AddErrorToastMessage("ليس لديك الصلاحية الكافية", new ToastrOptions {
                    Title = ""
                });
                model.Statuses      = new CommonCodeRepo(db).GetCodesByType("Collection.Status");
                model.AccessChannel = new CommonCodeRepo(db).GetCodesByType("access.channel");
                return(View(model));
            }
            if (permission.Scope.Id == "CurOpOnly")
            {
                if (!string.IsNullOrEmpty(model.QPosId) && model.QPosId != currUserId)
                {
                    toastNotification.AddErrorToastMessage("ليس لديك الصلاحيات الكافية للاستعلام عن هذا الرقم", new ToastrOptions {
                        Title = ""
                    });
                    model.Statuses      = new CommonCodeRepo(db).GetCodesByType("Collection.Status");
                    model.AccessChannel = new CommonCodeRepo(db).GetCodesByType("access.channel");
                    return(View(model));
                }
                else if (model.QPosAccount > 0 && model.QPosAccount != currAccountId)
                {
                    toastNotification.AddErrorToastMessage("ليس لديك الصلاحيات الكافية للاستعلام عن هذا الحساب", new ToastrOptions {
                        Title = ""
                    });
                    model.Statuses      = new CommonCodeRepo(db).GetCodesByType("Collection.Status");
                    model.AccessChannel = new CommonCodeRepo(db).GetCodesByType("access.channel");
                    return(View(model));
                }
            }
            ModelState.Clear();
            if (direction == "pre" && model.Paging.PageNo > 1)
            {
                model.Paging.PageNo -= 1;
            }
            if (direction == "next")
            {
                model.Paging.PageNo += 1;
            }
            model.QueryScope         = permission.Scope.Id;
            model.CurrentUserId      = currUserId;
            model.CurrentUserAccount = currAccountId;
            var result = new RechargeQuery();

            result               = new RechargeRepo(db, partner).QueryWithPaging(model);
            result.Statuses      = new CommonCodeRepo(db).GetCodesByType("Collection.Status");
            result.AccessChannel = new CommonCodeRepo(db).GetCodesByType("access.channel");
            if (result.Results == null)
            {
                toastNotification.AddInfoToastMessage("عذرا لا توجد بيانات", new ToastrOptions {
                    Title = ""
                });
            }
            if (result != null && result.Results != null)
            {
                model.Paging.Count = new RechargeRepo(db, partner).GetCount(model);
            }
            else
            {
                model.Paging.Count = 0;
            }

            return(View(result));
        }
예제 #5
0
        public IActionResult Detail(int id)
        {
            var model = new RechargeRepo(db, partner).GetRecharge(id);

            return(View(model));
        }