public NormalResult Notify(string xml, AuthorizerPayConfig config) { _log.Write("收到支付结果通知", xml, TraceEventType.Verbose); NormalResult result = new NormalResult(); WxPayArgs wxPayArgs = config.GetWxPayArgs(false); RequestPayApiResult <WeixinPayNotify> notifyResult = WxPayApi.Notify(xml, wxPayArgs); if (notifyResult.Success == false) { _log.Write("支付结果通知显示失败", notifyResult.Message, TraceEventType.Verbose); result.Success = false; result.Message = notifyResult.Message; return(result); } WeixinPayNotify notify = notifyResult.ApiResult; Guid payOrderId; if (Guid.TryParse(notify.Attach, out payOrderId) == false) { string attacth = String.Empty; if (notify.Attach != null) { attacth = notify.Attach; } _log.Write("Attach 无法转为本地订单Id" + attacth, notify.OutTradeNo, TraceEventType.Verbose); result.Success = false; result.Message = "Attach 无法转为本地订单Id。" + attacth; return(result); } bool updateNotifyStatus = UpdateNotifyStatus(payOrderId); if (updateNotifyStatus == false) { //已经处理过了 //处理过的还是返回true,防止微信服务器反复推送通知 //微信文档上说通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒 //但是实测支付成功后连续推送通知过来 result.Success = true; result.Message = "已经接收到过此订单的支付通知。"; return(result); } SqlStructureBuild sqlBuild = new SqlStructureBuild(); sqlBuild.Table = "PayOrder"; sqlBuild.Type = SqlExpressionType.Update; sqlBuild.AddParameter("Id", payOrderId, true); sqlBuild.AddParameter("Notify", true); if (notify.ReturnCode == "SUCCESS" && notify.ResultCode == "SUCCESS") { sqlBuild.AddParameter("TradeState", EnumPayTradeState.SUCCESS); } else { sqlBuild.AddParameter("TradeState", EnumPayTradeState.PAYERROR); } sqlBuild.AddParameter("BankType", notify.BankType); sqlBuild.AddParameter("FeeType", notify.FeeType); sqlBuild.AddParameter("CouponFee", notify.CouponFee); sqlBuild.AddParameter("CouponCount", notify.CouponCount); sqlBuild.AddParameter("TransactionId", notify.TransactionId); sqlBuild.AddParameter("TimeEnd", WeixinApiHelper.ConvertStringToDateTime(notify.TimeEnd)); sqlBuild.AddParameter("Notify_ReturnCode", notify.ReturnCode); sqlBuild.AddParameter("Notify_ReturnMsg", notify.ReturnMsg); sqlBuild.AddParameter("Notify_ResultCode", notify.ResultCode); sqlBuild.AddParameter("Notify_ErrCode", notify.ErrCode); sqlBuild.AddParameter("Notify_ErrCodeDes", notify.ErrCodeDes); int affectedRowCount = _dataBase.ExcuteSqlExpression(sqlBuild.GetSqlExpression()); if (affectedRowCount == 0) { _log.Write("本地订单不存在", notify.OutTradeNo, TraceEventType.Verbose); result.Success = false; result.Message = "本地订单不存在。"; return(result); } PayOrderEntity payOrder = GetPayOrder(payOrderId); if (notify.CouponCount > 0) { foreach (WeixinPayNotify_Coupon coupon in notify.CouponList) { coupon.PayOrderId = payOrder.Id; _dataBase.Insert(coupon); } } if (notify.ReturnCode == "SUCCESS" && notify.ResultCode == "SUCCESS") { switch (payOrder.Type) { case EnumPayOrderType.Unknow: _log.Write("收到支付结果通知", "未知订单类型", TraceEventType.Warning); break; case EnumPayOrderType.Deposit: ProcessDepositPayNotify(payOrder); break; case EnumPayOrderType.PointCommodity: ProcessPointCommodityPayNotify(payOrder); break; case EnumPayOrderType.Donation: ProcessDonationPayNotify(payOrder); break; default: _log.Write("收到支付结果通知", "订单类型未处理:" + payOrder.Type.ToString(), TraceEventType.Warning); break; } } //更新一下订单状态 RefreshPayOrder(payOrder.OutTradeNo, config); result.Success = true; return(result); }