public void GetActualTransactionTest() { var wmTransferCache = new WebMoneyTransferCache(100, MoqPaymentAccessor.MakeMoq().Object); var r1 = wmTransferCache.GetActualTransaction(); //Первое обращение на 3 месяца назад Assert.NotNull(r1); Assert.AreEqual(1, r1.Count); var r2 = wmTransferCache.GetActualTransaction(); // Второе обращение на 30 секунд назад Assert.NotNull(r2); Assert.AreEqual(0, r2.Count); MoqPaymentAccessor.AddNewTransfer(); //Поступил новый платёж за последние 30 секунд var r3 = wmTransferCache.GetActualTransaction(); // Второе обращение на 30 секунд назад Assert.NotNull(r3); Assert.AreEqual(1, r3.Count); wmTransferCache.LastRequestDate = dateTimeNow.AddMonths(-5); // Неадекватные дата и Id предыдущей транзакции зечисления - должен запросить за 3 месяца wmTransferCache.LastRequestTransferId = 5; var r4 = wmTransferCache.GetActualTransaction(); Assert.NotNull(r4); Assert.AreEqual(2, r4.Count); // Неадекватные дата (она выправиться в логике "GetActualTransaction"), но адекватный Id предыдущего трансвера зачисления - // должен выбрать все транзакции ПОСЛЕ указанной (948396383). На данный момент будет выбрана только одна // т.к. всего транзакций на зачисление - две (первая указана - вторую вернёт). wmTransferCache.LastRequestDate = dateTimeNow.AddMonths(-5); wmTransferCache.LastRequestTransferId = 959076445; var r5 = wmTransferCache.GetActualTransaction(); Assert.NotNull(r5); Assert.AreEqual(1, r5.Count); Assert.AreEqual(959076446, r5[0].Id); wmTransferCache.LastRequestDate = new DateTime(3000,1,1); // генерируем исключение var r6 = wmTransferCache.GetActualTransaction(); Assert.IsNull(r6); wmTransferCache.LastRequestDate = new DateTime(2014, 1, 1, 0, 0, 0); // запрашиваем за дату в которой нет транзакций. var r7 = wmTransferCache.GetActualTransaction(); Assert.NotNull(r7); Assert.AreEqual(0, r7.Count); }
/// <summary> /// запрос к серверам WebMoney /// </summary> private void RequestWalletLoop() { var currentIteration = 0; while (!isStopping) { Thread.Sleep(ThreadSleepMilliseconds); currentIteration++; if (currentIteration < wmTransferCache.countIterationToRequest) { continue; } currentIteration = 0; var transfers = wmTransferCache.GetActualTransaction(); if (transfers != null && transfers.Count > 0) { foreach (var upTransfer in transfers) { Logger.Info(string.Format( "Поступил платёж с WebMoney, в размере {3} {5}. WmId плательщика {2}. Wm кошелёк плательщика {1}. № транзакции {0}." + "Дополнительные сведения: {4}", upTransfer.Id, upTransfer.SourcePurse, upTransfer.Partner, upTransfer.Amount, upTransfer.Description, WebMoneyUtil.CurrencyToStr(upTransfer.SourcePurse.Type))); var commentString = upTransfer.Description.ToString().Trim(); if (!string.IsNullOrEmpty(commentString)) { var wId = GetTradeSharpeWalletIdByLogin(commentString); if (wId.HasValue && TradeSharpServer.Instance.proxy.DepositOnWallet(wId.Value, WebMoneyUtil.CurrencyToStr(upTransfer.TargetPurse.Type), upTransfer.Amount, DateTime.Now)) { Logger.Info(string.Format("Кошелёк {0} пополнен через реквизиты комментария", upTransfer.SourcePurse)); continue; } } #region Сериализация для передачи в параметре "strRequisites" string strRequisites; var serializer = new XmlSerializer(upTransfer.GetType()); using (var writer = new StringWriter()) { serializer.Serialize(writer, upTransfer); strRequisites = writer.ToString(); } #endregion // то что пришло в комментарии, не удалось применить для опознавания кошелька T# // Начинаем действовать исходя из реквизитов транзакции var walletId = GetTradeSharpeWalletIdByPaySysRequisite(PaymentSystem.WebMoney, upTransfer.Partner.ToString(), upTransfer.SourcePurse.ToString()); if (walletId != null) { if (TradeSharpServer.Instance.proxy.DepositOnWallet(walletId.Value, WebMoneyUtil.CurrencyToStr(upTransfer.TargetPurse.Type), upTransfer.Amount, DateTime.Now)) { Logger.Info(string.Format("T# кошелёк {0} пополнен через поиск по БД", walletId.Value)); } else { Logger.Error(string.Format("T# кошелёк плательщика опознан как {0}, но провести платёж не удалось.", walletId.Value)); ReportOnFailPayment(WebMoneyUtil.CurrencyToStr(upTransfer.TargetPurse.Type), upTransfer.Amount, DateTime.Now, PaymentSystem.WebMoney, strRequisites); } } else { Logger.Info("Не удалось опознать кошелёк T# никакими способами"); ReportOnFailPayment(WebMoneyUtil.CurrencyToStr(upTransfer.TargetPurse.Type), upTransfer.Amount, DateTime.Now, PaymentSystem.WebMoney, strRequisites); } } } } }