已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
大型网上购物系统除了能让会员选择货到付款结账方式外,还应该提供一些更方便快捷的网上支付方式。如果网上商店没有足够的实力提供会员直接在网站中建立现金账户的功能,就可以将订单信息转接到支付宝,让会员从支付宝付款。当然就算会员可以在网站上建立自己的现金账户,提供支付宝支付功能也不失为另一种方便快捷的支付方式,这可以给客户提供更多可选的支付方式。首先,网上购物系统必须与支付宝公司签订合作协议,以确保从本购物网站上传到支付宝网站上的订单信息能被正确接收。当会员于购物网站上买下一系列商品并选择支付宝付款方式后,购物系统即将会员购物的订单信息转发到支付宝,网站页面也会转到支付宝的付款页面。此时,支付宝页面会发送一个验证信息到本网站以确认支付宝正确收到订单信息。会员于支付宝网站付款完成后,网站页面会重新跳回本购物网站,同时支付宝会将已付款的订单信息发回本网站以便对本购物网站的数据库进行必要的修改操作。另外本网站还需要向支付宝网站发送一个返回信息,告知支付宝本系统已正确收到付款完毕的订单信息并且已经完成对数据的处理操作。向支付宝网站传送订单信息时主要参数的含义:gateway :支付接口service:识别是何接口实现何功能的表示seller_email:商家签约时的支付宝账号,即收款的支付宝账号key:安全校验码,与partner是一组partner:商户ID,合作伙伴IDsign_type:加密类型 _input_charset:编码类型show_url:展示地址,即在支付宝页面时商品名称旁边的“详情”的链接地址out_trade_no:会员订单编号,订单编号必须在本系统中保持唯一subject:商品名称,也可称为订单名称,该接口并不是单一的只能买一样东西,可把一次支付当作一次下订单body:商品描述,即备注total_fee:商品价格,也可称为订单的总金额源码分析(C#):首先必须建立一个通知页面(Notify.aspx)和一个返回页面(Return.aspx)以接受并验证从支付宝返回的信息并对数据库中相应的订单信息做修改处理操作。Notify.aspx.cs代码 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.Text;using System.Collections.Specialized;using System.IO;using Gateway;/ / 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。/ 该页面称作“通知页”,是异步被支付宝服务器所调用。/ 当支付宝的订单状态改变时,支付宝服务器则会自动调用此页面,因此请做好自身网站订单信息与支付宝上的订单的同步工作/ 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 + ¬ify_id= + Request.Formnotify_id; /获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的 string responseTxt = AliPay.Get_Http(alipayNotifyURL, 120000); /*加密签名程序开始* int i; NameValueCollection coll; /Load Form variables into NameValueCollection variable. coll = Request.Form; / Get names of all forms into a string array. String requestarr = coll.AllKeys; /进行排序; string Sortedstr = AliPay.BubbleSort(requestarr); /构造待md5摘要字符串 ; StringBuilder prestr = new StringBuilder(); for (i = 0; i Sortedstr.Length; i+) if (Request.FormSortedstri != & Sortedstri != sign & Sortedstri != sign_type) if (i = Sortedstr.Length - 1) prestr.Append(Sortedstri + = + Request.FormSortedstri); else prestr.Append(Sortedstri + = + Request.FormSortedstri + &); prestr.Append(key); string mysign = AliPay.GetMD5(prestr.ToString(), _input_charset); /*加密签名程序结束* string sign = Request.Formsign; if (mysign = sign & responseTxt = true) /验证支付发过来的消息,签名是否正确,只要成功进如这个判断里,则表示该页面已被支付宝服务器成功调用 /但判断内出现自身编写的程序相关错误导致通知给支付宝并不是发送success的消息或没有更新客户自身的数据库的情况,请自身程序编写好应对措施,否则查明原因时困难之极 if (Request.Formtrade_status = WAIT_BUYER_PAY)/ 判断支付状态_等待买家付款(文档中有枚举表可以参考) /更新自己数据库的订单语句,请自己填写一下 string strOrderNO = Request.Formout_trade_no;/订单号 string strPrice = Request.Formtotal_fee;/金额 如果你申请了商家购物卷功能,在返回信息里面请不要做金额的判断,否则会校验通过不了。 else if (Request.Formtrade_status = TRADE_FINISHED | Request.Formtrade_status = TRADE_SUCCESS)/ 判断支付状态_交易成功结束(文档中有枚举表可以参考) /更新自己数据库的订单语句,请自己填写一下 string strOrderNO = Request.Formout_trade_no;/订单号 string strPrice = Request.Formtotal_fee;/金额 else /更新自己数据库的订单语句,请自己填写一下 Response.Write(success); /返回给支付宝消息,成功,请不要改写这个success /success与fail及其他字符的区别在于,支付宝的服务器若遇到success时,则不再发送请求通知(即不再调用该页面,让该页面再次运行起来), /若不是success,则支付宝默认没有收到成功的信息,则会反复不停地调用该页面直到失效,有效调用时间是24小时以内。 /最好写TXT文件,以记录下是否异步返回记录。 /写文本,纪录支付宝返回消息,比对md5计算结果(如网站不支持写txt文件,可改成写数据库) /string TOEXCELLR = MD5结果:mysign= + mysign + ,sign= + sign + ,responseTxt= + responseTxt; /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); /最好写TXT文件,以记录下是否异步返回记录。 /写文本,纪录支付宝返回消息,比对md5计算结果(如网站不支持写txt文件,可改成写数据库) string TOEXCELLR = MD5结果:mysign= + mysign + ,sign= + sign + ,responseTxt= + responseTxt; StreamWriter fs = new StreamWriter(Server.MapPath(Notify_DATA/ + DateTime.Now.ToString().Replace(:, ) + .txt, false, System.Text.Encoding.Default); fs.Write(TOEXCELLR); fs.Close(); Return.aspx.cs代码 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.Text;using System.Collections.Specialized;using System.IO;using Gateway;/ / 创建该页面文件时,请留心该页面文件是可以对其进行美工处理的,原因在于支付完成以后,当前窗口会从支付宝的页面跳转回这个页面。/ 该页面称作“返回页”,是同步被支付宝服务器所调用,可当作是支付完成后的提示信息页,如“您的某某某订单,多少金额已支付成功”。/ 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 + ¬ify_id= + Request.QueryStringnotify_id; /获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的 string responseTxt = AliPay.Get_Http(alipayNotifyURL, 120000); /*加密签名程序开始/* int i; NameValueCollection coll; /Load Form variables into NameValueCollection variable. coll = Request.QueryString; / Get names of all forms into a string array. String requestarr = coll.AllKeys; /进行排序; string Sortedstr = AliPay.BubbleSort(requestarr); /构造待md5摘要字符串 ; StringBuilder prestr = new StringBuilder(); for (i = 0; i Sortedstr.Length; i+) if (Request.FormSortedstri != & Sortedstri != sign & Sortedstri != sign_type) if (i = Sortedstr.Length - 1) prestr.Append(Sortedstri + = + Request.QueryStringSortedstri); else prestr.Append(Sortedstri + = + Request.QueryStringSortedstri + &); prestr.Append(key); /生成Md5摘要; string mysign = AliPay.GetMD5(prestr.ToString(), _input_charset); /*加密签名程序结束* string sign = Request.QueryStringsign; / Response.Write(prestr.ToString(); /调试用,支付宝服务器返回时的完整路径。 if (mysign = sign & responseTxt = true) /验证支付发过来的消息,签名是否正确 /更新自己数据库的订单语句,请自己填写一下 string strOrderNO = Request.QueryStringout_trade_no;/订单号 string strPrice = Request.QueryStringtotal_fee;/金额 string strTradeStatus = Request.QueryStringTRADE_STATUS;/订单状态 Response.Write(订单号: + strOrderNO + 金额: + strPrice); /成功,可美化该页面,提示信息 else Response.Write(-); Response.Write(Result:responseTxt= + responseTxt); Response.Write(Result:mysign= + mysign); Response.Write(Result:sign= + sign); Response.Write(支付失败); /支付失败,提示信息 除此之外在Notify.aspx页面和Return.aspx页面公用的一些方法,可以提取出来放在一个公共的类里面(Alipay.cs)Alipay.cs代码 using System.Web;using System.Text;using System.Security.Cryptography;using System.IO;using System.Net;using System;/ / New Interface for AliPay/ namespace Gateway public class AliPay / / 与ASP兼容的MD5加密算法 / public static string GetMD5(string s, string _input_charset) MD5 md5 = new MD5CryptoServiceProvider(); byte t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(s); StringBuilder sb = new StringBuilder(32); for (int i = 0; i t.Length; i+) sb.Append(ti.ToString(x).PadLeft(2, 0); return sb.ToString(); / / 冒泡排序法 / 按照字母序列从a到z的顺序排列 / public static string BubbleSort(string r) int i, j; /交换标志 string temp; bool exchange; for (i = 0; i = i; j-) /交换条件 if (System.String.CompareOrdinal(rj + 1, rj) 0) temp = rj + 1; rj + 1 = rj; rj = temp; exchange = true; /发生了交换,故将交换标志置为真 if (!exchange) /本趟排序未发生交换,提前终止算法 break; return r; / / 生成URL链接或加密结果 / / 参数加密数组 / 编码格式 / 加密类型 / 安全校验码 / 字符串URL或加密结果 public static string CreatUrl( /string gateway,/GET方式传递参数时请去掉注释 string para, string _input_charset, string sign_type, string key ) int i; /进行排序; string Sortedstr = BubbleSort(para); /构造待md5摘要字符串 ; StringBuilder prestr = new StringBuilder(); for (i = 0; i Sortedstr.Length; i+) if (i = Sortedstr.Length - 1) prestr.Append(Sortedstri); else prestr.Append(Sortedstri + &); prestr.Append(key); /生成Md5摘要; string sign = GetMD5(prestr.ToString(), _input_charset); /以下是POST方式传递参数 return sign; /以下是GET方式传递参数 /构造支付Url;/ char delimiterChars = =;/ StringBuilder parameter = new StringBuilder();/ parameter.Append(gateway);/ for (i = 0; i Sortedstr.Length; i+)/ /UTF-8格式的编码转换/ parameter.Append(Sortedstri.Split(delimiterChars)0 + = + HttpUtility.UrlEncode(Sortedstri.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 strResult; try HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(a_strUrl); myReq.Timeout = 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.Message; return strResult; 以上三个文件建之后,就可以在需要的地方对支付宝接口进行调用以完成支付宝支付的功能了(Default.aspx.cs)代码 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 Gateway;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 = TxtSubject.Text.Trim(); /商品名称,也可称为订单名称,该接口并不是单一的只能买一样东西,可把一次支付当作一次下订单 string body = TxtBody.Text.Trim(); /商品描述,即备注 string total_fee = TxtTotal_fee.Text.Trim(); /商品价格,也可称为订单的总金额 /服务器通知url(Alipay_Notify.aspx文件所在路经),必须是完整的路径地址 string notify_url = http:/localhost:8978/direc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 起草协议书的英文
- 汽车的租赁协议书
- 2025年RISC-VJTAG接口应用考核试卷
- MySQL协议书化木马
- 社保欠费免责协议书
- 志愿服务协议书包括
- 2025年医疗供应链系统集成项目整体管理与敏捷开发应用考核试卷
- 2025年供应链管理行业供应链数字化转型与物流智能化技术研究报告及未来发展趋势预测
- 2025年农业机械防盗与停放安全规范考核试卷
- 2025年农业智能收获技术研发农业科技创新资格考核试卷
- 2024年-2025年水生产处理工(中级工)理论考试题库
- DB11∕T 1690-2019 矿山植被生态修复技术规范
- 一年级字卡带拼音可打印
- 衰老肌肤护理方案
- DB3301-T 0450-2024 限额以下工程建设项目交易管理规范
- 食品安全的规章制度目录清单
- 小学生心理健康帮扶计划及措施
- TCI 368-2024 供电服务客服调度管理规范
- HG∕T 2454-2014 溶剂型聚氨酯涂料(双组份)
- 译林版二年级上册英语期中卷(含听力材料)
- 玉米脱粒机项目计划方案
评论
0/150
提交评论