/// <summary>
        /// 获取支付时使用的Html
        /// 交易不存在等错误发生时返回错误信息
        /// </summary>
        public virtual HtmlString GetPaymentHtml(long transactionId)
        {
            // 获取交易和支付接口
            PaymentTransaction transaction = null;
            PaymentApi         api         = null;

            UnitOfWork.ReadData <PaymentTransaction>(r => {
                transaction = r.GetById(transactionId);
                api         = transaction == null ? null : transaction.Api;
                var _       = api == null ? null : api.Type;           // 在数据库连接关闭前抓取类型
            });
            // 检查交易和接口是否存在
            if (transaction == null)
            {
                return(BuildErrorHtml(new T("Payment transaction not found")));
            }
            else if (api == null)
            {
                return(BuildErrorHtml(new T("Payment api not exist")));
            }
            // 检查当前登录用户是否可以支付
            var result = transaction.Check(c => c.IsPayerLoggedIn);

            if (!result.First)
            {
                return(BuildErrorHtml(result.Second));
            }
            result = transaction.Check(c => c.IsPayable);
            if (!result.First)
            {
                return(BuildErrorHtml(result.Second));
            }
            // 调用接口处理器生成支付html
            var html     = new HtmlString("No Result");
            var handlers = api.GetHandlers();

            handlers.ForEach(h => h.GetPaymentHtml(transaction, ref html));
            return(html);
        }
        /// <summary>
        /// 获取显示交易结果的Html
        /// </summary>
        public void GetResultHtml(PaymentTransaction transaction, IList <HtmlString> html)
        {
            // 显示内容
            // 根据订单状态显示
            // - WaitingBuyerPay: 订单创建成功,请付款
            // - WaitingSellerSendGoods: 您已付款成功,请等待卖家发货
            // - WaitingBuyerConfirm: 卖家已发货,请在收到货物后确认收货
            // - Success: 订单交易成功,感谢您的惠顾
            // - Cancelled: 订单已取消
            // - Invalid: 订单已作废
            // 订单编号: {编号} 订单金额: {金额} 账单金额: {金额}
            // [[使用{接口}支付]]

            // 获取关联订单
            var templateManager    = Application.Ioc.Resolve <TemplateManager>();
            var sellerOrderManager = Application.Ioc.Resolve <SellerOrderManager>();
            var sellerOrder        = sellerOrderManager.Get(transaction.ReleatedId ?? Guid.Empty);

            if (sellerOrder == null)
            {
                html.Add(new HtmlString(templateManager.RenderTemplate(
                                            "shopping.order/order_checkout.html", null)));
                return;
            }
            // 可支付时,显示支付按钮跳转到支付页面
            // 不可支付时,跳转到订单详情页(按流水号而不是买家订单Id)
            var transactionManager = Application.Ioc.Resolve <PaymentTransactionManager>();
            var currencyManager    = Application.Ioc.Resolve <CurrencyManager>();

            html.Add(new HtmlString(templateManager.RenderTemplate(
                                        "shopping.order/order_checkout.html", new {
                orderSerial = sellerOrder.Serial,
                orderState  = sellerOrder.State.ToString(),
                orderAmount = currencyManager
                              .GetCurrency(sellerOrder.Currency).Format(sellerOrder.TotalCost),
                transactionAmount = currencyManager
                                    .GetCurrency(transaction.CurrencyType).Format(transaction.Amount),
                isPayable  = transaction.Check(x => x.IsPayable).First,
                apiName    = new T(transaction.Api.Name),
                paymentUrl = transactionManager.GetPaymentUrl(transaction.Id)
            })));
        }
        /// <summary>
        /// 获取显示交易结果的Html
        /// </summary>
        public override void GetResultHtml(PaymentTransaction transaction, IList <HtmlString> html)
        {
            // 显示内容
            // 如果交易本身不可支付
            // - 如果交易已支付,延迟跳转到订单列表
            // - 否则显示交易状态信息
            // 如果交易本身可支付
            // - 如果所有订单可支付,则显示支付按钮
            // - 否则显示交易状态信息
            var templateManager    = Application.Ioc.Resolve <TemplateManager>();
            var currencyManager    = Application.Ioc.Resolve <CurrencyManager>();
            var transactionManager = Application.Ioc.Resolve <PaymentTransactionManager>();
            var orderManager       = Application.Ioc.Resolve <SellerOrderManager>();
            var orderIds           = transaction.ReleatedTransactions.Select(t => t.ReleatedId);
            var orders             = orderManager
                                     .GetMany(o => orderIds.Contains(o.Id))
                                     .Select(o => new {
                id      = o.Id,
                serial  = o.Serial,
                state   = o.State.ToString(),
                amount  = currencyManager.GetCurrency(o.Currency).Format(o.TotalCost),
                payable = o.Check(c => c.CanPay).First
            })
                                     .ToList();

            html.Add(new HtmlString(templateManager.RenderTemplate(
                                        "shopping.order/order_checkout_merged.html", new {
                transactionSerial = transaction.Serial,
                transactionState  = transaction.State.ToString(),
                transactionAmount = currencyManager
                                    .GetCurrency(transaction.CurrencyType).Format(transaction.Amount),
                orders            = orders,
                isPayable         = transaction.Check(x => x.IsPayable).First,
                isAllOrderPayable = orders.Any() && orders.All(o => o.payable),
                apiName           = new T(transaction.Api.Name),
                paymentUrl        = transactionManager.GetPaymentUrl(transaction.Id)
            })));
        }