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试试
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这个文件属于通知页面,也就是支付宝有什么操作了,通知你网站更改状态的页面,一般更改订单状态值都是在这个页面去写。
return_url.aspx这个文件是支付成功后,转到你网站的一个页面,这个页面可以写数据库操作,也可以不操作数据库,就光写“您已支持成功”都行
另外notify_url.aspx这个文件属于通知页面,也就是支付宝有什么操作了,通知你网站更改状态的页面,一般更改订单状态值都是在这个页面去写。
#5
比如说,会员付款成功了,支付宝那面会通过notify_url.aspx这个页面给你的网站传递一些参数,你根据这些参数更改订单状态
卖家发货了,也会通过notify_url.aspx这个页面给你传递的
买家确认收货的时候也是这样
卖家发货了,也会通过notify_url.aspx这个页面给你传递的
买家确认收货的时候也是这样
#6
另外,测试notify_url.aspx的时候要上传到公网测试的!!本地是测试不到数据的
#7
这位大哥说的好啊,貌似是这么回事儿,我真的把那个给传错了!!
#8
另外notify_url.aspx这个文件属于通知页面,也就是支付宝有什么操作了,通知你网站更改状态的页面,一般更改订单状态值都是在这个页面去写。
支付宝支付成功会不会弹出通知页面?测试了好多次都没有见!!!呵呵 我现在这个程序支付成功,跳转到返回页面,我在返回页面改状态,
#9
我不是在本地测试 的
#10
支付宝不会弹出通知页面的!!
建议还是在通知页面改状态,返回页面你只能获得到支付成功的状态
那发货状态,确认收货状态,退货状态你都获取不到
我看你还是没理解支付宝接口的原理,你好好再看看文档吧!
我当时是花了一个星期研究这个东西的!
建议还是在通知页面改状态,返回页面你只能获得到支付成功的状态
那发货状态,确认收货状态,退货状态你都获取不到
我看你还是没理解支付宝接口的原理,你好好再看看文档吧!
我当时是花了一个星期研究这个东西的!
#11
异常嫉妒地飘过。。。
#12
我刚接触这个东西,听你这么一说我明白了许多....受教了!
#13
谢谢sy_binbin呀,现在已经搞定了,就是我传错了参数,太马虎了
#14
#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试试
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这个文件属于通知页面,也就是支付宝有什么操作了,通知你网站更改状态的页面,一般更改订单状态值都是在这个页面去写。
return_url.aspx这个文件是支付成功后,转到你网站的一个页面,这个页面可以写数据库操作,也可以不操作数据库,就光写“您已支持成功”都行
另外notify_url.aspx这个文件属于通知页面,也就是支付宝有什么操作了,通知你网站更改状态的页面,一般更改订单状态值都是在这个页面去写。
#5
比如说,会员付款成功了,支付宝那面会通过notify_url.aspx这个页面给你的网站传递一些参数,你根据这些参数更改订单状态
卖家发货了,也会通过notify_url.aspx这个页面给你传递的
买家确认收货的时候也是这样
卖家发货了,也会通过notify_url.aspx这个页面给你传递的
买家确认收货的时候也是这样
#6
另外,测试notify_url.aspx的时候要上传到公网测试的!!本地是测试不到数据的
#7
这位大哥说的好啊,貌似是这么回事儿,我真的把那个给传错了!!
#8
另外notify_url.aspx这个文件属于通知页面,也就是支付宝有什么操作了,通知你网站更改状态的页面,一般更改订单状态值都是在这个页面去写。
支付宝支付成功会不会弹出通知页面?测试了好多次都没有见!!!呵呵 我现在这个程序支付成功,跳转到返回页面,我在返回页面改状态,
#9
我不是在本地测试 的
#10
支付宝不会弹出通知页面的!!
建议还是在通知页面改状态,返回页面你只能获得到支付成功的状态
那发货状态,确认收货状态,退货状态你都获取不到
我看你还是没理解支付宝接口的原理,你好好再看看文档吧!
我当时是花了一个星期研究这个东西的!
建议还是在通知页面改状态,返回页面你只能获得到支付成功的状态
那发货状态,确认收货状态,退货状态你都获取不到
我看你还是没理解支付宝接口的原理,你好好再看看文档吧!
我当时是花了一个星期研究这个东西的!
#11
异常嫉妒地飘过。。。
#12
我刚接触这个东西,听你这么一说我明白了许多....受教了!
#13
谢谢sy_binbin呀,现在已经搞定了,就是我传错了参数,太马虎了
#14
#15
看过大神的帖子,顿时茅塞顿开。。。在这个坑里已经爬了几天了。。
#16
看过大神的帖子,顿时茅塞顿开。。。在这个坑里已经爬了几天了。。