private static string GenerateSign(TradeJournal tradeJournal, PaymentCredential credential) { var factorParams = new string[] { PaymentSalt, tradeJournal.TradeCode, tradeJournal.TradeMode.ToString(), tradeJournal.PayWay, tradeJournal.BizSource, tradeJournal.CommodityCategory, tradeJournal.CommodityCode, tradeJournal.CommodityQuantity.ToString(), tradeJournal.CommoditySubject, tradeJournal.TotalFee.ToString(), credential.ToJson() }.OrderBy(x => x).ToArray(); var text = string.Join("", factorParams); using (var algorithmProvider = SHA1.Create()) { byte[] hashed = algorithmProvider.ComputeHash(Encoding.UTF8.GetBytes(text)); StringBuilder sBuilder = new StringBuilder(); for (int i = 0; i < hashed.Length; i++) { sBuilder.Append(hashed[i].ToString("X2")); } return(sBuilder.ToString()); } }
/// <summary> /// /// </summary> /// <returns></returns> public bool Save() { var tradeJournal = TradeJournal.FindById(this.TradeCode); if (null == tradeJournal) { return(false); } if (tradeJournal.TradeStatus >= TradeStatus.Paid) { return(true); } this.OwnerId = tradeJournal.OwnerId; this.CredentialSign = null; this.PaidTime = DateTime.Now; this.CredentialSign = GenerateSign(tradeJournal, this); using (var scope = new System.Transactions.TransactionScope()) { var repository = RepositoryManager.GetRepository <IPaymentCredentialRepository>(ModuleEnvironment.ModuleName); var saved = repository.Save(this); if (saved) { tradeJournal.PayWay = this.PaidWay; tradeJournal.TradeStatus = TradeStatus.Paid; saved = tradeJournal.Save(); scope.Complete(); } return(saved); } }
/// <summary> /// /// </summary> /// <param name="payment"></param> /// <returns></returns> internal static TradeJournal CreateNew(Payment payment) { payment.AssertNotNull("payment"); payment.CommoditySubject.AssertNotNull("payment:CommoditySubject"); payment.TradeType.AssertNotNull("payment:TradeType"); var tradeJournal = new TradeJournal(); tradeJournal.TradeCode = string.Concat(tradeJournal.CreatedTime.ToString("yyyyMMddHHmmssfff") , new Random().Next(1000000, 9999999)); tradeJournal.ParentTradeCode = payment.ParentTradeCode; tradeJournal.OwnerId = payment.OwnerId; tradeJournal.ClientIP = payment.ClientIP; tradeJournal.TradeType = payment.TradeType; tradeJournal.TradeMode = payment.TradeMode; tradeJournal.PayWay = payment.PayWay; tradeJournal.PayRoute = payment.PayRoute; tradeJournal.BizSource = payment.BizSource; tradeJournal.CommodityCategory = payment.CommodityCategory; tradeJournal.CommodityCode = payment.CommodityCode; tradeJournal.CommodityQuantity = payment.CommodityQuantity; tradeJournal.CommoditySubject = payment.CommoditySubject; tradeJournal.CommoditySummary = payment.CommoditySummary; tradeJournal.CommodityExtension = payment.CommodityExtension; tradeJournal.ReturnUrl = payment.ReturnUrl; tradeJournal.TotalFee = payment.TotalFee; tradeJournal.TradeStatus = TradeStatus.New; tradeJournal.BuyerId = payment.BuyerId; tradeJournal.SellerId = payment.SellerId; tradeJournal.ClientIP = payment.ClientIP; tradeJournal.Save(); return(tradeJournal); }
/// <summary> /// /// </summary> /// <param name="tradeJournal"></param> /// <returns></returns> public static PaymentResult Refund(TradeJournal tradeJournal) { if (null == tradeJournal) { return(null); } if (tradeJournal.TradeMode != TradeMode.Payoff) { return(null); } if (tradeJournal.TradeStatus >= TradeStatus.Paid) { return(null); } var walletType = WalletType.Privateness; if (tradeJournal.TradeType == TradeType.OrganizationToOrganization || tradeJournal.TradeType == TradeType.PersonalToOrganization) { walletType = WalletType.Organization; } var wallet = Wallet.FindByOwnerId(walletType, tradeJournal.OwnerId); if (null == wallet) { return(null); } var result = ChangeBalance(wallet, TradeMode.Payoff, tradeJournal.TotalFee, tradeJournal.TradeCode, tradeJournal.BizSource, tradeJournal.BuyerId); result.TradeCode = tradeJournal.TradeCode; return(result); }
/// <summary> /// /// </summary> /// <param name="ownerId"></param> /// <param name="toTradeCode"></param> /// <returns></returns> public static PaymentResult Pay(long ownerId, string toTradeCode) { var tradeJournal = TradeJournal.FindById(toTradeCode); if (null == tradeJournal) { return(null); } if (tradeJournal.TradeMode != TradeMode.Payout) { return(null); } if (tradeJournal.TradeStatus >= TradeStatus.Paid) { return(null); } var walletType = WalletType.Privateness; if (tradeJournal.TradeType == TradeType.OrganizationToOrganization || tradeJournal.TradeType == TradeType.OrganizationToPersonal) { walletType = WalletType.Organization; } var wallet = Wallet.FindByOwnerId(walletType, tradeJournal.OwnerId); if (null == wallet || wallet.AvailableBalance < Math.Abs(tradeJournal.TotalFee)) { return(null); } if (wallet.OwnerId != ownerId) { return(null); } var result = ChangeBalance(wallet, TradeMode.Payout, tradeJournal.TotalFee, tradeJournal.TradeCode, tradeJournal.BizSource, tradeJournal.BuyerId); result.TradeCode = toTradeCode; return(result); }
/// <summary> /// /// </summary> /// <param name="walletType"></param> /// <param name="ownerId"></param> /// <param name="fromTradeCode"></param> /// <returns></returns> public static PaymentResult AddBalance(WalletType walletType, long ownerId, string fromTradeCode) { if (walletType == WalletType.All) { return(null); } var tradeJournal = TradeJournal.FindById(fromTradeCode); if (null == tradeJournal) { return(null); } if (tradeJournal.TradeMode != TradeMode.Payoff) { return(null); } if (tradeJournal.TradeStatus == TradeStatus.BizCompleted) { return(null); } if (tradeJournal.TradeStatus != TradeStatus.Paid && tradeJournal.PayWay != PayWays.System) { return(null); } Wallet wallet = Wallet.FindByOwnerId(walletType, ownerId); if (null == wallet) { wallet = new Wallet(); wallet.WalletType = walletType; wallet.OwnerId = ownerId; wallet.Save(); } var handlerId = tradeJournal.SellerId > 0 ? tradeJournal.SellerId : tradeJournal.BuyerId; return(ChangeBalance(wallet, TradeMode.Payoff, tradeJournal.TotalFee, tradeJournal.TradeCode, tradeJournal.BizSource, handlerId)); }