public string Contact() { SqlConnection sqlCnt = DBHelper.getConnection(); SqlCommand cmd = null; SqlTransaction sqlTransaction = null; SqlConnection sqlCnt2 = DBHelper.createConnection(); SqlCommand cmd2 = null; SqlDataReader reader = null; log4netHelper.info("Notify:" , "Begin--收到异步通知"); string rtnXML ="",buyerAcount=""; string out_trade_no = ""; string content = ""; bool isSuccess = false; string mrnString = ""; string flowString = ""; string posString = ""; double feeRtn = 0; DateTime payDate = new DateTime(); Dictionary<string, string> sPara = GetRequestPost(Request.Form); if (sPara.Count > 0)//判断是否有带返回参数 { Notify aliNotify = new Notify(); bool verifyResult = aliNotify.VerifyNotify(sPara, sPara["sign"]); if (verifyResult)//验证成功 { ////////////////////////////////////////////////////////////////////////////// //请在这里加上商户的业务逻辑程序代码 int status = 0; //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 //解密(如果是RSA签名需要解密,如果是MD5签名则下面一行清注释掉) //sPara = aliNotify.Decrypt(sPara); //XML解析notify_data数据 try { rtnXML = sPara["notify_data"]; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(sPara["notify_data"]); //商户订单号 out_trade_no = xmlDoc.SelectSingleNode("/notify/out_trade_no").InnerText; //支付宝帐号 buyerAcount = xmlDoc.SelectSingleNode("/notify/buyer_email").InnerText; //金额 feeRtn = double.Parse(xmlDoc.SelectSingleNode("/notify/total_fee").InnerText); //支付宝交易号 string trade_no = xmlDoc.SelectSingleNode("/notify/trade_no").InnerText; //交易状态 string trade_status = xmlDoc.SelectSingleNode("/notify/trade_status").InnerText; // payDate = DateTime.Parse(xmlDoc.SelectSingleNode("/notify/gmt_payment").InnerText); posString = xmlDoc.SelectSingleNode("/notify/subject").InnerText; xmlDoc = null; mrnString = ""; flowString = ""; int posStart = 0; int posEnd = 0; posStart = posString.IndexOf(":{") + 2; posEnd = posString.IndexOf("}"); if ((posEnd - posStart) > 3) { mrnString = posString.Substring(posStart, posEnd - posStart); posStart = posString.IndexOf(":[") + 2; posEnd = posString.IndexOf("]"); if ((posEnd - posStart) > 3) { flowString = posString.Substring(posStart, posEnd - posStart); posString = flowString.Substring(flowString.Length - 4, 4); flowString = flowString.Substring(0, flowString.Length - 4); } else { mrnString = ""; flowString = ""; posString = ""; } } else { mrnString = ""; flowString = ""; posString = ""; } log4netHelper.info("Notify:" + trade_status, "RTN:" + rtnXML); log4netHelper.info("Notify:", "流水号:" + out_trade_no); log4netHelper.info("Notify:", "淘宝订单号:" + trade_no); log4netHelper.info("Notify:", "支付宝帐号:" + buyerAcount); log4netHelper.info("Notify:", "金额:" + feeRtn.ToString()); log4netHelper.info("Notify", "mrn:" + mrnString); log4netHelper.info("Notify", "flowid:" + flowString); log4netHelper.info("Notify", "pos:" + posString); if (trade_status == "TRADE_FINISHED") { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //该种交易状态只在两种情况下出现 //1、开通了普通即时到账,买家付款成功后。 //2、开通了高级即时到账,从该笔交易成功时间算起,过了签约时的可退款时限(如:三个月以内可退款、一年以内可退款等)后。 status = 2; //return "异步通知:交易完成"; //Response.Write("success"); //请不要修改或删除 } else if (trade_status == "TRADE_SUCCESS") { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //该种交易状态只在一种情况下出现——开通了高级即时到账,买家付款成功后。 status = 1; //return "异步通知:交易成功"; //Response.Write("success"); //请不要修改或删除 } else { status = -1; //Response.Write(trade_status); //return "异步通知:交易类型为其他"; } } catch (Exception exc) { status = -9; content = "解析报表有误:" + exc.Message; log4netHelper.info("Notify", "解析报表有误!"); //return "异步通知:解析报表出错"; } finally { log4netHelper.info("Notify", "解析走完!"); } if (status > 0) { if (out_trade_no.Length > 10 && mrnString.Length>4 && posString.Length==4 && flowString.Length >10) { Socket clientSocket = null; Guid guid = new Guid(); try { guid = new Guid(out_trade_no); string pcid =""; int count = 0; sqlCnt.Open(); sqlCnt2.Open(); cmd = sqlCnt.CreateCommand(); //创建SqlCommand对象 cmd2 = sqlCnt2.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "select COUNT(*) from BankMsgSwitch where GUID =@GUID"; //sql语句 cmd.Parameters.Add("@GUID", SqlDbType.UniqueIdentifier); cmd.Parameters["@GUID"].Value = guid; cmd2.CommandType = CommandType.Text; cmd2.CommandText = "select COUNT(*) from BankMsgSwitch where GUID =@GUID"; //sql语句 cmd2.Parameters.Add("@GUID", SqlDbType.UniqueIdentifier); cmd2.Parameters["@GUID"].Value = guid; cmd.Parameters.Add("@RMsg_xml", SqlDbType.Xml); cmd.Parameters["@RMsg_xml"].Value = rtnXML; cmd.Parameters.Add("@RMsg_txt", SqlDbType.Text); cmd.Parameters["@RMsg_txt"].Value = rtnXML; cmd.Parameters.Add("@BuyerAcount", SqlDbType.Text); cmd.Parameters["@BuyerAcount"].Value = buyerAcount; cmd.Parameters.Add("@Rdatetime", SqlDbType.DateTime); cmd.Parameters["@Rdatetime"].Value = DateTime.Now; cmd.Parameters.Add("@PayDate", SqlDbType.DateTime); cmd.Parameters["@PayDate"].Value = payDate; cmd.Parameters.Add("@FeeRtn", SqlDbType.Decimal); cmd.Parameters["@FeeRtn"].Value = feeRtn; cmd.Parameters.Add("@Mrn", SqlDbType.Int); cmd.Parameters["@Mrn"].Value = int.Parse(mrnString); count = (int)cmd.ExecuteScalar(); //cmd.CommandText = "select COUNT(*) from BankTradeTitle where GInterID =@GUID"; //count *= (int)cmd.ExecuteScalar(); if (count == 1 ) { cmd.CommandText = "select b.pcid as 'pcid' from pmain b where mrn =@Mrn"; reader = cmd.ExecuteReader(); if (reader.HasRows) { reader.Read(); pcid = reader["pcid"].ToString(); cmd.Parameters.Add("@Pcid", SqlDbType.Text); cmd.Parameters["@Pcid"].Value = reader["pcid"].ToString(); reader.Close(); reader.Dispose(); try { cmd.CommandText = "select RMsgText from BankMsgSwitch where GUID =@GUID"; string rMsgText = cmd.ExecuteScalar().ToString().Trim(); if (rMsgText.Length<3) { sqlTransaction = sqlCnt.BeginTransaction(); cmd.Transaction = sqlTransaction; cmd.CommandText = "update BankMsgSwitch set RMsg = @RMsg_xml ,RMsgText = @RMsg_txt,RDateTime=@Rdatetime,socketflag='0' where GUID = @GUID"; //sql语句 cmd.ExecuteNonQuery(); //cmd.CommandText = "insert into BankMnyFlow (FlowID,CrdNO,Mrn,DoType,DoMoney,Operater,Updatetime,BankID) values (@GUID,@Pcid,@Mrn,'1',@FeeRtn,@Operater,@Rdatetime,'100040')"; //sql语句 //cmd.ExecuteNonQuery(); //转账 sqlTransaction.Commit(); content = "更新日志表成功,待发送Socket"; log4netHelper.info("Notify", "SWITCH表Commit成功!"); log4netHelper.info("Notify", "身份证:" + pcid); log4netHelper.info("Notify", "GUID:" + guid.ToString()); log4netHelper.info("Notify", "更新日志表成功" ); } if (null != sqlTransaction) sqlTransaction.Dispose(); sqlTransaction = sqlCnt2.BeginTransaction(); cmd2.Transaction = sqlTransaction; cmd2.CommandText = "select socketflag from BankMsgSwitch where GUID =@GUID"; rMsgText = cmd2.ExecuteScalar().ToString().Trim(); if ("0".Equals(rMsgText)) { IPAddress ip = IPAddress.Parse(MyUtils.SystemParms.socketIP); clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientSocket.Connect(new IPEndPoint(ip, MyUtils.SystemParms.socketPort)); //配置服务器IP与端口 //通过clientSocket接收数据 //int receiveLength = clientSocket.Receive(result); //log4netHelper.fatal("Socket",Encoding.ASCII.GetString(result, 0, receiveLength)); ////Console.WriteLine("接收服务器消息:{0}", Encoding.ASCII.GetString(result, 0, receiveLength)); ////通过 clientSocket 发送数据 string sendMessage = "<Root><TransCode>801</TransCode><Date>" + payDate.ToString("yyyyMMdd") + "</Date><BankTrace></BankTrace><BankNumber></BankNumber>" + "<idno>" + pcid + "</idno><AMT>" + feeRtn.ToString("f2") + "</AMT><TradeCode>" + flowString + "</TradeCode><PosId>" + posString + "</PosId><Guid>" + out_trade_no + "</Guid></Root>"; clientSocket.Send(Encoding.GetEncoding("gb18030").GetBytes(sendMessage)); log4netHelper.info("Notify", "Socket:" + "发送"); Thread.Sleep(300); string recStr = ""; byte[] recBytes = new byte[4096]; int bytes = clientSocket.Receive(recBytes, recBytes.Length, 0); recStr = Encoding.GetEncoding("gb18030").GetString(recBytes, 0, bytes); //recStr += Encoding.Default.GetString(recBytes, 0, bytes); recStr = recStr.Substring(10, recStr.Length - 10); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(recStr); //商户订单号 recStr = xmlDoc.SelectSingleNode("/Response/TransReturn").InnerText; xmlDoc = null; log4netHelper.info("Notify", "Socket:" + "接受,TransReturn:" + recStr); } content = "成功发送Socket"; isSuccess = true; } catch (Exception e) { sqlTransaction.Rollback(); content = "更新日志表出错" + e.Message; isSuccess = false; //log4netHelper.info("Notify", ); } finally { if (null != sqlTransaction) { sqlTransaction.Dispose(); sqlTransaction = null; } if (null != clientSocket) { clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); } } } else { content = "无该订单信息"; isSuccess = false; //log4netHelper.info("Notify", "End:无该订单信息!"); //return "无该订单信息"; } } else { content = "BankMsgSwitch表记录有误!"; isSuccess = false; //log4netHelper.info("Notify", "BankMnyFlow、BankTradeTitle、BankMsgSwitch三个表记录有误!"); //return "BankMnyFlow、BankTradeTitle、BankMsgSwitch三个表记录有误!"; } } catch (Exception e) { content = "操作数据库有误:" + e.Message; isSuccess = false; log4netHelper.info("Notify", "操作数据库有误:" + e.Message); } finally { if (null != reader) { reader.Dispose(); } if (null != cmd) { cmd.Dispose(); } if (null != cmd2) { cmd2.Dispose(); } sqlCnt.Close(); sqlCnt2.Close(); sqlCnt2 = null; sqlCnt = null; } log4netHelper.info("Notify", "End:----"); } else { content = "GUID有误"; isSuccess = false; //log4netHelper.info("Notify", "End:GUID有误!"); //return "GUID有误"; } } else { content = "交易状态为其他"; isSuccess = false; //log4netHelper.info("Notify", "End:交易状态为其他"); //return "交易状态为其他"; } //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— ///////////////////////////////////////////////////////////////////////////////////////////////////////////// } else//验证失败 { content = "验证失败"; isSuccess = false; //log4netHelper.info("Notify:", "End:验证失败!"); //return "验证失败"; } } else { //log4netHelper.info("Notify:", "End:无通知参数"); //return "无通知参数"; content = "无通知参数:" + sPara.Count; isSuccess = false; } if (isSuccess) { log4netHelper.info("Notify", "Success:" + content); log4netHelper.info("Notify:", " "); return "success"; } else { log4netHelper.info("Notify:", "Fail:" + content); log4netHelper.info("Notify:", " "); return "fail"; } }
protected void Page_Load(object sender, EventArgs e) { Dictionary<string, string> sPara = GetRequestPost(); if (sPara.Count > 0)//判断是否有带返回参数 { Notify aliNotify = new Notify(); bool verifyResult = aliNotify.VerifyNotify(sPara, Request.Form["sign"]); if (verifyResult)//验证成功 { ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //请在这里加上商户的业务逻辑程序代码 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 //解密(如果是RSA签名需要解密,如果是MD5签名则下面一行清注释掉) sPara = aliNotify.Decrypt(sPara); //XML解析notify_data数据 try { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(sPara["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; if (trade_status == "TRADE_FINISHED") { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //该种交易状态只在两种情况下出现 //1、开通了普通即时到账,买家付款成功后。 //2、开通了高级即时到账,从该笔交易成功时间算起,过了签约时的可退款时限(如:三个月以内可退款、一年以内可退款等)后。 Response.Write("success"); //请不要修改或删除 } else if (trade_status == "TRADE_SUCCESS") { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //该种交易状态只在一种情况下出现——开通了高级即时到账,买家付款成功后。 Response.Write("success"); //请不要修改或删除 } else { Response.Write(trade_status); } } catch (Exception exc) { Response.Write(exc.ToString()); } //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— ///////////////////////////////////////////////////////////////////////////////////////////////////////////// } else//验证失败 { Response.Write("fail"); } } else { Response.Write("无通知参数"); } }
public void Notify() { string errorMessage = "fail"; Dictionary <string, string> sPara = GetParamPost(); if (sPara.Count > 0)//判断是否有带返回参数 { Com.Alipay.Notify aliNotify = new Com.Alipay.Notify(); bool verifyResult = aliNotify.VerifyNotify(sPara, Request.Form["sign"]); if (verifyResult)//验证成功 { //解密(如果是RSA签名需要解密,如果是MD5签名则下面一行清注释掉) sPara = aliNotify.Decrypt(sPara); //XML解析notify_data数据 try { XmlHelper xmlHelper = new XmlHelper(sPara["notify_data"]); if (xmlHelper != null) { //商户订单号 string out_trade_no = xmlHelper.GetNodeString("/notify/out_trade_no"); //支付宝交易号 string trade_no = xmlHelper.GetNodeString("/notify/trade_no"); //交易状态 string trade_status = xmlHelper.GetNodeString("/notify/trade_status"); string buyer_email = xmlHelper.GetNodeString("/notify/buyer_email"); string seller_id = xmlHelper.GetNodeString("/notify/seller_id"); decimal total_fee = xmlHelper.GetNodeDecimal("/notify/total_fee"); if (string.Compare(Com.Alipay.Config.Partner, seller_id, true) == 0 && (string.Compare(trade_status, "TRADE_FINISHED", true) == 0 || string.Compare(trade_status, "TRADE_SUCCESS", true) == 0)) { int result = 0; RechargeInfo model = new RechargeInfo(); model.OrderId = out_trade_no; model.FOrderId = trade_no; model.Cash = total_fee * 100; model.PayMobile = ""; _rechargeService.Completed(model, out result); //1:成功 0:失败 if (result == (int)ErrorMessage.成功) { errorMessage = "success"; } } else { errorMessage = trade_status; } } } catch { } } } else { errorMessage = "无通知参数"; } this.Response.Write(errorMessage); }