Пример #1
0
        static void Main(string[] args)
        {
            const string password = "******";

            //var p = new UniplatServiceWCFMobicom.UniplatServiceWCFMobicom();

            var client = new NS.UniplatService();//UniplatServiceClient();
            {
                Console.WriteLine("Sending DebitMoney");
                var paymentNumber = DateTime.Now.Ticks.ToString().Substring(1, 10);
                var reqBeeline    = new NS.ReqDebit()
                {
                    Amount        = 1000,
                    Comment       = "Test",
                    PartnerCode   = "tst",
                    ServiceId     = "13632",      //"6889",
                    MSISDN        = "9099952793", //"9035618208", //"9168036435",//"9099952793",//"9055812453",
                    PaymentNumber = paymentNumber,
                    PaymentId     = Guid.NewGuid().ToString()
                };

                var reqMts = new NS.ReqDebit()
                {
                    Amount        = 1500,
                    Comment       = "Test",
                    PartnerCode   = "tst",
                    ServiceId     = "6889",       //"6907",
                    MSISDN        = "9104501874", //"9521873493", //"9035618208", //"9168036435",//"9099952793",//"9055812453",
                    PaymentNumber = paymentNumber,
                    PaymentId     = Guid.NewGuid().ToString()
                };

                var req = reqMts;

                req.Hash = GetHash(req.PaymentId + req.PartnerCode + req.ServiceId + req.MSISDN + req.PaymentNumber +
                                   req.Amount + password);
                var resp = client.DebitMoney(req);
                if (resp.ResultCode == 0)
                {
                    Console.WriteLine("Succsessfull response received");
                    Console.WriteLine("Send state request?");
                    int x = 0;
                    while (Console.ReadLine() == "y") //(x ++ < 10)
                    {
                        var reqState = new NS.ReqState()
                        {
                            PaymentId = req.PaymentId, PartnerCode = "tst"
                        };
                        reqState.Hash = GetHash(reqState.PaymentId + reqState.PartnerCode + password);
                        resp          = client.GetDebitState(reqState);
                        Console.WriteLine(resp.ResultCode + " " + resp.ResultComment);
                    }
                }
                else
                {
                    Console.WriteLine("Bad request. Error code: " + resp.ResultCode);
                }
                Console.ReadKey();
            }
        }
Пример #2
0
        /// <summary>
        /// Создает и инициализирует объект Payment по поступившему от клиента запросу
        /// </summary>
        /// <param name="request">Переданный клиентом запрос</param>
        /// <returns>Объект частично описывающий совершаемый платеж</returns>
        private UniplatServiceData.Payment FillPaymentWithRequest(ReqDebit request)
        {
            var payment = _storage.Payments.CreateObject();

            payment.PaymentNumber = request.PaymentNumber;
            payment.MSISDN        = request.MSISDN ?? "NULL";
            payment.Amount        = request.Amount;
            payment.Currency      = CurrencyId;
            payment.SMSComment    = request.Comment;
            payment.MessageTime   = DateTime.Now;

            return(payment);
        }
Пример #3
0
        /// <summary>
        /// Запиывает в БД запрос ReqDebit клиента
        /// </summary>
        /// <param name="request">Переданный клиентом запрос</param>
        /// <returns>Добавленная в БД запись</returns>
        private ClientMessage LogReqDebit(ReqDebit request)
        {
            var logEntry = _storage.ClientMessages.CreateObject();

            logEntry.Id            = Guid.NewGuid();
            logEntry.CreateTime    = DateTime.Now;
            logEntry.Method        = "DebitMoney";
            logEntry.Action        = "Request";
            logEntry.PaymentId     = Truncate(request.PaymentId, 50);
            logEntry.PaymentNumber = Truncate(request.PaymentNumber, 10);
            logEntry.PartnerCode   = Truncate(request.PartnerCode, 3);
            logEntry.MSISDN        = Truncate(request.MSISDN, 10);
            logEntry.Amount        = Truncate(request.Amount.ToString(), 10);
            logEntry.Comment       = Truncate(request.Comment, 50);
            logEntry.OperatorCode  = Truncate(request.OperatorCode, 3);
            logEntry.ServiceId     = Truncate(request.ServiceId, 50);
            logEntry.Hash          = Truncate(request.Hash, 50);

            _storage.ClientMessages.AddObject(logEntry);

            return(logEntry);
        }
