支付宝支付成功更改状态有点儿问题,纠结呀...

时间:2022-05-26 05:06:40
这里是支付宝支付之后跳转的页面

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Specialized;
using System.Collections.Generic;
using AlipayClass;
using System.Data.SqlClient;

/// <summary>
/// 功能:付完款后跳转的页面(返回页)
/// 版本:3.0
/// 日期:2010-06-09
/// 说明:
/// 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
/// 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
/// 
/// ///////////////////////页面功能说明///////////////////////
/// 该页面可在本机电脑测试
/// 该页面称作“返回页”,是由支付宝服务器同步调用,可当作是支付完成后的提示信息页,如“您的某某某订单,多少金额已支付成功”。
/// 可放入HTML等美化页面的代码和订单交易完成后的数据库更新程序代码
/// 该页面可以使用ASP.NET开发工具调试,也可以使用写文本函数Log_result进行调试,该函数已被默认关闭
/// TRADE_FINISHED(表示交易已经成功结束,为普通即时到帐的交易状态成功标识);
/// TRADE_SUCCESS(表示交易已经成功结束,为高级即时到帐的交易状态成功标识);
/// </summary>
public partial class return_url : System.Web.UI.Page
{
    private string PARENTER = "";
    private string KEY = ""; 
    protected void Page_Load(object sender, EventArgs e)
    {
        GetKeyEmail();
        SortedDictionary<string, string> sArrary = GetRequestGet();
        ///////////////////////以下参数是需要设置的相关配置参数,设置后不会更改的//////////////////////
        string partner = PARENTER;                //合作身份者ID
        string key = KEY;    //安全检验码
        string input_charset = "utf-8";                     //字符编码格式 目前支持 gbk 或 utf-8
        string sign_type = "MD5";                           //加密方式 不需修改
        string transport = "https";                         //访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
        //////////////////////////////////////////////////////////////////////////////////////////////

        if (sArrary.Count > 0)//判断是否有带返回参数
        {
            AlipayNotify aliNotify = new AlipayNotify(sArrary, Request.QueryString["notify_id"], partner, key, input_charset, sign_type, transport);
            string responseTxt = aliNotify.ResponseTxt; //获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求
            string sign = Request.QueryString["sign"];  //获取支付宝反馈回来的sign结果
            string mysign = aliNotify.Mysign;           //获取通知返回后计算后(验证)的加密结果

            //写日志记录(若要调试,请取消下面两行注释)
            //string sWord = "responseTxt=" + responseTxt + "\n return_url_log:sign=" + Request.QueryString["sign"] + "&mysign=" + mysign + "\n return回来的参数:" + aliNotify.PreSignStr;
            //AlipayFunction.log_result(Server.MapPath("log/" + DateTime.Now.ToString().Replace(":", "")) + ".txt",sWord);

            //判断responsetTxt是否为ture,生成的签名结果mysign与获得的签名结果sign是否一致
            //responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
            //mysign与sign不等,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
            if (responseTxt == "true" && sign == mysign)//验证成功
            {
                //请根据您的业务逻辑来编写程序(以下代码仅作参考)
                //获取支付宝的通知返回参数
                string trade_no = Request.QueryString["trade_no"];      //支付宝交易号
                string order_no = Request.QueryString["out_trade_no"]; //获取订单号
                string total_fee = Request.QueryString["total_fee"]; //获取总金额
                string subject = Request.QueryString["subject"];        //商品名称、订单名称
                string body = Request.QueryString["body"];              //商品描述、订单备注、描述
                string buyer_email = Request.QueryString["buyer_email"];//买家支付宝账号
                string trade_status = Request.QueryString["trade_status"];//交易状态
                int sOld_trade_status = OrderStaus(trade_no);     //获取商户数据库中查询得到该笔交易当前的交易状态

                //打印页面
                lbTrade_no.Text = trade_no;
                lbOut_trade_no.Text = order_no;
                lbTotal_fee.Text = total_fee;
                lbSubject.Text = subject;
                lbBody.Text = body;
                lbBuyer_email.Text = buyer_email;
                lbTrade_status.Text = trade_status;
                lbVerify.Text = "验证成功";

                //假设:
                //sOld_trade_status="0" 表示订单未处理;
                //sOld_trade_status="1" 表示交易成功(TRADE_FINISHED/TRADE_SUCCESS)

                if (Request.QueryString["trade_status"] == "TRADE_FINISHED" || Request.QueryString["trade_status"] == "TRADE_SUCCESS")
                {
                    //为了保证不被重复调用,或重复执行数据库更新程序,请判断该笔交易状态是否是订单未处理状态
                    if (sOld_trade_status < 1)
                    {
                        //根据订单号更新订单,把订单状态处理成交易成功
                     
                        string _ChangeState = "UPDATE Org_Payment_Infos SET Org_Payment_Resualt=1 WHERE Org_Payment_ID=@OrderID";
                        SqlParameter[] par = new SqlParameter[] { 
                           new SqlParameter("@OrderID", SqlDbType.VarChar)
                        };
                        par[0].Value = trade_no;
                        try
                        {
                           int t=new SqlHelper().ExecuteNonQuery(_ChangeState, par);
                           if (t > 0)
                           {
                               //Response.Write(_ChangeState.ToString());
                               Response.Write("原始状态:  " + sOld_trade_status.ToString() + "<br/>");
                               Response.Write("更新语句执行成功!</br>");
                               Response.Write("更改后状态: " + OrderStaus(trade_no).ToString() + "<bt/>");
                           }
                           else
                           {
                               Response.Write(t.ToString());
                               Response.Write("更改状态失败"+"<br/>");                            
                               Response.Write("定单编号: "+trade_no.ToString()+"<br/>");
                               Response.Write("定单原始状: " + sOld_trade_status.ToString()+"<br/>");
                               Response.Write("更改后状态: " + OrderStaus(trade_no).ToString() + "<bt/>");
                               Response.Write("传入参数: "+par[0].Value.ToString());
                           }
                        }
                        catch(Exception ex)
                        {
                            Response.Write(ex.ToString());                            
                            Response.Write(trade_no.ToString()+"<br/>");
                            Response.Write("定单原始状: " + sOld_trade_status.ToString() + "<br/>");
                            Response.Write("更改后状态: " + OrderStaus(trade_no).ToString() + "<bt/>");
                            Response.Write(_ChangeState.ToString());
                        }                         

                    }
                }
                else
                {
                    Response.Write("trade_status=" + Request.QueryString["trade_status"]);
                }
                //请根据您的业务逻辑来编写程序(以上代码仅作参考)
            }
            else//验证失败
            {
                lbVerify.Text = "验证失败";
            }
        }
        else
        {
            lbVerify.Text = "无返回参数";
        }
    }

