예제 #1
0
 public MainWindow()
 {
     //9104501874
     //9854764020
     InitializeComponent();
     try
     {
         var a = new CyberPlatClient();
         //Debug.Print(a.PayRequest(null, null, 0, null));
         //Debug.Print(a.GetStatus());
         a.Done();
     }
     catch (Exception ex)
     {
         Debug.Print(ex.Message);
     }
 }
예제 #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();
            }
        }