Ejemplo n.º 1
0
        /// <summary>
        /// Логирует полученный от Мобикома ответ на запрос инициализации платежа
        /// </summary>
        /// <param name="response">Полученный ответ</param>
        /// <returns>Заведенная в БД запись</returns>
        private MobicomMessage LogMobicomStartResponse(MobicomStartResponse response)
        {
            var logEntry = _storage.MobicomMessages.CreateObject();

            logEntry.Id            = Guid.NewGuid();
            logEntry.CreateTime    = DateTime.Now;
            logEntry.Method        = "MobicomStartResponseOperation";
            logEntry.Action        = "Response";
            logEntry.OwnerId       = Truncate(response.Owner.id, 50);
            logEntry.Version       = Truncate(response.version, 10);
            logEntry.ResultCode    = Truncate(response.Result.code.ToString(), 10);
            logEntry.ResultComment = Truncate(response.Result.comment, 255);

            _storage.MobicomMessages.AddObject(logEntry);

            return(logEntry);
        }
Ejemplo n.º 2
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();
            }
        }
Ejemplo n.º 3
0
        public int SendPaymentToMobicom(string phoneNumber, long moneyCount, Guid operatorBrand)
        {
            try
            {
                // Отключаем проверку сертификатов путем замены класса проверки сертификатов на пустой
#pragma warning disable 612,618
                ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
#pragma warning restore 612,618

                // Создаем клиентское подключение к сервису Мобиком
                var cc = new mobicomTypeClient("BasicHttpBinding_MobicomService");

                // Основные параметры подключения
                // ****************************************************************
                var a = new Agregator {
                    id = 29
                };
                var m = new Merchant {
                    id = 6889
                };
                const string sVersion  = "1.0";
                const string sPassword = "******";


                // Переменные параметры подключения
                // ****************************************************************
                var p = new Phone {
                    number = phoneNumber
                };
                //p.provider = 3; // 1 — «Вымпелком», 2 — «Мобильные Телесистемы», 3 — «Мегафон»

                var c = new Client {
                    Phone = p
                };

                var pt = new Payment {
                    currency = 643, amount = moneyCount
                };

                var ms = new Message
                {
                    bill    = DateTime.Now.Ticks.ToString(CultureInfo.InvariantCulture).Substring(1, 10),
                    comment = "Test"
                };

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

                // ****************************************************************

                //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                // Создаем и инициализируем объект MobicomStartRequest для быстрой регистрации запроса на стороне Мобиком
                //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                var r = new MobicomStartRequest
                {
                    Agregator = a,
                    Merchant  = m,
                    Client    = c,
                    version   = sVersion,
                    Owner     = o,
                    Payment   = pt,
                    Message   = ms
                };

                // Генерируем Хэш-Код для  MobicomStartExpressRequest (1)Owner.id, 2)Client.Phone.number, 3)Client.Phone.provider, 4)Payment.amount, 5)Payment.currency, 6)Message.bill, 7)Message.comment, 8)секретный пароль Агрегатора.)
                string ss = r.Owner.id + r.Client.Phone.number + r.Client.Phone.provider.ToString() + r.Payment.amount.ToString() + r.Payment.currency.ToString() + r.Message.bill + r.Message.comment + sPassword;
                r.hash = GetHash(ss);

                // Регистрируем запрос в Мобиком и получаем статус выполнения запроса.
                MobicomStartResponse resp = cc.MobicomStartRequestOperation(r);
                //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                if (resp.Result.code != null)
                {
                    return(resp.Result.code.Value);
                }
            }


            catch
            {
                return(-1);
            }

            return(-1);
        }