    /// <summary>
    /// 获取支付宝GET过来通知消息,并以“参数名=参数值”的形式组成数组
    /// </summary>
    /// <returns>request回来的信息组成的数组</returns>
    public SortedDictionary<string, string> GetRequestGet()
    {
        int i = 0;
        SortedDictionary<string, string> sArray = new SortedDictionary<string, string>();
        NameValueCollection coll;
        //Load Form variables into NameValueCollection variable.
        coll = Request.QueryString;

        // Get names of all forms into a string array.
        String[] requestItem = coll.AllKeys;

        for (i = 0; i < requestItem.Length; i++)
        {
            sArray.Add(requestItem[i], Request.QueryString[requestItem[i]]);
        }

        return sArray;
    }  
    private void GetKeyEmail()
    {
        string _str = "SELECT top 1 Com_NetUrl,Com_NetPartner,Com_NetKey,Com_NetEmail  FROM dbo.Org_NetState_Infos";
        SqlDataReader dr = new SqlHelper().RunDataReader(_str);
        if (dr.Read())
        {
            PARENTER = dr["Com_NetPartner"].ToString();
            KEY = dr["Com_NetKey"].ToString();
        }
    }
    private int OrderStaus(string Orderid)
    {
        int status = 0;
        SqlParameter par = new SqlParameter("@TransID", SqlDbType.VarChar);
        par.Value = Orderid;
        string _strOrder = "SELECT Org_Payment_Resualt FROM dbo.Org_Payment_Infos where Org_Payment_ID=@TransID";
        using (SqlDataReader dr = new SqlHelper().RunDataReader(_strOrder, par))
        {
            if (dr.Read())
            {
                status = Convert.ToInt32(dr[0].ToString());
            }
        }
        return status;
    }
}


数据中   Org_Payment_ID 是定单的编号 varchar类型的   
Org_Payment_Resualt 支付结果   原来是bit类型 默认是0  支付成功为1
可是页面跳转过来验证成功!定单的状态却始终改不成1 把sql语句放在数据里执行可以修改 
页面打印总是打打印   
   Response.Write(t.ToString());
    Response.Write("更改状态失败"+"<br/>");                            
     Response.Write("定单编号: "+trade_no.ToString()+"<br/>");
    Response.Write("定单原始状: " + sOld_trade_status.ToString()+"<br/>");
   Response.Write("更改后状态: " + OrderStaus(trade_no).ToString() + "<bt/>");
  Response.Write("传入参数: "+par[0].Value.ToString());