Пример #4
0
        public Resp DebitMoney(ReqDebit request)
        {
            Trace.WriteLine("ReqDebit for " + request.MSISDN + " amount=" + request.Amount);
            MobicomMessage           initialResponse        = null;
            Func <int, string, Resp> createAndSaveDebitResp =
                (code, comment) => CreateAndSaveResp(request.PaymentId, code, comment, "DebitMoney", initialResponse);

            try
            {
                // Если это тестовый режим, то ...
                if (ConfigurationManager.AppSettings["IsTesting"].ToLower() == "true")      // Если это тестовый режим, то ...
                {
                    #region Log
                    var initialRequest = LogReqDebit(request);
                    var payment        = FillPaymentWithRequest(request);

                    string wrongParameter;
                    Guid   paymentId;
                    if (!Guid.TryParse(request.PaymentId, out paymentId))
                    {
                        return(createAndSaveDebitResp(2, "Incorrect parameter: PaymentId"));
                    }
                    payment.Id = paymentId;

                    if (!request.CheckParametersRegex(out wrongParameter))
                    {
                        return(createAndSaveDebitResp(2, "Incorrect parameter: " + wrongParameter));
                    }

                    var partner = _storage.Partners.SingleOrDefault(p => p.Code == request.PartnerCode);
                    if (partner == null)
                    {
                        return(createAndSaveDebitResp(3, "Incorrect parameter: PartnerCode"));
                    }
                    payment.Partner = partner;

                    if (!request.CheckHashCode(partner.Password))
                    {
                        return(createAndSaveDebitResp(4, "Incorrect hash-value"));
                    }

                    var brand         = _storage.GetBrandByMSISDN("7" + request.MSISDN).Single();
                    var brandNotFound = brand.Id == Guid.Empty;

                    //Определяем агрегатора которому предназначен запрос
                    int merchOwnerId = int.Parse(request.ServiceId);

                    var merch2Op =
                        partner.Partner2Merchants.Select(p2m => p2m.Merchant)
                        .Where(m => m.Code == merchOwnerId)
                        .SelectMany(m => m.Merchants2Operators)
                        .SingleOrDefault(
                            m2o => m2o.BrandId == brand.Id && m2o.OperatorParameter.Active);
                    // Условие переделать

                    if (merch2Op == null)
                    {
                        return(createAndSaveDebitResp(3, "ServiceId"));
                    }

                    var merchant = merch2Op.Merchant;
                    payment.Merchant = merchant;

                    var bank        = merchant.Bank;
                    var agregatorId = bank.AgregarorId;

                    //-------------------------------------
                    //развилка по банкам/платежным системам
                    //-------------------------------------

                    if (brand.Id == MEGAPHONE_OPERATOR_BREND)
                    {
                        #region КиберПлат

                        var clnt = new CyberPlatClient();
                        var res  = clnt.PayRequest(request.MSISDN, merch2Op.OperatorParameter.Code.ToString(), request.Amount, request.ServiceId, request.PaymentNumber);
                        Debug.Print(res);
                        #endregion
                    }
                    else
                    {
                        #region Мобиком
                        // Основные параметры подключения к МобиКом
                        // ****************************************************************
                        var mobiAgregator = new Agregator {
                            id = agregatorId
                        };
                        var mobiMerchant = new MobicomLibrary.Merchant {
                            id = merchant.Code
                        };
                        // Переменные параметры подключения
                        // ****************************************************************
                        var mobiPhone = new Phone {
                            number = request.MSISDN, provider = merch2Op.OperatorParameter.Code
                        };
                        var mobyClient = new Client {
                            Phone = mobiPhone
                        };
                        var mobiPayment = new MobicomLibrary.Payment {
                            currency = CurrencyId, amount = request.Amount
                        };
                        _storage.Payments.AddObject(payment);
                        var mobiMessage = new Message
                        {
                            bill    = request.PaymentNumber,
                            comment = request.Comment
                        };

                        Owner mobiOwner = new Owner {
                            id = Guid.NewGuid().ToString().Replace("-", "")
                        };
                        // Идентификатор транзакции, заданный Агрегатором. (Регулярное выражение для проверки: ^[A-Za-z0-9]+$ ). Этот идентификатор должен быть уникальным в течении всего периода взаимодействия с системой Mobicom, причём в пределах обоих типов сообщений: MCStartReq и MCStartExReq.
                        payment.OwnerId = mobiOwner.id;
                        _storage.Payments.AddObject(payment);
                        //// Регистрируем запрос в Мобиком и получаем статус выполнения запроса.
                        //var mobiClient = new mobicomTypeClient();
                        //MobicomStartResponse resp = mobiClient.MobicomStartRequestOperation(mobiRequest);
                        //initialResponse = LogMobicomStartResponse(resp);
                        ////+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                        //if (resp.Result.code.HasValue && resp.Result.code.Value != 0)
                        //    return createAndSaveDebitResp(11, resp.Result.comment);
                        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                        // Создаем и инициализируем объект MobicomStartRequest для быстрой регистрации запроса на стороне Мобиком
                        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                        var mobiRequest = new MobicomStartRequest
                        {
                            Agregator = mobiAgregator,
                            Merchant  = mobiMerchant,
                            Client    = mobyClient,
                            version   = bank.ProtocolVersion,
                            Owner     = mobiOwner,
                            Payment   = mobiPayment,
                            Message   = mobiMessage
                        };

                        string ss = mobiRequest.Owner.id + mobiRequest.Client.Phone.number +
                                    mobiRequest.Client.Phone.provider.ToString() +
                                    mobiRequest.Payment.amount.ToString() + mobiRequest.Payment.currency.ToString() +
                                    mobiRequest.Message.bill +
                                    mobiRequest.Message.comment + bank.Password;
                        mobiRequest.hash = GetHash(ss);
                        LogMobicomStartRequest(mobiRequest, initialRequest);

                        // Регистрируем запрос в Мобиком и получаем статус выполнения запроса.
                        var mobiClient            = new mobicomTypeClient();
                        MobicomStartResponse resp = mobiClient.MobicomStartRequestOperation(mobiRequest);
                        initialResponse = LogMobicomStartResponse(resp);
                        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                        if (resp.Result.code.HasValue && resp.Result.code.Value != 0)
                        {
                            return(createAndSaveDebitResp(11, resp.Result.comment));
                        }

                        #endregion
                    }
                    return(createAndSaveDebitResp(0, ""));

                    //createAndSaveDebitResp(0, "");

                    #endregion

                    #region Emulation

                    //var eagregatorId = 33; // bank.AgregarorId;


                    // //Основные параметры подключения
                    // //****************************************************************
                    //var emobiAgregator = new ServiceEmulation.Agregator { id = eagregatorId };

                    //var emobiMerchant = new ServiceEmulation.Merchant { id = 6889 };

                    // //Переменные параметры подключения
                    // //****************************************************************
                    //var emobiPhone = new ServiceEmulation.Phone { number = request.MSISDN, provider = 2 };

                    //emobiPhone.provider = 3; // 1 — «Вымпелком», 2 — «Мобильные Телесистемы», 3 — «Мегафон»
                    //var emobClient = new ServiceEmulation.Client { Phone = emobiPhone }; //var mobyClient = new Client { Phone = mobiPhone };

                    //var emobiPayment = new ServiceEmulation.Payment { currency = CurrencyId, amount = request.Amount };

                    //var emobiMessage = new ServiceEmulation.Message
                    //{
                    //    bill = request.PaymentNumber,
                    //    comment = request.Comment
                    //};

                    //var emobiOwner = new ServiceEmulation.Owner { id = Guid.NewGuid().ToString().Replace("-", "") };
                    // //Идентификатор транзакции, заданный Агрегатором. (Регулярное выражение для проверки: ^[A-Za-z0-9]+$ ). Этот идентификатор должен быть уникальным в течении всего периода взаимодействия с системой Mobicom, причём в пределах обоих типов сообщений: MCStartReq и MCStartExReq.


                    ////+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                    //// Создаем и инициализируем объект MobicomStartRequest для быстрой регистрации запроса на стороне Мобиком
                    ////+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                    //var emobiRequest = new ServiceEmulation.MobicomStartRequest
                    //{
                    //    Agregator = emobiAgregator,
                    //    Merchant = emobiMerchant,
                    //    Client = emobClient,
                    //    version = "1.0", //bank.ProtocolVersion,
                    //    Owner = emobiOwner,
                    //    Payment = emobiPayment,
                    //    Message = emobiMessage
                    //};


                    //string ess = emobiRequest.Owner.id + emobiRequest.Client.Phone.number +
                    //            emobiRequest.Client.Phone.provider.ToString() +
                    //            emobiRequest.Payment.amount.ToString() + emobiRequest.Payment.currency.ToString() +
                    //            emobiRequest.Message.bill +
                    //            emobiRequest.Message.comment + "Qq12345678"; //+ bank.Password;
                    //emobiRequest.hash = GetHash(ess);
                    //LogMobicomStartRequest(mobiRequest, initialRequest);


                    //// Создаем слиентское подключение к сервису Мобиком
                    //var emobiClient = new ServiceEmulation.MobicomEmulationClient("BasicHttpBinding_IMobicomEmulation");

                    //// Регистрируем запрос в Мобиком и получаем статус выполнения запроса.
                    //ServiceEmulation.MobicomStartResponse eresp = emobiClient.MobicomStartRequestOperation(emobiRequest);

                    //return createAndSaveDebitResp(eresp.Result.code.GetValueOrDefault(0), eresp.Result.comment);

                    #endregion
                }
                else    // Иначе это боевой режим
                {
                    #region Pay
                    var initialRequest = LogReqDebit(request);
                    var payment        = FillPaymentWithRequest(request);

                    string wrongParameter;
                    Guid   paymentId;
                    if (!Guid.TryParse(request.PaymentId, out paymentId))
                    {
                        return(createAndSaveDebitResp(2, "Incorrect parameter: PaymentId"));
                    }
                    payment.Id = paymentId;

                    if (!request.CheckParametersRegex(out wrongParameter))
                    {
                        return(createAndSaveDebitResp(2, "Incorrect parameter: " + wrongParameter));
                    }

                    var partner = _storage.Partners.SingleOrDefault(p => p.Code == request.PartnerCode);
                    if (partner == null)
                    {
                        return(createAndSaveDebitResp(3, "Incorrect parameter: PartnerCode"));
                    }
                    payment.Partner = partner;

                    if (!request.CheckHashCode(partner.Password))
                    {
                        return(createAndSaveDebitResp(4, "Incorrect hash-value"));
                    }

                    var brand         = _storage.GetBrandByMSISDN("7" + request.MSISDN).Single();
                    var brandNotFound = brand.Id == Guid.Empty;

                    //Определяем агрегатора которому предназначен запрос
                    int merchOwnerId = int.Parse(request.ServiceId);

                    /*
                     * var merch2Op1 =
                     *  partner.Partner2Merchants.Select(p2m => p2m.Merchant).ToArray();
                     *
                     * var merch2Op2 =
                     *  partner.Partner2Merchants.Select(p2m => p2m.Merchant)
                     *         .Where(m => m.Code == merchOwnerId).ToArray();
                     *
                     * var merch2Op3 =
                     *  partner.Partner2Merchants.Select(p2m => p2m.Merchant)
                     *         .Where(m => m.Code == merchOwnerId)
                     *         .SelectMany(m => m.Merchants2Operators).ToArray();
                     */

                    var merch2Op =
                        partner.Partner2Merchants.Select(p2m => p2m.Merchant)
                        .Where(m => m.Code == merchOwnerId)
                        .SelectMany(m => m.Merchants2Operators)
                        .SingleOrDefault(
                            m2o => m2o.BrandId == brand.Id && m2o.OperatorParameter.Active);
                    // Условие переделать

                    if (merch2Op == null)
                    {
                        return(createAndSaveDebitResp(3, "ServiceId"));
                    }

                    var merchant = merch2Op.Merchant;
                    payment.Merchant = merchant;

                    var bank        = merchant.Bank;
                    var agregatorId = bank.AgregarorId;
                    // Основные параметры подключения
                    // ****************************************************************
                    var mobiAgregator = new Agregator {
                        id = agregatorId
                    };

                    var mobiMerchant = new MobicomLibrary.Merchant {
                        id = merchant.Code
                    };
                    // Переменные параметры подключения
                    // ****************************************************************
                    var mobiPhone = new Phone {
                        number = request.MSISDN, provider = merch2Op.OperatorParameter.Code
                    };

                    var mobyClient = new Client {
                        Phone = mobiPhone
                    };
                    var mobiPayment = new MobicomLibrary.Payment {
                        currency = CurrencyId, amount = request.Amount
                    };

                    var mobiMessage = new Message
                    {
                        bill    = request.PaymentNumber,
                        comment = request.Comment
                    };

                    Owner mobiOwner = new Owner {
                        id = Guid.NewGuid().ToString().Replace("-", "")
                    };
                    // Идентификатор транзакции, заданный Агрегатором. (Регулярное выражение для проверки: ^[A-Za-z0-9]+$ ). Этот идентификатор должен быть уникальным в течении всего периода взаимодействия с системой Mobicom, причём в пределах обоих типов сообщений: MCStartReq и MCStartExReq.
                    payment.OwnerId = mobiOwner.id;

                    _storage.Payments.AddObject(payment);


                    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                    // Создаем и инициализируем объект MobicomStartRequest для быстрой регистрации запроса на стороне Мобиком
                    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                    var mobiRequest = new MobicomStartRequest
                    {
                        Agregator = mobiAgregator,
                        Merchant  = mobiMerchant,
                        Client    = mobyClient,
                        version   = bank.ProtocolVersion,
                        Owner     = mobiOwner,
                        Payment   = mobiPayment,
                        Message   = mobiMessage
                    };

                    string ss = mobiRequest.Owner.id + mobiRequest.Client.Phone.number +
                                mobiRequest.Client.Phone.provider.ToString() +
                                mobiRequest.Payment.amount.ToString() + mobiRequest.Payment.currency.ToString() +
                                mobiRequest.Message.bill +
                                mobiRequest.Message.comment + bank.Password;
                    mobiRequest.hash = GetHash(ss);
                    LogMobicomStartRequest(mobiRequest, initialRequest);

                    // Регистрируем запрос в Мобиком и получаем статус выполнения запроса.
                    var mobiClient            = new mobicomTypeClient();
                    MobicomStartResponse resp = mobiClient.MobicomStartRequestOperation(mobiRequest);
                    initialResponse = LogMobicomStartResponse(resp);
                    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                    if (resp.Result.code.HasValue && resp.Result.code.Value != 0)
                    {
                        return(createAndSaveDebitResp(11, resp.Result.comment));
                    }

                    return(createAndSaveDebitResp(0, ""));

                    #endregion
                }
            }
            catch (Exception e)
            {
                Trace.WriteLine("Ошибка в DebitMoney: " + e);
                return(createAndSaveDebitResp(13, "UniplatService internal error"));
            }
            finally
            {
                TrySaveChanges();
            }
        }
Пример #5
0
 public Resp DebitMoney(ReqDebit request)
 {
     return(CreateRandomResp());
 }