コード例 #1
0
        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";
            }
            


        }
コード例 #2
0
ファイル: notify_url.aspx.cs プロジェクト: Molly2Molly/m2m
    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("无通知参数");
        }
    }
コード例 #3
0
        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);
        }