t<0 的这一段结果?

16 个解决方案

#1


以下是sqlHelp方法的代码

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
/// <summary>
/// SqlHelper 的摘要说明 
/// </summary>
public class SqlHelper
{
    /// <summary>
    /// 构造函数,初始化SqlConnection对象
    /// </summary>
    public SqlHelper()
    {
        conn = new SqlConnection(ConfigurationManager.AppSettings["ConStr"]);
    }
    SqlConnection conn;

    /// <summary>
    ///打开数据库连接
    /// </summary>
    void OpenConnection()
    {
        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }
    }
    /// <summary>
    /// 关闭数据库连接
    /// </summary>
    void CloseConnection()
    {
        if (conn.State == ConnectionState.Open)
        {
            conn.Close();
        }
    }

    ///使用数据阅读器(包括有参和无参的Sql语句,有参和无参数的存储过程)
    ///查询数据,每次向下读取一条数据
    #region
    /// <summary>
    /// 1.执行数据阅读器
    /// </summary>
    /// <param name="sql">无参数的Sql语句</param>
    /// <returns>返回SqlDataReader</returns>
    public SqlDataReader RunDataReader(string sql)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            OpenConnection();
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        catch (Exception ex)
        {
            conn.Close();
            throw new Exception(ex.Message);
        }
        finally
        {          
        }
    }

    /// <summary>
    /// 2.使用数据阅读器
    /// </summary>
    /// <param name="CommandText">无参数的存储过程名称</param>
    /// <returns>数据阅读器</returns>
    public SqlDataReader RunDataReaderProc(string CommandText)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(CommandText, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            OpenConnection();
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        catch (Exception ex)
        {
            conn.Close();
            throw new Exception(ex.Message);
        }
        finally
        {
          
        }
    }

    public SqlDataReader RunDataReader(string sql,SqlParameter parmer)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            OpenConnection();
            cmd.Parameters.Add(parmer);
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        catch (Exception ex)
        {
            conn.Close();
            throw new Exception(ex.Message);
        }
        finally 
        {           
        }
    }
    /// <summary>
    /// 3.执行数据阅读器,有参数的Sql语句
    /// </summary>
    /// <param name="sql">Sql语句</param>
    /// <param name="param">Sql语句中的参数</param>
    /// <returns>数据阅读器</returns>
    public SqlDataReader RunDataReader(string sql, params SqlParameter[] param)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            OpenConnection();
            foreach (SqlParameter p in param)
            {
                cmd.Parameters.Add(p);
            }
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        catch (Exception ex)
        {
            conn.Close();
            throw new Exception(ex.Message);
        }
        finally
        {
        }
    }
    /// <summary>
    /// 4.执行数据阅读器
    /// </summary>
    /// <param name="CommandText">存储过程名称</param>
    /// <param name="param">参数数组</param>
    /// <returns>返回数据阅读器</returns>
 

#2


string _ChangeState = "UPDATE Org_Payment_Infos SET Org_Payment_Resualt=1 WHERE  Org_Payment_ID=@OrderID";
                        SqlParameter[] par = new SqlParameter[] { 
                           new SqlParameter("@OrderID", SqlDbType.VarChar)
                        };
                        par[0].Value =  trade_no;


你要搞明白红色这2处的关系

trade_no是支付宝那面返回来的支付宝交易号,和你网站数据库中的订单编号不是一个

你把trade_no改成order_no试试

