Example #1
0
        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());
            }
        }
Example #2
0
        /// <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);
            }
        }
Example #3
0
        /// <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);
        }
Example #4
0
        /// <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);
        }
Example #5
0
        /// <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);
        }
Example #6
0
        /// <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));
        }