/// <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)); } }