#3



   public SqlDataReader RunDataReaderProc(string CommandText, params SqlParameter[] param)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(CommandText, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            foreach (SqlParameter p in param)
            {
                cmd.Parameters.Add(p);
            }
            OpenConnection();
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        catch (Exception ex)
        {
            conn.Close();
            throw new Exception(ex.Message);
        }
        finally
        {
            
        }

    }
    #endregion


    ///使用数据适配器(包括有参和无参的Sql语句,有参和无参数的存储过程)
    ///查询数据,一次读取大量数据
    #region
    /// <summary>
    /// 1.使用数据适配器
    /// </summary>
    /// <param name="sql">无参数的Sql语句</param>
    /// <returns>DataSet数据集</returns>
    public DataSet RunDataAdapter(string sql)
    {
        try
        {
            SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
            DataSet ds = new DataSet();
            sda.Fill(ds);
            return ds;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }

    /// <summary>
    /// 2.使用数据适配器
    /// </summary>
    /// <param name="CommandText">无参数的存储过程</param>
    /// <returns>DataSet数据集</returns>
    public DataSet RunDataAdapterProc(string CommandText)
    {
        try
        {
            SqlDataAdapter sda = new SqlDataAdapter(CommandText, conn);
            sda.SelectCommand.CommandType = CommandType.StoredProcedure;
            DataSet ds = new DataSet();
            sda.Fill(ds);
            return ds;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }

    /// <summary>
    /// 3.使用数据适配器
    /// </summary>
    /// <param name="CommandText">有参数的存储过程</param>
    /// <param name="param">参数数组</param>
    /// <returns>DataSet数据集</returns>
    public DataSet RunDataAdapterProc(string CommandText, params SqlParameter[] param)
    {
        try
        {
            SqlDataAdapter sda = new SqlDataAdapter(CommandText, conn);
            sda.SelectCommand.CommandType = CommandType.StoredProcedure;    //声明CommandText为存储过程
            foreach (SqlParameter p in param)                               //添加每个参数
            {
                sda.SelectCommand.Parameters.Add(p);
            }
            DataSet ds = new DataSet();
            sda.Fill(ds);
            return ds;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }
    /// <summary>
    /// 3使用数据适配器
    /// </summary>
    /// <param name="sql">有参的Sql语句</param>
    /// <param name="param">参数</param>
    /// <returns></returns>
    public DataSet RunDataAdapter(string sql, SqlParameter param)
    {
        try
        {
            SqlDataAdapter sda = new SqlDataAdapter(sql, conn);           
            sda.SelectCommand.Parameters.Add(param);          
            DataSet ds = new DataSet();
            sda.Fill(ds);
            return ds;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }
    /// <summary>
    /// 4.使用数据适配器
    /// </summary>
    /// <param name="sql">有参的Sql语句</param>
    /// <param name="param">参数数组</param>
    /// <returns>DataSet数据集</returns>
    public DataSet RunDataAdapter(string sql, params SqlParameter[] param)
    {
        try
        {
            SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
            foreach (SqlParameter p in param)                               //添加每个参数
            {
                sda.SelectCommand.Parameters.Add(p);
            }
            DataSet ds = new DataSet();
            sda.Fill(ds);
            return ds;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }
    #endregion



    ///使用ExecuteNonQuery
    ///1.执行插入,更新,删除操作
    #region
    /// <summary>
    /// 执行插入,更新,删除操作
    /// </summary>
    /// <param name="CommandText">有参存储过程名称</param>
    /// <param name="param">参数数组</param>
    /// <returns>返回影响的行数</returns>
    public int ExecuteNonQueryProc(string CommandText, params SqlParameter[] param)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(CommandText, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            foreach (SqlParameter p in param)
            {
                cmd.Parameters.Add(p);
            }
            OpenConnection();
            int i = cmd.ExecuteNonQuery();
            return i;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }

    }

    /// <summary>
    /// 2.执行插入,更新,删除操作
    /// </summary>
    /// <param name="CommandText">无参的存储过程名称</param>
    /// <returns>返回影响的行数</returns>
    public int ExecuteNonQueryProc(string CommandText)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(CommandText, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            OpenConnection();
            int i = cmd.ExecuteNonQuery();
            return i;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }

    }
    /// <summary>
    /// 3.执行插入,更新,删除操作
    /// </summary>
    /// <param name="sql">有参的Sql语句</param>
    /// <param name="param">参数数组</param>
    /// <returns>返回影响的行数</returns>
    public int ExecuteNonQuery(string sql, params SqlParameter[] param)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            foreach (SqlParameter p in param)
            {
                cmd.Parameters.Add(p);
            }
            OpenConnection();
            int i = cmd.ExecuteNonQuery();
            return i;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }
    public int ExecuteNonQuery(string sql, SqlParameter param)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            OpenConnection();
            cmd.Parameters.Add(param);
            int i = cmd.ExecuteNonQuery();
            return i;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }
    /// <summary>
    /// 4.执行插入,更新,删除
    /// </summary>
    /// <param name="sql">无参的Sql语句</param>
    /// <returns>影响的行数</returns>
    public int ExecuteNonQuery(string sql)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            OpenConnection();
            int i = cmd.ExecuteNonQuery();
            return i;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }
    #endregion
}



