到帐接口,怎样获取到支付成功,支付宝接口返回20001返回的信息,比

1257人阅读
django(19)
因工作需要研究了支付宝即时到帐接口,并成功应用到网站上,把过程拿出来分享。
即时到帐只是支付宝众多商家服务中的一个,表示客户付款,客户用支付宝付款,支付宝收到款项后,马上通知你,并且此笔款项与交易脱离关系,商家可以马上使用。
即时到帐只对企业客户服务,注册成功企业账号以后,申请签约即时到帐产品,大约3-5个工作日后,签约成功,可以马上进入集成产品阶段。
这个是支付宝提供的接口,有asp,c#,,四种语言的,每种语言提供GBK和UTF-8两种方案。另带一份支付宝的文档,这份文档我感觉本来简单的事情越说越麻烦了。
/public/api/base/alipaydirect.zip
网上搜了一下,发现接口有几个现成的方案。
/fengli/alipay_python
这两个是一个,代码我还没看,写文档的时候发现的。
/lxneng/alipay
https://pypi.python.org/pypi/alipay/0.2.2
支付宝即时到帐交易过程。
商家:是指支付宝的企业客户。也就是你集成服务单位。
终端消费者:是指在网上购物的消费者,你集成服务单位的客户。
1、终端消费者在商家网站选择商品,下订单。
2、商家把支付信息,get到支付宝指定的链接。
3、终端消费者在支付宝的网站上操作付款。
4、付款成功后,支付宝post付款成功的信息到商家预先提供的地址。
5、支付宝在终端消费者付款成功后三秒后,通过get跳回商家指定的链接。
第4步跟终端消费者操作付款的跳转无关,所以被称为异步通知。这一步,支付宝期待你返回'success',如果你不返回'success',支付宝会于4分钟后再次post付款成功的信息,此后每10分钟post一次,至少30分钟内如此。如果终端消费者付款失败,异步通知不会发生。
通过集成,我知道为什么终端消费者付款成功后要等3秒后跳转回商家页面了,因为它要等异步通知的信息先到达,先处理订单,再带终端消费者回到客户的界面,这样就可以看到支付成功的页面了。当然付款失败,异步通知不发生,订单状态没有改变,终端消费者就只能看到付款失败的信息。
了解了支付过程,开始设计程序。
1、生成商品订单。终端消费者选择商品生成商品订单。ID号要唯一,这个唯一不是要你采用UUID,而是跟支付宝往来过程唯一即可,从1递增也可以,只是终端消费者能看到这个id,所以最好采用固定长度的字符串,终端消费者如果知道自己是第一个客户,会不会心里发怵?后面会谈到,为了安全不仅不能用递增,而且至少要6位随机码以上。
2、选择支付方式。因为我们仅仅集成了即时到帐,所以只有支付宝付款一个选项。把支付方式加入订单信息,同时把订单id post到下一步地址,这一步post,最好采用新开页面,本页面弹出对话框,让客户自己选择支付成功或者支付失败。
3、发送支付信息。根据post过来的订单号组合信息,get方式发送数据给支付宝,同时带动终端消费者页面跳转到支付宝支付页面。
4、接受异步通知。
5、支付成功后支付宝跳转回来的程序。因为回来时get方式,为避免终端消费者看到更多敏感信息,这一步并没有渲染页面,而是处理信息,跳转到另外一个页面。
6、显示支付结果。这个页面和第2步让客户点击支付成功跳转的是同一个。支付失败,就跳转到一个说明吧。
[python]&&
hashcompact.py
[python]&&
[python]&&
[python]&&
view.py中的代码仅供参考!
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:61531次
排名:千里之外
原创:29篇
转载:25篇
(2)(8)(6)(4)(4)(3)(2)(1)(2)(2)(4)(1)(3)(7)(4)(4)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'asp.net 支付宝及时到帐接口使用详解
字体:[ ] 类型:转载 时间:
这两天写支付宝接口, 这个话题不新了, 因为很多人都 做过了, 在这里我说说我的看法吧, 先说一下实现
其实支付宝公司已经给我们做的很好了, 只要少量的改动就OK了,只是有的程序员不太明天他们的动作流程而以,我就以及时到帐为例子来说了,呵呵
在这之前就大家先下载一下c#版的及时到帐代码&&& 这里是下载地址
先看一下程序的结构吧
支付宝有一个类文件叫& AliPay 是一些加密算法之类的东西,包括构造URL
要吧看一下这个类的全部内容 代码如下: using System.W using System.T using System.Security.C using System.IO; using System.N using S /// &summary& /// New Interface for AliPay /// &/summary& namespace Gateway { public class AliPay { /// &summary& /// 与ASP兼容的MD5加密算法 /// &/summary& public static string GetMD5(string s, string _input_charset) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] t = puteHash(Encoding.GetEncoding(_input_charset).GetBytes(s)); StringBuilder sb = new StringBuilder(32); for (int i = 0; i & t.L i++) { sb.Append(t[i].ToString("x").PadLeft(2, '0')); } return sb.ToString(); } /// &summary& /// 冒泡排序法 /// 按照字母序列从a到z的顺序排列 /// &/summary& public static string[] BubbleSort(string[] r) { int i, //交换标志
for (i = 0; i & r.L i++) //最多做R.Length-1趟排序 { exchange = //本趟排序开始前,交换标志应为假 for (j = r.Length - 2; j &= j--) {//交换条件 if (pareOrdinal(r[j + 1], r[j]) & 0) { temp = r[j + 1]; r[j + 1] = r[j]; r[j] = exchange = //发生了交换,故将交换标志置为真 } } if (!exchange) //本趟排序未发生交换,提前终止算法 {
} /// &summary& /// 生成URL链接或加密结果 /// &/summary& /// &param name="para"&参数加密数组&/param& /// &param name="_input_charset"&编码格式&/param& /// &param name="sign_type"&加密类型&/param& /// &param name="key"&安全校验码&/param& /// &returns&字符串URL或加密结果&/returns& public static string CreatUrl( //string gateway,//GET方式传递参数时请去掉注释 string[] para, string _input_charset, string sign_type, string key ) {
//进行排序; string[] Sortedstr = BubbleSort(para); //构造待md5摘要字符串 ; StringBuilder prestr = new StringBuilder(); for (i = 0; i & Sortedstr.L i++) { if (i == Sortedstr.Length - 1) { prestr.Append(Sortedstr[i]); } else { prestr.Append(Sortedstr[i] + "&"); } } prestr.Append(key); //生成Md5摘要; string sign = GetMD5(prestr.ToString(), _input_charset); //以下是POST方式传递参数
//以下是GET方式传递参数 //构造支付Url; // char[] delimiterChars = { '='}; // StringBuilder parameter = new StringBuilder(); // parameter.Append(gateway); // for (i = 0; i & Sortedstr.L i++) // {//UTF-8格式的编码转换 // parameter.Append(Sortedstr[i].Split(delimiterChars)[0] + "=" + HttpUtility.UrlEncode(Sortedstr[i].Split(delimiterChars)[1]) + "&"); // } // // parameter.Append("sign=" + sign + "&sign_type=" + sign_type); // // //返回支付Url; // return parameter.ToString(); } //获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求 public static string Get_Http(string a_strUrl, int timeout) { string strR try { HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(a_strUrl); myReq.Timeout = HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse(); Stream myStream = HttpWResp.GetResponseStream(); StreamReader sr = new StreamReader(myStream, Encoding.Default); StringBuilder strBuilder = new StringBuilder(); while (-1 != sr.Peek()) { strBuilder.Append(sr.ReadLine()); } strResult = strBuilder.ToString(); } catch (Exception exp) { strResult = "错误:" + exp.M } return strR } } } 而我们一般不用管这个类,只要保证能调用 的到就行了,不用管他
&&& 我们要做的很少,他是怎么工作的呢,
&& 这是开发文档里的工作图
其实我们要处理的只有三个Aspx的文件,
先看第一个吧&& Default.aspx
这是一个请求的界面 代码如下: using S using System.D using System.C using System.W using System.Web.S using System.Web.UI; using System.Web.UI.WebC using System.Web.UI.WebControls.WebP using System.Web.UI.HtmlC using G public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void BtnAlipay_Click(object sender, EventArgs e) { //业务参数赋值; string gateway = "/cooperate/gateway.do?"; //支付接口 string service = "create_direct_pay_by_user"; //服务名称,这个是识别是何接口实现何功能的标识,请勿修改 string seller_email = "写自己的"; //商家签约时的支付宝帐号,即收款的支付宝帐号 string sign_type = "MD5"; //加密类型,签名方式“不用改” string key = "写自己的"; //安全校验码,与partner是一组,获取方式是:用签约时支付宝帐号登陆支付宝网站,在商家服务我的商家里即可查到。 string partner = "写自己的"; //商户ID,合作身份者ID,合作伙伴ID string _input_charset = "utf-8"; //编码类型,完全根据客户自身的项目的编码格式而定,千万不要填错。否则极其容易造成MD5加密错误。 string show_url = "/"; //展示地址,即在支付页面时,商品名称旁边的“详情”的链接地址。 string out_trade_no = TxtOrderno.Text.Trim(); //客户自己的订单号,订单号必须在自身订单系统中保持唯一性 string subject = "4.0系统支付宝充值"; //商品名称,也可称为订单名称,该接口并不是单一的只能买一样东西,可把一次支付当作一次下订单 string body = "商户:" + TxtOrderno.Text.Trim() + "通过支付宝给自己充值:" + TxtTotal_fee.Text.Trim() + "元"; //商品描述,即备注 string total_fee = TxtTotal_fee.Text.Trim(); //商品价格,也可称为订单的总金额 //服务器通知url(Alipay_Notify.aspx文件所在路经),必须是完整的路径地址 string notify_url = http://0.0.6.108/Alipay/Alipay_Notify. //服务器返回url(Alipay_Return.aspx文件所在路经),必须是完整的路径地址 string return_url = http://0.0.6.108/Alipay/Alipay_Return. //构造数组; //以下数组即是参与加密的参数,若参数的值不允许为空,若该参数为空,则不要成为该数组的元素 string[] para ={ "service="+service, "partner=" + partner, "seller_email=" + seller_email, "out_trade_no=" + out_trade_no, "subject=" + subject, "body=" + body, "total_fee=" + total_fee, "show_url=" + show_url, "payment_type=1", "notify_url=" + notify_url, "return_url=" + return_url, "_input_charset="+_input_charset }; //支付URL生成 string aliay_url = AliPay.CreatUrl( //gateway,//GET方式传递参数时请去掉注释 para, _input_charset, sign_type, key ); //以下是GET方式传递参数 //Response.Redirect(aliay_url); //以下是POST方式传递参数 Response.Write("&form name='alipaysubmit' method='post' action='/cooperate/gateway.do?_input_charset=utf-8'&"); Response.Write("&input type='hidden' name='service' value=" + service + "&"); Response.Write("&input type='hidden' name='partner' value=" + partner + "&"); Response.Write("&input type='hidden' name='seller_email' value=" + seller_email + "&"); Response.Write("&input type='hidden' name='out_trade_no' value=" + out_trade_no + "&"); Response.Write("&input type='hidden' name='subject' value=" + subject + "&"); Response.Write("&input type='hidden' name='body' value=" + body + "&"); Response.Write("&input type='hidden' name='total_fee' value=" + total_fee + "&"); Response.Write("&input type='hidden' name='show_url' value=" + show_url + "&"); Response.Write("&input type='hidden' name='return_url' value=" + return_url + "&"); Response.Write("&input type='hidden' name='notify_url' value=" + notify_url + "&"); Response.Write("&input type='hidden' name='payment_type' value=1&"); Response.Write("&input type='hidden' name='sign' value=" + aliay_url + "&"); Response.Write("&input type='hidden' name='sign_type' value=" + sign_type + "&"); Response.Write("&/form&"); Response.Write("&script&"); Response.Write("document.alipaysubmit.submit()"); Response.Write("&/script&"); } }
代码里的key和 partner的获取方法
现在我们只要按代码里的信息填写一样就可以了,
然后远行网页
下面的操作就是在支付平台的完成了, 跟咱的程序没有关系了
现在我们应该想,那付完钱之后呢?
我们有两个界面来处理这个问题一个是
Alipay_Return.aspx 代码如下:using S using System.D using System.C using System.C using System.W using System.Web.S using System.Web.UI; using System.Web.UI.WebC using System.Web.UI.WebControls.WebP using System.Web.UI.HtmlC using System.T using System.Collections.S using System.IO; using G /// &summary& /// 创建该页面文件时,请留心该页面文件是可以对其进行美工处理的,原因在于支付完成以后,当前窗口会从支付宝的页面跳转回这个页面。 /// 该页面称作“返回页”,是同步被支付宝服务器所调用,可当作是支付完成后的提示信息页,如“您的某某某订单,多少金额已支付成功”。 /// &/summary& public partial class Alipay_Return : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string alipayNotifyURL = "/cooperate/gateway.do?service=notify_verify"; //string alipayNotifyURL = "/trade/notify_query.do?";//此路径是在上面链接地址无法起作用时替换使用。 string key = "写自己的"; //partner 的对应交易安全校验码(必须填写) string partner = "写自己的"; //partner合作伙伴id(必须填写) string _input_charset = "utf-8";//编码类型,完全根据客户自身的项目的编码格式而定,千万不要填错。否则极其容易造成MD5加密错误。 alipayNotifyURL = alipayNotifyURL + "&partner=" + partner + "&notify_id=" + Request.QueryString["notify_id"]; //获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的 string responseTxt = AliPay.Get_Http(alipayNotifyURL, 120000); //*******加密签名程序开始//*******
NameValueC //Load Form variables into NameValueCollection variable. coll = Request.QueryS // Get names of all forms into a string array. String[] requestarr = coll.AllK //进行排序; string[] Sortedstr = AliPay.BubbleSort(requestarr); //构造待md5摘要字符串 ; StringBuilder prestr = new StringBuilder(); for (i = 0; i & Sortedstr.L i++) { if (Request.Form[Sortedstr[i]] != "" && Sortedstr[i] != "sign" && Sortedstr[i] != "sign_type") { if (i == Sortedstr.Length - 1) { prestr.Append(Sortedstr[i] + "=" + Request.QueryString[Sortedstr[i]]); } else { prestr.Append(Sortedstr[i] + "=" + Request.QueryString[Sortedstr[i]] + "&"); } } } prestr.Append(key); //生成Md5摘要; string mysign = AliPay.GetMD5(prestr.ToString(), _input_charset); //*******加密签名程序结束******* string sign = Request.QueryString["sign"]; // Response.Write(prestr.ToString()); //调试用,支付宝服务器返回时的完整路径。 if (mysign == sign && responseTxt == "true") //验证支付发过来的消息,签名是否正确 { //更新自己数据库的订单语句,请自己填写一下 string strOrderNO = Request.QueryString["out_trade_no"];//订单号 string strPrice = Request.QueryString["total_fee"];//金额 string strTradeStatus = Request.QueryString["TRADE_STATUS"];//订单状态 //生成对象 //OfficeFinanceServices objOfficeFinanceServices = new OfficeFinanceServices(); //订单信息 string[] login = strOrderNO.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); ////查询当前的余额 //decimal objdm = objOfficeFinanceServices.OfficeFinanceSelect(Convert.ToInt32(login[0].ToString().Trim()), true); //OfficeFinance objofficeFinance = new OfficeFinance(); //objofficeFinance.ofId = Convert.ToInt32(login[0].ToString().Trim()); //objofficeFinance.ofOrid = "cz"; //objofficeFinance.ofTime = DateTime.N //objofficeFinance.ofType = 1; //objofficeFinance.ofAmount = Convert.ToDecimal(strPrice.ToString().Trim()); //objofficeFinance.ofRemainAmount = Convert.ToDecimal(strPrice.ToString().Trim()) + //objofficeFinance.ofIsCurrentValue = 1; //objofficeFinance.ofUserId = -10; //objofficeFinance.ofNote1 = "支付宝上帐:" + strPrice.ToString().Trim() + "元"; //objofficeFinance.ofNote2 = "商户:" + login[1].ToString().Trim() + " 通过支付宝上帐金额:" + strPrice + "元"; //objOfficeFinanceServices.addOfficeFinanceOne(objofficeFinance); Response.Write("商户:" + login[1].ToString().Trim() + "&br&金额:" + strPrice + " 交易成功"); //成功,可美化该页面,提示信息 ////写文本,纪录支付宝返回消息,比对md5计算结果(如网站不支持写txt文件,可改成写数据库) string TOEXCELLR = "MD5结果:mysign=" + mysign + ",sign=" + sign + ",responseTxt=" + responseTxt + " 交易信息" + "商户:" + login[1].ToString().Trim() + "&br&金额:" + strPrice + " 交易成功"; StreamWriter fs = new StreamWriter(Server.MapPath("Return_DATA/" + DateTime.Now.ToString().Replace(":", "")) + ".txt", false, System.Text.Encoding.Default); fs.Write(TOEXCELLR); fs.Close(); } else { Response.Write("------------------------------------------"); Response.Write("&br&Result:responseTxt=" + responseTxt); Response.Write("&br&Result:mysign=" + mysign); Response.Write("&br&Result:sign=" + sign); Response.Write("支付失败"); ////写文本,纪录支付宝返回消息,比对md5计算结果(如网站不支持写txt文件,可改成写数据库) string TOEXCELLR = "MD5结果:mysign=" + mysign + ",sign=" + sign + ",responseTxt=" + responseT StreamWriter fs = new StreamWriter(Server.MapPath("Return_DATA/" + DateTime.Now.ToString().Replace(":", "")) + ".txt", false, System.Text.Encoding.Default); fs.Write(TOEXCELLR); fs.Close(); //支付失败,提示信息 } } } 这个是当交易成功后要调用 的界面 在这里只要改动一下就行了, 其实我们要做的只是改一下这里,只要在这里更新一下你的数据库就行了, 代码
代码如下: //生成对象 //OfficeFinanceServices objOfficeFinanceServices = new OfficeFinanceServices(); //订单信息 string[] login = strOrderNO.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); ////查询当前的余额 //decimal objdm = objOfficeFinanceServices.OfficeFinanceSelect(Convert.ToInt32(login[0].ToString().Trim()), true); //OfficeFinance objofficeFinance = new OfficeFinance(); //objofficeFinance.ofId = Convert.ToInt32(login[0].ToString().Trim()); //objofficeFinance.ofOrid = "cz"; //objofficeFinance.ofTime = DateTime.N //objofficeFinance.ofType = 1; //objofficeFinance.ofAmount = Convert.ToDecimal(strPrice.ToString().Trim()); //objofficeFinance.ofRemainAmount = Convert.ToDecimal(strPrice.ToString().Trim()) + //objofficeFinance.ofIsCurrentValue = 1; //objofficeFinance.ofUserId = -10; //objofficeFinance.ofNote1 = "支付宝上帐:" + strPrice.ToString().Trim() + "元"; //objofficeFinance.ofNote2 = "商户:" + login[1].ToString().Trim() + " 通过支付宝上帐金额:" + strPrice + "元"; //objOfficeFinanceServices.addOfficeFinanceOne(objofficeFinance);
大家现在会问我为什么会把他们注释了呢? 我测试过,,这个界面呢是只到成功的时候 调用 一次以后就再不会调用 了, 所以这样有一个不好的地方 ,就是有些客户他们对转帐操作的很老手,当交易成功之后不等调用这个界面就关闭了浏览器,这个时候会出现什么问题呢? 那支付宝就再也不会调用这个界面 了,只能等下次交易,钱是打上了,我们也收到了,但是就是没有给客户充上钱,这个时候客户就会打电话到公司,怎么回事啊, 钱打过去了, 可是我这边还没有上帐,我们上支付宝一看有啊,但就是没有上帐 ,怎么办,最后只能手动给客户上了,但又怕他程序再自动上一把,呵呵 所以在这里不我建议使用这个页面,如果你只是修改自己的订单状态的话当然是可以的 修改余额就不要在这里写了,而是写在这个Alipay_Notify.aspx页面里,这个界面是当交易状态 发生变化时就会调用 ,在没有收到成功的消息前就会一直调用, 时效是24小时,这样的话我们就不用管他是不是转到了成功页面了,只要把这个页面挂在网上等通知就行了, 当交易成功的时候上帐 就OK了 代码
代码如下: using S using System.D using System.C using System.C using System.W using System.Web.S using System.Web.UI; using System.Web.UI.WebC using System.Web.UI.WebControls.WebP using System.Web.UI.HtmlC using System.T using System.Collections.S using System.IO; using G using SystemM /// &summary& /// 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。 /// 该页面称作“通知页”,是异步被支付宝服务器所调用。 /// 当支付宝的订单状态改变时,支付宝服务器则会自动调用此页面,因此请做好自身网站订单信息与支付宝上的订单的同步工作 /// &/summary& public partial class Alipay_Notify : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string alipayNotifyURL = "/cooperate/gateway.do?service=notify_verify"; //string alipayNotifyURL = "/trade/notify_query.do?";//此路径是在上面链接地址无法起作用时替换使用。 string partner = "写自己的"; //partner合作伙伴id(必须填写) string key = "写自己的"; //partner 的对应交易安全校验码(必须填写) string _input_charset = "utf-8";//编码类型,完全根据客户自身的项目的编码格式而定,千万不要填错。否则极其容易造成MD5加密错误。 alipayNotifyURL = alipayNotifyURL + "&partner=" + partner + "&notify_id=" + Request.Form["notify_id"]; //获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的 string responseTxt = AliPay.Get_Http(alipayNotifyURL, 120000); //*******加密签名程序开始*******
NameValueC //Load Form variables into NameValueCollection variable. coll = Request.F // Get names of all forms into a string array. String[] requestarr = coll.AllK //进行排序; string[] Sortedstr = AliPay.BubbleSort(requestarr); //构造待md5摘要字符串 ; StringBuilder prestr = new StringBuilder(); for (i = 0; i & Sortedstr.L i++) { if (Request.Form[Sortedstr[i]] != "" && Sortedstr[i] != "sign" && Sortedstr[i] != "sign_type") { if (i == Sortedstr.Length - 1) { prestr.Append(Sortedstr[i] + "=" + Request.Form[Sortedstr[i]]); } else { prestr.Append(Sortedstr[i] + "=" + Request.Form[Sortedstr[i]] + "&"); } } } prestr.Append(key); string mysign = AliPay.GetMD5(prestr.ToString(), _input_charset); //*******加密签名程序结束******* string sign = Request.Form["sign"]; if (mysign == sign && responseTxt == "true") //验证支付发过来的消息,签名是否正确,只要成功进如这个判断里,则表示该页面已被支付宝服务器成功调用 //但判断内出现自身编写的程序相关错误导致通知给支付宝并不是发送success的消息或没有更新客户自身的数据库的情况,请自身程序编写好应对措施,否则查明原因时困难之极 { if (Request.Form["trade_status"] == "WAIT_BUYER_PAY")// 判断支付状态_等待买家付款(文档中有枚举表可以参考) { //更新自己数据库的订单语句,请自己填写一下 string strOrderNO = Request.Form["out_trade_no"];//订单号 string strPrice = Request.Form["total_fee"];//金额 如果你申请了商家购物卷功能,在返回信息里面请不要做金额的判断,否则会校验通过不了。 string TOEXCELL = "MD5结果:mysign=" + mysign + ",sign=" + sign + ",responseTxt=" + responseT StreamWriter f = new StreamWriter(Server.MapPath("Notify_DATA/" + DateTime.Now.ToString().Replace(":", "")) + ".txt", false, System.Text.Encoding.Default); f.Write(TOEXCELL + "订单号:" + strOrderNO.ToString().Trim() + " 金额:" + strPrice.ToString().Trim()); f.Close(); Alipaym objalipay = new Alipaym(); objalipay.APID = strOrderNO; objalipay.addTime = DateTime.N objalipay.total_fee = Convert.ToDecimal(strPrice); objalipay.trade_status = "等待买家付款"; objalipay.Text1 = DateTime.Now.ToString(); objalipay.Text2 = ""; objalipay.Text3 = ""; objalipay.Text4 = ""; objalipay.Text5 = ""; OfficeFinanceServices.Update(objalipay); } else if (Request.Form["trade_status"] == "TRADE_FINISHED" || Request.Form["trade_status"] == "TRADE_SUCCESS")// 判断支付状态_交易成功结束(文档中有枚举表可以参考) { //更新自己数据库的订单语句,请自己填写一下 string strOrderNO = Request.Form["out_trade_no"];//订单号 string strPrice = Request.Form["total_fee"];//金额 //生成对象 OfficeFinanceServices objOfficeFinanceServices = new OfficeFinanceServices(); //订单信息 string[] login = strOrderNO.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); ////查询当前的余额 decimal objdm = objOfficeFinanceServices.OfficeFinanceSelect(Convert.ToInt32(login[0].ToString().Trim()), true); OfficeFinance objofficeFinance = new OfficeFinance(); objofficeFinance.ofId = Convert.ToInt32(login[0].ToString().Trim()); objofficeFinance.ofOrid = "cz"; objofficeFinance.ofTime = DateTime.N objofficeFinance.ofType = 1; objofficeFinance.ofAmount = Convert.ToDecimal(strPrice.ToString().Trim()); objofficeFinance.ofRemainAmount = Convert.ToDecimal(strPrice.ToString().Trim()) + objofficeFinance.ofIsCurrentValue = 1; objofficeFinance.ofUserId = -10; objofficeFinance.ofNote1 = "支付宝上帐:" + strPrice.ToString().Trim() + "元"; objofficeFinance.ofNote2 = "商户:" + login[1].ToString().Trim() + " 通过支付宝上帐金额:" + strPrice + "元"; if (objOfficeFinanceServices.addOfficeFinanceOne(objofficeFinance)) { Response.Write("success"); Alipaym objalipay = new Alipaym(); objalipay.APID = strOrderNO; objalipay.addTime = DateTime.N objalipay.total_fee = Convert.ToDecimal(strPrice); objalipay.trade_status = "交易成功"; objalipay.Text1 = DateTime.Now.ToString(); objalipay.Text2 = ""; objalipay.Text3 = ""; objalipay.Text4 = ""; objalipay.Text5 = ""; OfficeFinanceServices.Update(objalipay); } else { Response.Write("fail"); } } else { //更新自己数据库的订单语句,请自己填写一下 } //Response.Write("success"); //返回给支付宝消息,成功,请不要改写这个success //success与fail及其他字符的区别在于,支付宝的服务器若遇到success时,则不再发送请求通知(即不再调用该页面,让该页面再次运行起来), //若不是success,则支付宝默认没有收到成功的信息,则会反复不停地调用该页面直到失效,有效调用时间是24小时以内。 ////写文本,纪录支付宝返回消息,比对md5计算结果(如网站不支持写txt文件,可改成写数据库) string TOEXCELLR = "MD5结果:mysign=" + mysign + ",sign=" + sign + ",responseTxt=" + responseT StreamWriter fs = new StreamWriter(Server.MapPath("Notify_DATA/" + DateTime.Now.ToString().Replace(":", "")) + ".txt", false, System.Text.Encoding.Default); fs.Write(TOEXCELLR); fs.Close(); } else { Response.Write("fail"); //写文本,纪录支付宝返回消息,比对md5计算结果(如网站不支持写txt文件,可改成写数据库) string TOEXCELLR = "MD5结果:mysign=" + mysign + ",sign=" + sign + ",responseTxt=" + responseT StreamWriter fs = new StreamWriter(Server.MapPath("Notify_DATA/" + DateTime.Now.ToString().Replace(":", "")) + ".txt", false, System.Text.Encoding.Default); fs.Write(TOEXCELLR); fs.Close(); } } }
最好是记录一下日志文件,这样一但出了问题还可以有个参考的地方 我的代码写的有点乱大家可以适当的改一下,呵呵 来自
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 支付宝接口返回参数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信