protected void Page_Load(object sender, EventArgs e) { logger.Info("支付宝充值回调开始notify_url"); logger.Info("开始解析参数"); Dictionary <string, string> sPara = GetRequestPost(); if (sPara.Count > 0)//判断是否有带返回参数 { //logger.Info("判断有带参数"); Notify aliNotify = new Notify(); var sign = Request.Form["sign"]; logger.InfoFormat("验证签名:{0}", sign); bool verifyResult = aliNotify.VerifyNotify(sPara, sign); if (verifyResult)//验证成功 { logger.Info("签名通过验证"); ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //请在这里加上商户的业务逻辑程序代码 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 //解密(如果是RSA签名需要解密,如果是MD5签名则下面一行清注释掉) //sPara = aliNotify.Decrypt(sPara); //XML解析notify_data数据 try { //XmlDocument xmlDoc = new XmlDocument(); //string notify_data = sPara["notify_data"]; ////logger.InfoFormat("notify_data:{0}", notify_data); //xmlDoc.LoadXml(notify_data); //商户订单号 string out_trade_no = sPara["out_trade_no"]; //xmlDoc.SelectSingleNode("/notify/out_trade_no").InnerText; //支付宝交易号 string trade_no = sPara["trade_no"]; //xmlDoc.SelectSingleNode("/notify/trade_no").InnerText; //交易状态 string trade_status = sPara["trade_status"]; //xmlDoc.SelectSingleNode("/notify/ logger.InfoFormat("out_trade_no:{0},trade_no:{1},trade_status:{2}", out_trade_no, trade_no, trade_status); if (trade_status == "TRADE_FINISHED" || trade_status == "TRADE_SUCCESS") { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //该种交易状态只在两种情况下出现 //1、开通了普通即时到账,买家付款成功后。 //2、开通了高级即时到账,从该笔交易成功时间算起,过了签约时的可退款时限(如:三个月以内可退款、一年以内可退款等)后。 if (Utility.IsNum(out_trade_no)) { var id = Convert.ToInt32(out_trade_no); var chargeLog = ChargeLogHelper.GetChargeLog(id); if (chargeLog != null && chargeLog.Status == 0) { //添加 var user = AccountHelper.GetUser(chargeLog.UserId); if (user == null) { logger.ErrorFormat("不存在用户Id={0}", chargeLog.UserId); } else { //交易金额 double total_fee = Convert.ToDouble(sPara["total_fee"]); var setting = SystemHelper.GetMerchantExtend(chargeLog.SellerId); ExtcreditLog log = new ExtcreditLog(); log.UserId = chargeLog.UserId; log.SellerId = chargeLog.SellerId; log.SourceId = DateTime.Now.GetUnixTime(); log.Extcredit = (int)(chargeLog.Money * 1.0 * (setting != null ? setting.ChargeIntegral : 0)); log.Type = ExtcreditSourceType.Charge; ExtcreditLogHelper.AddExtcreditLog(log); logger.InfoFormat("充值之前;Integral={0},充值之后:Integral:{1}", user.Integral, user.Integral + log.Extcredit); user.Integral = user.Integral + log.Extcredit; var money = user.Money + chargeLog.Money; logger.InfoFormat("充值之前;Money={0},充值之后:Money:{1}", user.Money, money); user.Money = money; user.TotalRecharge += chargeLog.Money; //保存用户信息 AccountHelper.SaveAccount(user); var merchant = MerchantHelper.GetMerchant(chargeLog.SellerId); if (merchant != null) { merchant.Money = user.Money; MerchantHelper.SaveMerchant(merchant); } //更新充值记录 //chargeLog.OrderId = trade_no; //更新第三方订单id chargeLog.Status = RechargeStatus.Success; ChargeLogHelper.UpdateStatus(chargeLog, trade_no); logger.InfoFormat("充值成功;UserId={1},Money={0},ChargeLogId:{2},total_fee:{3}", chargeLog.Money, chargeLog.UserId, id, total_fee); } } else if (chargeLog == null) { logger.ErrorFormat("不存在充值记录Id={0}", id); } else { logger.Error("该充值记录已处理过"); } } else { logger.Error("商户订单号不是int型"); } Response.Write("success"); //请不要修改或删除 } //else if (trade_status == "TRADE_SUCCESS") //{ // //判断该笔订单是否在商户网站中已经做过处理 // //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 // //如果有做过处理,不执行商户的业务程序 // //注意: // //该种交易状态只在一种情况下出现——开通了高级即时到账,买家付款成功后。 // Response.Write("success"); //请不要修改或删除 //} else { if (Utility.IsNum(out_trade_no)) { var id = Convert.ToInt32(out_trade_no); //更新充值记录 var chargeLog = ChargeLogHelper.GetChargeLog(id); if (chargeLog != null) { logger.ErrorFormat("充值失败;UserId={1},Money={0}", chargeLog.Money, chargeLog.UserId); } else { logger.ErrorFormat("充值失败,充值记录未找到Id:{0}", id); } //关闭时才更改状态 if (trade_status == "TRADE_Close" && chargeLog != null) { chargeLog.Status = RechargeStatus.Fail; ChargeLogHelper.UpdateStatus(chargeLog, trade_no); trade_status = "success";//返回success } } else { logger.ErrorFormat("充值失败,充值id不是int型;Id={0}", out_trade_no); } Response.Write(trade_status); } } catch (Exception exc) { logger.ErrorFormat("异常:{0})", exc.Message); Response.Write(exc.ToString()); } //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— ///////////////////////////////////////////////////////////////////////////////////////////////////////////// } else//验证失败 { logger.Info("签名验证失败"); Response.Write("fail"); } } else { logger.Info("无通知参数"); Response.Write("无通知参数"); } }
/// <summary> /// 获取充值统计 /// </summary> private void GetChargeStat() { var sellerId = CurSellerId; var type = (StatisticsType)GetInt("type"); //统计类型 var start = GetInt("start"); //传0 var limit = GetInt("limit"); //传10 只取前十名 var data = new ChargeStatResponse(); data.Stat = new RechargeStatisticsHelper.ReqRechargeStatistics(type); switch (type) { case StatisticsType.Day: data.Stat = RechargeStatisticsHelper.GetRechargeDateStatisticsList(sellerId, DateTime.Now); break; case StatisticsType.Month: data.Stat = RechargeStatisticsHelper.GetRechargeMonthStatisticsList(sellerId, DateTime.Now.Year, DateTime.Now.Month); break; case StatisticsType.Quarter: data.Stat = RechargeStatisticsHelper.GetRechargeQuarterStatisticsList(sellerId, DateTime.Now.Year); break; case StatisticsType.Year: data.Stat = RechargeStatisticsHelper.GetRechargeYearStatisticsList(sellerId, DateTime.Now.Year); break; } var startTime = DateTime.Now; var endTime = DateTime.Now; switch (type) { case StatisticsType.Day: startTime = DateTime.Now.Date; endTime = startTime.AddDays(1).AddMilliseconds(-1); break; case StatisticsType.Month: startTime = new DateTime(startTime.Year, startTime.Month, 1).Date; endTime = startTime.AddMonths(1).AddMilliseconds(-1); break; case StatisticsType.Quarter: case StatisticsType.Year: startTime = new DateTime(startTime.Year, 1, 1).Date; endTime = startTime.AddYears(1).AddMilliseconds(-1); break; } var list = ChargeLogHelper.GetRechargeLogList(CurSellerId, startTime, endTime, start * limit, limit); foreach (var chargeLog in list) { var item = new ReqChargeStatItem(); item.UserId = chargeLog.UserId; item.TotalMoney = chargeLog.TotalMoney; item.UserName = chargeLog.UserName; item.Pre = (chargeLog.TotalMoney * 1.0 / data.Stat.TotalMoney * 100).ToString("F2"); data.List.Add(item); } var jt = new JsonTransfer(); jt.Add("data", data); Response.Write(jt.ToJson()); Response.End(); }
protected void Page_Load(object sender, EventArgs e) { logger.Info("支付宝充值回调开始wap_notify_ordersurl"); logger.Info("开始解析参数"); Dictionary <string, string> sPara = GetRequestPost(); if (sPara.Count > 0)//判断是否有带返回参数 { //logger.Info("判断有带参数"); AlipayXmlNotify aliNotify = new AlipayXmlNotify(); var sign = Request.Form["sign"]; logger.InfoFormat("验证签名:{0}", sign); bool verifyResult = aliNotify.VerifyNotify(sPara, sign); if (verifyResult)//验证成功 { logger.Info("签名通过验证"); ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //请在这里加上商户的业务逻辑程序代码 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 //解密(如果是RSA签名需要解密,如果是MD5签名则下面一行清注释掉) //sPara = aliNotify.Decrypt(sPara); //XML解析notify_data数据 try { XmlDocument xmlDoc = new XmlDocument(); string notify_data = sPara["notify_data"]; //logger.InfoFormat("notify_data:{0}", notify_data); xmlDoc.LoadXml(notify_data); //商户订单号 string out_trade_no = xmlDoc.SelectSingleNode("/notify/out_trade_no").InnerText; //支付宝交易号 string trade_no = xmlDoc.SelectSingleNode("/notify/trade_no").InnerText; //交易状态 string trade_status = xmlDoc.SelectSingleNode("/notify/trade_status").InnerText; logger.InfoFormat("out_trade_no:{0},trade_no:{1},trade_status:{2}", out_trade_no, trade_no, trade_status); if (trade_status == "TRADE_FINISHED" || trade_status == "TRADE_SUCCESS") { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //该种交易状态只在两种情况下出现 //1、开通了普通即时到账,买家付款成功后。 //2、开通了高级即时到账,从该笔交易成功时间算起,过了签约时的可退款时限(如:三个月以内可退款、一年以内可退款等)后。 if (Utility.IsNum(out_trade_no)) { var id = Convert.ToInt32(out_trade_no); var orders = OrdersHelper.GetOrders(id); if (orders != null && orders.Status < OrderStatus.Pay) { //添加 var user = AccountHelper.GetUser(orders.UserId); if (user == null) { logger.ErrorFormat("不存在用户Id={0}", orders.UserId); } else { var payMent = new Payment(); if (orders.Pid > 0) { PaymentHelper.GetPayment(orders.Pid); } var chargeLog = new ChargeLog(); chargeLog.UserId = orders.UserId; chargeLog.Money = -orders.TotalPrice; chargeLog.Pid = orders.Pid; chargeLog.SellerId = orders.SellerId; chargeLog.OrderId = orders.Id.ToString(); chargeLog.PayName = payMent.Id == 0 ? "账户余额" : payMent.Name; chargeLog.Status = RechargeStatus.Success; chargeLog.GidList = orders.GidList; chargeLog.NumList = orders.NumList; chargeLog.Num = orders.NumList.Sum(o => o); //记录消费记录 ChargeLogHelper.AddChargeLog(chargeLog); var setting = SystemHelper.GetMerchantExtend(chargeLog.SellerId); //积分获得 var log = new ExtcreditLog(); log.UserId = orders.UserId; log.SellerId = user.SellerId; log.SourceId = orders.Id; log.Extcredit = (int)(orders.TotalPrice * 1.0 / (setting != null ? setting.ConsumeIntegral : 0)); log.Type = ExtcreditSourceType.Consume; log.CreateTime = DateTime.Now; ExtcreditLogHelper.AddExtcreditLog(log); user.Integral += log.Extcredit; user.Concume(orders.TotalPrice, 1); //保存用户信息 AccountHelper.SaveAccount(user); //更新订单中商品的销量 GoodsHelper.UpdateGoodsSales(orders.GidList, orders.NumList); orders.Status = OrderStatus.Pay; OrdersHelper.SaveOrders(orders); logger.InfoFormat("订单付款成功;UserId={1},Money={0},OrdersId:{2},Status:{3}", orders.TotalPrice, orders.UserId, orders.Id, (int)orders.Status); } } else if (orders == null) { logger.ErrorFormat("不存在订单记录Id={0}", id); } else { logger.Error("该订单已处理过"); } } else { logger.Error("商户订单号不是int型"); } Response.Write("success"); //请不要修改或删除 } //else if (trade_status == "TRADE_SUCCESS") //{ // //判断该笔订单是否在商户网站中已经做过处理 // //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 // //如果有做过处理,不执行商户的业务程序 // //注意: // //该种交易状态只在一种情况下出现——开通了高级即时到账,买家付款成功后。 // Response.Write("success"); //请不要修改或删除 //} else { if (Utility.IsNum(out_trade_no)) { var id = Convert.ToInt32(out_trade_no); var orders = OrdersHelper.GetOrders(id); if (orders != null) { logger.ErrorFormat("订单付款失败;UserId={1},Money={0}", orders.TotalPrice, orders.UserId); orders.Status = OrderStatus.Update; //关闭时才更改状态 if (trade_status == "TRADE_Close") { orders.Status = OrderStatus.Cancel; trade_status = "success";//返回success } OrdersHelper.SaveOrders(orders); } else { logger.ErrorFormat("订单付款失败,订单未找到Id:{0}", id); } } else { logger.ErrorFormat("订单付款失败,订单付款id不是int型;Id={0}", out_trade_no); } Response.Write(trade_status); } } catch (Exception exc) { logger.ErrorFormat("异常:{0})", exc.Message); Response.Write(exc.ToString()); } //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— ///////////////////////////////////////////////////////////////////////////////////////////////////////////// } else//验证失败 { logger.Info("签名验证失败"); Response.Write("fail"); } } else { logger.Info("无通知参数"); Response.Write("无通知参数"); } }
/// <summary> /// 获取充值统计 /// </summary> private void GetConsumeStat() { var sellerId = CurSellerId; var type = (StatisticsType)GetInt("type"); //统计类型 var start = GetInt("start"); //传0 var limit = GetInt("limit"); //传10 只取前十名 var data = new ConsumeStatResponse(); data.Stat = new ConsumeStatisticsHelper.ReqConsumeStatistics(type); switch (type) { case StatisticsType.Day: data.Stat = ConsumeStatisticsHelper.GetConsumeDateStatisticsList(sellerId, DateTime.Now); break; case StatisticsType.Month: data.Stat = ConsumeStatisticsHelper.GetConsumeMonthStatisticsList(sellerId, DateTime.Now.Year, DateTime.Now.Month); break; case StatisticsType.Quarter: data.Stat = ConsumeStatisticsHelper.GetConsumeQuarterStatisticsList(sellerId, DateTime.Now.Year); break; case StatisticsType.Year: data.Stat = ConsumeStatisticsHelper.GetConsumeYearStatisticsList(sellerId, DateTime.Now.Year); break; } var startTime = DateTime.Now; var endTime = DateTime.Now; switch (type) { case StatisticsType.Day: startTime = DateTime.Now.Date; endTime = startTime.AddDays(1).AddMilliseconds(-1); break; case StatisticsType.Month: startTime = new DateTime(startTime.Year, startTime.Month, 1).Date; endTime = startTime.AddMonths(1).AddMilliseconds(-1); break; case StatisticsType.Quarter: case StatisticsType.Year: startTime = new DateTime(startTime.Year, 1, 1).Date; endTime = startTime.AddYears(1).AddMilliseconds(-1); break; } var glist = new List <ConsumeGoodsItem>(); var list = ChargeLogHelper.GetChargeLogList(CurSellerId, startTime, endTime, start * limit, limit); var index = 0; foreach (var chargeLog in list) { index = 0; foreach (var i in chargeLog.GidList) { var item = glist.FirstOrDefault(o => o.Gid == i); if (item == null) { item = new ConsumeGoodsItem(); item.Gid = i; item.Num = chargeLog.NumList[index]; glist.Add(item); } else { item.Num += chargeLog.NumList[index]; } index++; } } var goodslist = GoodsHelper.GetGoodsList(glist.Select(o => o.Gid).ToList()); foreach (var goodse in goodslist) { var ritem = new ReqConsumeStatItem(); ritem.GoodsName = goodse.Title; ritem.GoodsCategoriesName = goodse.Cname; var gitem = glist.FirstOrDefault(o => o.Gid == goodse.Id); if (gitem != null) { ritem.Num = gitem.Num; ritem.Pre = (ritem.Num * 1.0 / data.Stat.TotalGoodsNum * 100).ToString("F2"); } data.List.Add(ritem); } data.List = data.List.OrderBy(o => o.Num).ToList();//排序 var jt = new JsonTransfer(); jt.Add("data", data); Response.Write(jt.ToJson()); Response.End(); }