//获得商户的编号和key用来验证
 private void GetKeyEmail()
    {
        string _str = "SELECT top 1 Com_NetUrl,Com_NetPartner,Com_NetKey,Com_NetEmail  FROM dbo.Org_NetState_Infos";
        SqlDataReader dr = new SqlHelper().RunDataReader(_str);
        if (dr.Read())
        {
            PARENTER = dr["Com_NetPartner"].ToString();
            KEY = dr["Com_NetKey"].ToString();
        }
    }
//得到定单的状态 现只有0和1 两种
    private int OrderStaus(string Orderid)
    {
        int status = 0;
        SqlParameter par = new SqlParameter("@TransID", SqlDbType.VarChar);
        par.Value = Orderid;
        string _strOrder = "SELECT Org_Payment_Resualt FROM dbo.Org_Payment_Infos where Org_Payment_ID=@TransID";
        using (SqlDataReader dr = new SqlHelper().RunDataReader(_strOrder, par))
        {
            if (dr.Read())
            {
                status = Convert.ToInt32(dr[0].ToString());
            }
        }
        return status;
    }





问题出在哪里?为什么修改状为1每次都是失败,没有异常  而且  更新语句是执行了的,
我还想问一下,支付宝 返回页面和通知页面  这两个页面是不是可以同时存在?为什么我写的这个始终没有看到通知的那个页面(notify_url.aspx) ? 两上地址都传过的....
问题出在哪里?应该怎么解决?

#4


你还是好好看看支付宝的接口文档吧

return_url.aspx这个文件是支付成功后,转到你网站的一个页面,这个页面可以写数据库操作,也可以不操作数据库,就光写“您已支持成功”都行

另外notify_url.aspx这个文件属于通知页面,也就是支付宝有什么操作了,通知你网站更改状态的页面,一般更改订单状态值都是在这个页面去写。

#5


比如说,会员付款成功了,支付宝那面会通过notify_url.aspx这个页面给你的网站传递一些参数,你根据这些参数更改订单状态

卖家发货了,也会通过notify_url.aspx这个页面给你传递的

买家确认收货的时候也是这样

#6


另外,测试notify_url.aspx的时候要上传到公网测试的!!本地是测试不到数据的

#7


