예제 #1
0
        /// <summary>
        /// 处理微信返回的异步通知
        /// </summary>
        /// <param name="xml">微信发来的xml内容</param>
        /// <param name="transactionId">对应的交易Id</param>
        public virtual void ProcessNotify(string xml, out Guid transactionId)
        {
            // 解析xml判断是否错误
            var logManager = Application.Ioc.Resolve <LogManager>();
            var notifyData = new WxPayData();

            notifyData.FromXmlWithoutCheckSign(xml);
            if (notifyData.IsError)
            {
                transactionId = Guid.Empty;
                throw new WxPayException(notifyData.ErrMsg);
            }
            // 获取交易和接口,检查金额是否一致
            PaymentTransaction transaction;
            PaymentApi         api;

            WechatApiHandler.ApiData apiData;
            var outTradeNo         = notifyData.GetValue("out_trade_no") as string;   // 交易流水号
            var tradeNo            = notifyData.GetValue("transaction_id") as string; // 微信上的订单编号
            var paidAmount         = notifyData.GetValue("total_fee");                // 支付的金额
            var transactionManager = Application.Ioc.Resolve <PaymentTransactionManager>();

            using (UnitOfWork.Scope()) {
                transaction = transactionManager.Get(t => t.Serial == outTradeNo);
                if (transaction == null)
                {
                    throw new ArgumentException(new T("Transaction with serial '{0}' not exist", outTradeNo));
                }
                else if (transaction.Amount != paidAmount.ConvertOrDefault <decimal>() / 100.0M)
                {
                    throw new ArgumentException(new T(
                                                    "Transaction amount not matched, excepted '{0}' but actual is '{1}'",
                                                    transaction.Amount, paidAmount));
                }
                transactionId = transaction.Id;
                api           = transaction.Api;
                apiData       = transaction.Api.ExtraData
                                .GetOrDefault <WechatApiHandler.ApiData>("ApiData") ??
                                new WechatApiHandler.ApiData();
            }
            var config = new WxPayConfig(apiData);

            // 检查签名是否合法
            notifyData.CheckSign(config);
            // 根据返回状态处理交易
            var tradeState = notifyData.GetValue("trade_state") as string;

            if (tradeState == "SUCCESS")
            {
                // 交易成功
                transactionManager.Process(transactionId, tradeNo, PaymentTransactionState.Success);
            }
            else if (tradeState == "REFUND" || tradeState == "REVOKED" || tradeState == "PAYERROR")
            {
                // 交易中止
                transactionManager.Process(transactionId, tradeNo, PaymentTransactionState.Aborted);
                transactionManager.SetLastError(transaction.Id, new T("Buyer closed transaction on wechat"));
            }
            else if (tradeState == "NOTPAY" || string.IsNullOrEmpty(tradeState))
            {
                // 未支付
            }
            else if (tradeState == "USERPAYING" || tradeState == "PAYERROR")
            {
                // 支付中
                transactionManager.Process(transactionId, tradeNo, PaymentTransactionState.WaitingPaying);
            }
            else
            {
                // 交易中止, 未知的状态
                transactionManager.Process(transactionId, tradeNo, PaymentTransactionState.Aborted);
                transactionManager.SetLastError(transactionId, new T(
                                                    "Unknown wechat trade status '{0}'", tradeState));
            }
        }