网站转接支付宝解决方案模板.doc
《网站转接支付宝解决方案模板.doc》由会员分享,可在线阅读,更多相关《网站转接支付宝解决方案模板.doc(33页珍藏版)》请在咨信网上搜索。
网站转接支付宝解决方案 大型网上购物系统除了能让会员选择货到付款结账方式外, 还应该提供一些更方便快捷的网上支付方式。如果网上商店没有足够的实力提供会员直接在网站中建立现金账户的功能, 就能够将订单信息转接到支付宝, 让会员从支付宝付款。当然就算会员能够在网站上建立自己的现金账户, 提供支付宝支付功能也不失为另一种方便快捷的支付方式, 这能够给客户提供更多可选的支付方式。 首先, 网上购物系统必须与支付宝公司签订合作协议, 以确保从本购物网站上传到 支付宝网站上的订单信息能被正确接收。 当会员于购物网站上买下一系列商品并选择支付宝付款方式后, 购物系统即将会员购物的订单信息转发到支付宝, 网站页面也会转到支付宝的付款页面。此时, 支付宝页面会发送一个验证信息到本网站以确认支付宝正确收到订单信息。 会员于支付宝网站付款完成后, 网站页面会重新跳回本购物网站, 同时支付宝会将已付款的订单信息发回本网站以便对本购物网站的数据库进行必要的修改操作。另外本网站还需要向支付宝网站发送一个返回信息, 告知支付宝本系统已正确收到付款完毕的订单信息而且已经完成对数据的处理操作。 向支付宝网站传送订单信息时主要参数的含义: gateway : 支付接口 service: 识别是何接口实现何功能的表示 seller_email: 商家签约时的支付宝账号, 即收款的支付宝账号 key: 安全校验码, 与partner是一组 partner: 商户ID, 合作伙伴ID sign_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; /// <summary> /// 创立该页面文件时, 请留心该页面文件中无任何HTML代码及空格。 /// 该页面称作”通知页”, 是异步被支付宝服务器所调用。 /// 当支付宝的订单状态改变时, 支付宝服务器则会自动调用此页面, 因此请做好自身网站订单信息与支付宝上的订单的同步工作 /// </summary> public partial class Alipay_Notify : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string alipayNotifyURL = ""; //string alipayNotifyURL = "";//此路径是在上面链接地址无法起作用时替换使用。 string partner = ""; //partner合作伙伴id( 必须填写) string key = ""; //partner 的对应交易安全校验码( 必须填写) string _input_charset = "utf-8";//编码类型, 完全根据客户自身的项目的编码格式而定, 千万不要填错。否则极其容易造成MD5加密错误。 alipayNotifyURL = alipayNotifyURL + "&partner=" + partner + "¬ify_id=" + Request.Form["notify_id"]; //获取支付宝ATN返回结果, true是正确的订单信息, false 是无效的 string responseTxt = AliPay.Get_Http(alipayNotifyURL, 1 0); //*******加密签名程序开始******* 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.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"];//金额 如果你申请了商家购物卷功能, 在返回信息里面请不要做金额的判断, 否则会校验经过不了。 } 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"];//金额 } 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; /// <summary> /// 创立该页面文件时, 请留心该页面文件是能够对其进行美工处理的, 原因在于支付完成以后, 当前窗口会从支付宝的页面跳转回这个页面。 /// 该页面称作”返回页”, 是同步被支付宝服务器所调用, 可当作是支付完成后的提示信息页, 如”您的某某某订单, 多少金额已支付成功”。 /// </summary> public partial class Alipay_Return : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string alipayNotifyURL = ""; //string alipayNotifyURL = "";//此路径是在上面链接地址无法起作用时替换使用。 string key = ""; //partner 的对应交易安全校验码( 必须填写) string partner = ""; //partner合作伙伴id( 必须填写) string _input_charset = "utf-8";//编码类型, 完全根据客户自身的项目的编码格式而定, 千万不要填错。否则极其容易造成MD5加密错误。 alipayNotifyURL = alipayNotifyURL + "&partner=" + partner + "¬ify_id=" + Request.QueryString["notify_id"]; //获取支付宝ATN返回结果, true是正确的订单信息, false 是无效的 string responseTxt = AliPay.Get_Http(alipayNotifyURL, 1 0); //*******加密签名程序开始//******* 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.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"];//订单状态 Response.Write("订单号: " + strOrderNO + "<br>金额: " + strPrice); //成功, 可美化该页面, 提示信息 } else { Response.Write("------------------------------------------"); Response.Write("<br>Result:responseTxt=" + responseTxt); Response.Write("<br>Result:mysign=" + mysign); Response.Write("<br>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; /// <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 = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(s)); StringBuilder sb = new StringBuilder(32); for (int i = 0; i < t.Length; 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, j; //交换标志 string temp; bool exchange; for (i = 0; i < r.Length; i++) //最多做R.Length-1趟排序 { exchange = false; //本趟排序开始前, 交换标志应为假 for (j = r.Length - 2; j >= i; j--) {//交换条件 if (System.String.CompareOrdinal(r[j + 1], r[j]) < 0) { temp = r[j + 1]; r[j + 1] = r[j]; r[j] = temp; exchange = true; //发生了交换, 故将交换标志置为真 } } if (!exchange) //本趟排序未发生交换, 提前终止算法 { break; } } return r; } /// <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 ) { 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(Sortedstr[i]); } else { prestr.Append(Sortedstr[i] + "&"); } } 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(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 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 = ""; //支付接口 string service = "create_direct_pay_by_user"; //服务名称, 这个是识别是何接口实现何功能的标识, 请勿修改 string seller_email = ""; //商家签约时的支付宝帐号, 即收款的支付宝帐号 string sign_type = "MD5"; //加密类型,签名方式”不用改” string key = ""; //安全校验码, 与partner是一组, 获取方式是: 用签约时支付宝帐号登陆支付宝网站.com, 在商家服务我的商家里即可查到。 string partner = ""; //商户ID, 合作身份者ID, 合作伙伴ID string _input_charset = "utf-8";- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网站 转接 支付 解决方案 模板
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【天****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【天****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【天****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【天****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文