/// <summary> /// Логирует отправляемый Мобикому запрос на инициализацию платежа /// </summary> /// <param name="request">Отправлемый запрос</param> /// <param name="initialMessage">Запись в таблице ClientMessages, на оснолвании которой сформирован отправляемый запрос</param> /// <returns>Заведенная в БД запись</returns> private MobicomMessage LogMobicomStartRequest(MobicomStartRequest request, ClientMessage initialMessage) { var logEntry = _storage.MobicomMessages.CreateObject(); logEntry.ClientMessage = initialMessage; logEntry.Id = Guid.NewGuid(); logEntry.CreateTime = DateTime.Now; logEntry.Method = "MobicomStartRequestOperation"; logEntry.Action = "Request"; logEntry.AgreagatorId = Truncate(request.Agregator.id.ToString(), 10); logEntry.MerchantId = Truncate(request.Merchant.id.ToString(), 10); logEntry.OwnerId = Truncate(request.Owner.id, 50); logEntry.ClientPhoneNumber = Truncate(request.Client.Phone.number, 10); logEntry.ClientPhoneProvider = Truncate(request.Client.Phone.provider.ToString(), 3); logEntry.PaymentAmount = Truncate(request.Payment.amount.ToString(), 10); logEntry.PaymentCurrency = Truncate(request.Payment.currency.ToString(), 3); logEntry.MessageBill = Truncate(request.Message.bill, 10); logEntry.MessageComment = Truncate(request.Message.comment, 50); logEntry.Hash = Truncate(request.hash, 50); logEntry.Version = Truncate(request.version, 10); _storage.MobicomMessages.AddObject(logEntry); return(logEntry); }
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(); } }
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); }