引用 2 楼 sy_binbin 的回复:
string _ChangeState = "UPDATE Org_Payment_Infos SET Org_Payment_Resualt=1 WHERE Org_Payment_ID=@OrderID";
  SqlParameter[] par = new SqlParameter[] { 
  new SqlParameter("@OrderID", SqlDbType.VarCha……


这位大哥说的好啊,貌似是这么回事儿,我真的把那个给传错了!!

#8


引用 4 楼 sy_binbin 的回复:
你还是好好看看支付宝的接口文档吧

return_url.aspx这个文件是支付成功后,转到你网站的一个页面,这个页面可以写数据库操作,也可以不操作数据库,就光写“您已支持成功”都行

另外notify_url.aspx这个文件属于通知页面,也就是支付宝有什么操作了,通知你网站更改状态的页面,一般更改订单状态值都是在这个页面去写。


另外notify_url.aspx这个文件属于通知页面,也就是支付宝有什么操作了,通知你网站更改状态的页面,一般更改订单状态值都是在这个页面去写。
支付宝支付成功会不会弹出通知页面?测试了好多次都没有见!!!呵呵 我现在这个程序支付成功,跳转到返回页面,我在返回页面改状态,

#9


引用 6 楼 sy_binbin 的回复:
另外,测试notify_url.aspx的时候要上传到公网测试的!!本地是测试不到数据的

我不是在本地测试 的

#10


支付宝不会弹出通知页面的!!

建议还是在通知页面改状态,返回页面你只能获得到支付成功的状态

那发货状态,确认收货状态,退货状态你都获取不到

我看你还是没理解支付宝接口的原理,你好好再看看文档吧!

我当时是花了一个星期研究这个东西的!

#11


支付宝支付成功更改状态有点儿问题,纠结呀...异常嫉妒地飘过。。。

#12


引用 9 楼 cyw1592951 的回复:
引用 6 楼 sy_binbin 的回复:
另外,测试notify_url.aspx的时候要上传到公网测试的!!本地是测试不到数据的

我不是在本地测试 的

我刚接触这个东西,听你这么一说我明白了许多....受教了!

#13


谢谢sy_binbin呀,现在已经搞定了,就是我传错了参数,太马虎了

#14


该回复于2011-04-13 13:31:01被版主删除

#15


看过大神的帖子,顿时茅塞顿开。。。在这个坑里已经爬了几天了。。

#16


看过大神的帖子,顿时茅塞顿开。。。在这个坑里已经爬了几天了。。

#1


以下是sqlHelp方法的代码

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
/// <summary>
/// SqlHelper 的摘要说明 
/// </summary>
public class SqlHelper
{
    /// <summary>
    /// 构造函数,初始化SqlConnection对象
    /// </summary>
    public SqlHelper()
    {
        conn = new SqlConnection(ConfigurationManager.AppSettings["ConStr"]);
    }
    SqlConnection conn;

    /// <summary>
    ///打开数据库连接
    /// </summary>
    void OpenConnection()
    {
        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }
    }
    /// <summary>
    /// 关闭数据库连接
    /// </summary>
    void CloseConnection()
    {
        if (conn.State == ConnectionState.Open)
        {
            conn.Close();
        }
    }

    ///使用数据阅读器(包括有参和无参的Sql语句,有参和无参数的存储过程)
    ///查询数据,每次向下读取一条数据
    #region
    /// <summary>
    /// 1.执行数据阅读器
    /// </summary>
    /// <param name="sql">无参数的Sql语句</param>
    /// <returns>返回SqlDataReader</returns>
    public SqlDataReader RunDataReader(string sql)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            OpenConnection();
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        catch (Exception ex)
        {
            conn.Close();
            throw new Exception(ex.Message);
        }
        finally
        {          
        }
    }

    /// <summary>
    /// 2.使用数据阅读器
    /// </summary>
    /// <param name="CommandText">无参数的存储过程名称</param>
    /// <returns>数据阅读器</returns>
    public SqlDataReader RunDataReaderProc(string CommandText)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(CommandText, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            OpenConnection();
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        catch (Exception ex)
        {
            conn.Close();
            throw new Exception(ex.Message);
        }
        finally
        {
          
        }
    }

    public SqlDataReader RunDataReader(string sql,SqlParameter parmer)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            OpenConnection();
            cmd.Parameters.Add(parmer);
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        catch (Exception ex)
        {
            conn.Close();
            throw new Exception(ex.Message);
        }
        finally 
        {           
        }
    }
    /// <summary>
    /// 3.执行数据阅读器,有参数的Sql语句
    /// </summary>
    /// <param name="sql">Sql语句</param>
    /// <param name="param">Sql语句中的参数</param>
    /// <returns>数据阅读器</returns>
    public SqlDataReader RunDataReader(string sql, params SqlParameter[] param)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            OpenConnection();
            foreach (SqlParameter p in param)
            {
                cmd.Parameters.Add(p);
            }
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        catch (Exception ex)
        {
            conn.Close();
            throw new Exception(ex.Message);
        }
        finally
        {
        }
    }
    /// <summary>
    /// 4.执行数据阅读器
    /// </summary>
    /// <param name="CommandText">存储过程名称</param>
    /// <param name="param">参数数组</param>
    /// <returns>返回数据阅读器</returns>
 

#2


string _ChangeState = "UPDATE Org_Payment_Infos SET Org_Payment_Resualt=1 WHERE  Org_Payment_ID=@OrderID";
                        SqlParameter[] par = new SqlParameter[] { 
                           new SqlParameter("@OrderID", SqlDbType.VarChar)
                        };
                        par[0].Value =  trade_no;


你要搞明白红色这2处的关系

trade_no是支付宝那面返回来的支付宝交易号,和你网站数据库中的订单编号不是一个

你把trade_no改成order_no试试

