Exemplo n.º 1
0
        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);
        }