#3



   public SqlDataReader RunDataReaderProc(string CommandText, params SqlParameter[] param)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(CommandText, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            foreach (SqlParameter p in param)
            {
                cmd.Parameters.Add(p);
            }
            OpenConnection();
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        catch (Exception ex)
        {
            conn.Close();
            throw new Exception(ex.Message);
        }
        finally
        {
            
        }

    }
    #endregion


    ///使用数据适配器(包括有参和无参的Sql语句,有参和无参数的存储过程)
    ///查询数据,一次读取大量数据
    #region
    /// <summary>
    /// 1.使用数据适配器
    /// </summary>
    /// <param name="sql">无参数的Sql语句</param>
    /// <returns>DataSet数据集</returns>
    public DataSet RunDataAdapter(string sql)
    {
        try
        {
            SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
            DataSet ds = new DataSet();
            sda.Fill(ds);
            return ds;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }

    /// <summary>
    /// 2.使用数据适配器
    /// </summary>
    /// <param name="CommandText">无参数的存储过程</param>
    /// <returns>DataSet数据集</returns>
    public DataSet RunDataAdapterProc(string CommandText)
    {
        try
        {
            SqlDataAdapter sda = new SqlDataAdapter(CommandText, conn);
            sda.SelectCommand.CommandType = CommandType.StoredProcedure;
            DataSet ds = new DataSet();
            sda.Fill(ds);
            return ds;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }

    /// <summary>
    /// 3.使用数据适配器
    /// </summary>
    /// <param name="CommandText">有参数的存储过程</param>
    /// <param name="param">参数数组</param>
    /// <returns>DataSet数据集</returns>
    public DataSet RunDataAdapterProc(string CommandText, params SqlParameter[] param)
    {
        try
        {
            SqlDataAdapter sda = new SqlDataAdapter(CommandText, conn);
            sda.SelectCommand.CommandType = CommandType.StoredProcedure;    //声明CommandText为存储过程
            foreach (SqlParameter p in param)                               //添加每个参数
            {
                sda.SelectCommand.Parameters.Add(p);
            }
            DataSet ds = new DataSet();
            sda.Fill(ds);
            return ds;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }
    /// <summary>
    /// 3使用数据适配器
    /// </summary>
    /// <param name="sql">有参的Sql语句</param>
    /// <param name="param">参数</param>
    /// <returns></returns>
    public DataSet RunDataAdapter(string sql, SqlParameter param)
    {
        try
        {
            SqlDataAdapter sda = new SqlDataAdapter(sql, conn);           
            sda.SelectCommand.Parameters.Add(param);          
            DataSet ds = new DataSet();
            sda.Fill(ds);
            return ds;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }
    /// <summary>
    /// 4.使用数据适配器
    /// </summary>
    /// <param name="sql">有参的Sql语句</param>
    /// <param name="param">参数数组</param>
    /// <returns>DataSet数据集</returns>
    public DataSet RunDataAdapter(string sql, params SqlParameter[] param)
    {
        try
        {
            SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
            foreach (SqlParameter p in param)                               //添加每个参数
            {
                sda.SelectCommand.Parameters.Add(p);
            }
            DataSet ds = new DataSet();
            sda.Fill(ds);
            return ds;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }
    #endregion



    ///使用ExecuteNonQuery
    ///1.执行插入,更新,删除操作
    #region
    /// <summary>
    /// 执行插入,更新,删除操作
    /// </summary>
    /// <param name="CommandText">有参存储过程名称</param>
    /// <param name="param">参数数组</param>
    /// <returns>返回影响的行数</returns>
    public int ExecuteNonQueryProc(string CommandText, params SqlParameter[] param)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(CommandText, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            foreach (SqlParameter p in param)
            {
                cmd.Parameters.Add(p);
            }
            OpenConnection();
            int i = cmd.ExecuteNonQuery();
            return i;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }

    }

    /// <summary>
    /// 2.执行插入,更新,删除操作
    /// </summary>
    /// <param name="CommandText">无参的存储过程名称</param>
    /// <returns>返回影响的行数</returns>
    public int ExecuteNonQueryProc(string CommandText)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(CommandText, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            OpenConnection();
            int i = cmd.ExecuteNonQuery();
            return i;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }

    }
    /// <summary>
    /// 3.执行插入,更新,删除操作
    /// </summary>
    /// <param name="sql">有参的Sql语句</param>
    /// <param name="param">参数数组</param>
    /// <returns>返回影响的行数</returns>
    public int ExecuteNonQuery(string sql, params SqlParameter[] param)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            foreach (SqlParameter p in param)
            {
                cmd.Parameters.Add(p);
            }
            OpenConnection();
            int i = cmd.ExecuteNonQuery();
            return i;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }
    public int ExecuteNonQuery(string sql, SqlParameter param)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            OpenConnection();
            cmd.Parameters.Add(param);
            int i = cmd.ExecuteNonQuery();
            return i;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }
    /// <summary>
    /// 4.执行插入,更新,删除
    /// </summary>
    /// <param name="sql">无参的Sql语句</param>
    /// <returns>影响的行数</returns>
    public int ExecuteNonQuery(string sql)
    {
        try
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            OpenConnection();
            int i = cmd.ExecuteNonQuery();
            return i;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            CloseConnection();
        }
    }
    #endregion
}



//获得商户的编号和key用来验证
 private void GetKeyEmail()
    {
        string _str = "SELECT top 1 Com_NetUrl,Com_NetPartner,Com_NetKey,Com_NetEmail  FROM dbo.Org_NetState_Infos";
        SqlDataReader dr = new SqlHelper().RunDataReader(_str);
        if (dr.Read())
        {
            PARENTER = dr["Com_NetPartner"].ToString();
            KEY = dr["Com_NetKey"].ToString();
        }
    }
//得到定单的状态 现只有0和1 两种
    private int OrderStaus(string Orderid)
    {
        int status = 0;
        SqlParameter par = new SqlParameter("@TransID", SqlDbType.VarChar);
        par.Value = Orderid;
        string _strOrder = "SELECT Org_Payment_Resualt FROM dbo.Org_Payment_Infos where Org_Payment_ID=@TransID";
        using (SqlDataReader dr = new SqlHelper().RunDataReader(_strOrder, par))
        {
            if (dr.Read())
            {
                status = Convert.ToInt32(dr[0].ToString());
            }
        }
        return status;
    }





问题出在哪里?为什么修改状为1每次都是失败,没有异常  而且  更新语句是执行了的,
我还想问一下,支付宝 返回页面和通知页面  这两个页面是不是可以同时存在?为什么我写的这个始终没有看到通知的那个页面(notify_url.aspx) ? 两上地址都传过的....
问题出在哪里?应该怎么解决?

#4


你还是好好看看支付宝的接口文档吧

return_url.aspx这个文件是支付成功后,转到你网站的一个页面,这个页面可以写数据库操作,也可以不操作数据库,就光写“您已支持成功”都行

另外notify_url.aspx这个文件属于通知页面,也就是支付宝有什么操作了,通知你网站更改状态的页面,一般更改订单状态值都是在这个页面去写。

#5


比如说,会员付款成功了,支付宝那面会通过notify_url.aspx这个页面给你的网站传递一些参数,你根据这些参数更改订单状态

卖家发货了,也会通过notify_url.aspx这个页面给你传递的

买家确认收货的时候也是这样

#6


另外,测试notify_url.aspx的时候要上传到公网测试的!!本地是测试不到数据的

#7


引用 2 楼 sy_binbin 的回复:
string _ChangeState = "UPDATE Org_Payment_Infos SET Org_Payment_Resualt=1 WHERE Org_Payment_ID=@OrderID";
  SqlParameter[] par = new SqlParameter[] { 
  new SqlParameter("@OrderID", SqlDbType.VarCha……


这位大哥说的好啊,貌似是这么回事儿,我真的把那个给传错了!!

#8


引用 4 楼 sy_binbin 的回复:
你还是好好看看支付宝的接口文档吧

return_url.aspx这个文件是支付成功后,转到你网站的一个页面,这个页面可以写数据库操作,也可以不操作数据库,就光写“您已支持成功”都行

另外notify_url.aspx这个文件属于通知页面,也就是支付宝有什么操作了,通知你网站更改状态的页面,一般更改订单状态值都是在这个页面去写。


另外notify_url.aspx这个文件属于通知页面,也就是支付宝有什么操作了,通知你网站更改状态的页面,一般更改订单状态值都是在这个页面去写。
支付宝支付成功会不会弹出通知页面?测试了好多次都没有见!!!呵呵 我现在这个程序支付成功,跳转到返回页面,我在返回页面改状态,

#9


引用 6 楼 sy_binbin 的回复:
另外,测试notify_url.aspx的时候要上传到公网测试的!!本地是测试不到数据的

我不是在本地测试 的

#10


支付宝不会弹出通知页面的!!

建议还是在通知页面改状态,返回页面你只能获得到支付成功的状态

那发货状态,确认收货状态,退货状态你都获取不到

我看你还是没理解支付宝接口的原理,你好好再看看文档吧!

我当时是花了一个星期研究这个东西的!

#11


支付宝支付成功更改状态有点儿问题,纠结呀...异常嫉妒地飘过。。。

#12


引用 9 楼 cyw1592951 的回复:
引用 6 楼 sy_binbin 的回复:
另外,测试notify_url.aspx的时候要上传到公网测试的!!本地是测试不到数据的

我不是在本地测试 的

我刚接触这个东西,听你这么一说我明白了许多....受教了!

#13


谢谢sy_binbin呀,现在已经搞定了,就是我传错了参数,太马虎了

#14


该回复于2011-04-13 13:31:01被版主删除

#15


看过大神的帖子,顿时茅塞顿开。。。在这个坑里已经爬了几天了。。

#16


看过大神的帖子,顿时茅塞顿开。。。在这个坑里已经爬了几天了。。