第三方支付接口技术对接实现与样例_第1页
第三方支付接口技术对接实现与样例_第2页
第三方支付接口技术对接实现与样例_第3页
第三方支付接口技术对接实现与样例_第4页
第三方支付接口技术对接实现与样例_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、B2B对接支付宝接口转接支付宝解决方案 大型网上购物系统除了能让会员选择货到付款结账方式外,还应该提供一些更方 便快捷的网上支付方式。如果网上商店没有足够的实力提供会员直接在中 建立 现金账户的功能,就可以将订单信息转接到支付宝, 让会员从支付宝付款。当然 就算会员可以在上建立自己的现金账户,提供支付宝支付功能也不失为另一 种 方便快捷的支付方式,这可以给客户提供更多可选的支付方式。首先,网上购物系统必须与支付宝公司签订合作协议,以确保从本购物上传到支付宝上的订单信息能被正确接收。当会员于购物上买下一系列商品并选择支付宝付款方式后,购物系统即将会员购 物的订单信息转发到支付宝,页面也会转到支付

2、宝的付款页面。 此时,支付宝页 面会发送一个验证信息到本以确认支付宝正确收到订单信息。会员于支付宝付款完成后,页面会重新跳回本购物,同时支付宝会将已付款的订 单信息发回本以便对本购物的数据库进行必要的修改操作。另外本还需要向支付宝发送一个返回信息,告知支付宝本系统已正确收到付款完毕的订单信息并且 已经完成对数据的处理操作。支付宝蔡统合作商户浆统向支付宝传送订单信息时主要参数的含义gateway :支付接口service:识别是何接口实现何功能的表示SelIer_email :商家签约时的支付宝账号,即收款的支付宝账号key:安全校验码,与 Partner是一组Partner:商户ID ,合作伙

3、伴IDsign_type:加密类型nPUt_CharSet编码类型show_url :展示地址,即在支付宝页面时商品名称旁边的 详情”的地址out_trade_no会员订单编号,订单编号必须在本系统中保持唯一subject:商品名称,也可称为订单名称,该接口并不是单一的只能买一样东西, 可把一次支付当作一次下订单body:商品描述,即备注total_fee:商品价格,也可称为订单的总金额源码分析 (C#):首先必须建立一个通知页面(NOtify.aspx)和一个返回页面(RetUrn.aspx)以接 受并验证从支付宝返回的信息并对数据库中相应的订单信息做修改处理操作。Notify.aspx.c

4、s代码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.Sp

5、ecialized;Using System.IO;Using Gateway;/VSummary>III创建该页面文件时,请留心该页面文件中无任何HTML弋码及空格。/该页面称作“通知页”,是异步被支付宝服务器所调用。/当支付宝的订单状态改变时,支付宝服务器则会自动调用此页面,因此请做 好自身订单信息与支付宝上的订单的同步工作/ <summary>PUbliC Partial class AIiPay_NOtify : SyStem.Web.UI.PagePrOteCted VOid Page_Load( object Sender, EVentArgs e) _Stri

6、ng alipayNotifyURL ="https:/.alipay./COOPerategateway.do?SerViCe=no tify_Verify"/string alipayNotifyURL ="n otify.alipay./trade/notify_query.do?"此路径是在上面地址无法起作用时替换使用。String Partner ="" ;/partner合作伙伴 id (必须填写)String key = "" ; /partner的对应交易安全校验码(必须填写)String nPUt

7、_CharSet = "utf-8" ; /编码类型,完全根据客户自身的 项目的编码格式而定,千万不要填错。否则极其容易造成MD5加密错误。alipayNotifyURL = alipayNotifyURL +"&Part ner=" + Part ner +"&notify_id="+ ReqUeSt.Form "notify_id"/获取支付宝ATN返回结果,true是正确的订单信息,false是无效的Stri ng respo nseTxt = AliPay.Get_Http(alipayNo

8、tifyURL,120000);/*力口密签名程序开始*int i;NameValueCollection coll;/Load Form VariabIeS into NameValueCollecti on Variable. coll = ReqUeSt.Form;/ Get names of all forms into a string array.String requestarr = coll.AllKeys;/ 进行排序;string Sortedstr = AliPay.BubbleSort(requestarr);/构造待md5®要字符串;StringBuilde

9、r prestr =newStringBuilder();for (i =0; i < Sortedstr.Length; i+)if (Request.FormSortedstri !="sign" && Sortedstri != "sign_type" )if (i = Sortedstr.Length -prestr.Append(Sortedstri + Request.FormSortedstri);elseprestr.Append(Sortedstri +Request.FormSortedstri +"&

10、amp;");1)"" && Sortedstri!=prestr.Append(key);string加密签名程序结束 *mysign = AliPay.GetMD5(prestr.ToString(), _input_charset);string sign = Request.Form "sign" ;if (mysign = sign && responseTxt = "true" ) / 验证支付发过来的消息, 签名是否正确, 只要成功进如这个判断里, 则表示该页面已被支付宝服务器成

11、功 调用/ 但判断出现自身编写的程序相关错误导致通知给支付宝并不是发送 success 的消息或没有更新客户自身的数据库的情况, 请自身程序编写好应对措 施,否则查明原因时困难之极if (Request.Form "trade_status" = "WAIT_BUYER_PA)Y/" 判断支付状态 _等待买家付款(文档中有枚举表可以参考)/ 更新自己数据库的订单语句,请自己填写一下string strOrderNO = Request.Form "out_trade_no" ; / 订 单号string strPrice = Requ

12、est.Form "total_fee" ; / 金额 如果你申请了商家购物卷功能, 在返回信息里面请不要做金额的判断, 否则会校 验通过不了。else if (Request.Form "trade_status" = "TRADE_FINISHED|"|Request.Form "trade_status" = "TRADE_SUCCES)S/" 判断支付状态 _交易 成功结束(文档中有枚举表可以参考)/ 更新自己数据库的订单语句,请自己填写一下string strOrderNO = Req

13、uest.Form "out_trade_no" ; / 订单号string strPrice = Request.Form "total_fee" ; / 金额else/ 更新自己数据库的订单语句,请自己填写一下Response.Write("success" ); / 返回给支付宝消息,成功,请不要改写这个 success /success 与 fail 及其他字符的区别在于,支付宝的服务器若遇 到 success 时,则不再发送请求通知 (即不再调用该页面, 让该页面再次运行起 来),/若不是 success ,则支付宝默认没有

14、收到成功的信息,则会反复不停地调用该页面直到失效,有效调用时间是 24 小时以。Zz最好写TXT文件,以记录下是否异步返回记录。/ Z写文本,纪录支付宝返回消息,比对md5计算结果(如不支持 写 txt 文件,可改成写数据库)/string TOEXCELLR = "MD5 结果 :mysign=" + mysign + ",sign=" + sign + ",responseTxt=" + responseTxt;/StreamWriter fs = new StreamWriter(Server.MapPath("Not

15、ify_DATA/" + DateTime.Now.ToString().Replace(":", "") + ".txt", false, System.Text.Encoding.Default);/fs.Write(TOEXCELLR);/fs.Close();elseResponse.Write( "fail" );/最好写TXT文件,以记录下是否异步返回记录/写文本,纪录支付宝返回消息,比对 md5计算结果(如不支持写txt文件,可 改成写数据库)Stri ng ToEXCELLR ="

16、;MD5 结果:mysig n=" + mysig n + ",sig n="+sign + ",responseTxt=" + responseTxt;StreamWriter fs =newStreamWriter(Server.MapPath( "Notify_DATA/" + DateTime.Now.ToString().Replace( ":" , "" ) + ".txt" , false , System.Text.Encoding.Default)

17、;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;

18、using System.Text;using System.Collections.Specialized;using System.Io;using Gateway;/ <summary>/ 创建该页面文件时, 请留心该页面文件是可以对其进行美工处理的, 原因在 于支付完成以后,当前窗口会从支付宝的页面跳转回这个页面。/ 该页面称作“返回页”, 是同步被支付宝服务器所调用, 可当作是支付完成 后的提示信息页,如“您的某某某订单,多少金额已支付成功”/ vsummary>PubliC Partial class AIiPay_RetUrn : SyStem.Web.UI.P

19、age _PrOteCted VOid Page_Load( object Sender, EVentArgs e) _Stri ng alipayNotifyURL ="https:/.alipay./cooperate/gateway.do?SerViCe=no tify_Verify"/string alipayNotifyURL ="n otify.alipay./trade/notify_query.do?"此路径是在上面地址无法起作用时替换使用。String key = "" ; /partner的对应交易安全校验码(必须

20、填写)String Partner ="" ;/partner 合作伙伴 id (必须填写)String nPUt_CharSet= "utf-8" ; /编码类型,完全根据客户自身的项目的编码格式而定,千万不要填错。否则极其容易造成MD5加密错误。alipayNotifyURL = alipayNotifyURL +"&Part ner=" + Part ner +"&n otify_id="+ ReqUeSt.QueryStri ng"n otify_id"/获取支付宝ATN

21、返回结果,true是正确的订单信息,false是无效的Stri ng respo nseTxt = AliPay.Get_Http(alipayNotifyURL,120000);/*力口密签名程序开始/*int i;NameValueCollection coll;/Load Form VariabIeS into NameValueCollecti on Variable. coll = ReqUeSt.QueryStri ng;/ Get names of all forms into a String array. Stri ng requestarr = coll.AllKeys;/

22、 进行排序;string Sortedstr = AliPay.BubbleSort(requestarr);/构造待md5®要字符串;newStringBuilder();StringBuilder prestr =for (i =0; i < Sortedstr.Length; i+)if (Request.FormSortedstri !="sign" && Sortedstri != "sign_type" )if (i = Sortedstr.Length -prestr.Append(Sortedstri +

23、Request.QueryStringSortedstri);elseprestr.Append(Sortedstri +Request.QueryStringSortedstri +"&");1)"" && Sortedstri!=prestr.Append(key);/生成Md5摘要;string mysign = AliPay.GetMD5(prestr.ToString(),input charset);加密签名程序结束 *string sign = Request.QueryString/ Response.Write(

24、prestr.ToString(); / 完整路径。"sign" ;调试用,支付宝服务器返回时的if (mysign = sign && responseTxt = "true" ) / 验证支付发过 来的消息,签名是否正确stringstrOrderNO = Request.QueryString"out_trade_no" ; /订单号string strPrice = Request.QueryString string strTradeStatus = Request.QueryString "TRA

25、DE_STATUS;"/ 订单状态"total_fee" ; / 金额Response.Write(" 订单号: " + strOrderNO + "<br> 金额: " + strPrice); 该页面,提示信息else/ 成功,可美化Response.Write( "Response.Write(Response.Write(Response.Write(Response.Write( / 支付失败,提示信息"<br>Result:responseTxt=");+ r

26、esponseTxt);"<br>Result:mysign=" + mysign); "<br>Result:sign=" + sign);" 支付失败 ");/ 更新自己数据库的订单语句,请自己填写一下 除此之外在 Notify.aspx 页面和 Return.aspx 页面公用的一些方法,可以提取出来 放在一个公共的类里面( Alipay.cs)Alipay.cs代码using System.Web;using System.Text;using System.Security.Cryptography;

27、using System.IO;using System.Net;using System;/ <summary>/ New Interface for AliPay/ </summary> namespaceGatewaypublic class AliPay/ <summary>Ill与ASP兼容的MD5加密算法/ </summary>public static string GetMD5(string s, string _input_charset) MD5 md5 = newMD5CryptoServiceProvider(); byt

28、e 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();/ <summary>/ 冒泡排序法Ill按照字母序列从a到Z的顺序排列/ </summary>public

29、static string BubbleSort( string r) int i, j; ll 交换标志 string temp;bool exchange;for (i =0; i < r.Length; i+) ll 最多做 R.Length-1 趟排序 exchange =false ; ll 本趟排序开始前,交换标志应为假for (j = r.Length -2; j >= i; j-)ll 交换条件if (System.String.CompareOrdinal(rj +1, rj) <0)temp = rj + 1;rj + 1 = rj;rj = temp;e

30、xchange= true ; / 发生了交换,故将交换标志置为真 if (!exchange) / 本趟排序未发生交换,提前终止算法 break ;return r;/ <summary>Ill生成URL或加密结果/ </summary>lll <param name="para"> 参数加密数组 <lparam>lll <param name="_input_charset"> 编码格式 <lparam>lll <param name="sign_type&quo

31、t;> 加密类型 <lparam>Ill VParam name="key">安全校验码 <param>Ill Vretums>字符串URL或加密结果<returns> public static string CreatUrl(llstring gateway,llGET 方式传递参数时请去掉注释string para,string _input_charset,string sign_type, string key)int i;ll 进行排序;string Sortedstr = BubbleSort(para);

32、/构造待md5®要字符串;StringBuilder prestr =newStringBuilder();for (i =0; i < Sortedstr.Length; i+)if (i = Sortedstr.Length -1)prestr.Append(Sortedstri);elseprestr.Append(Sortedstri +"&");prestr.Append(key);/生成Md5摘要;string sign = GetMD5(prestr.ToString(), _input_charset);/以下是PoST方式传递参数

33、return sign;Zz以下是GET方式传递参数/ 构造支付 Url ;ZZchar delimiterChars = '='ZZStringBuilder parameter = new StringBuilder();ZZparameter.Append(gateway);ZZfor (i = 0; i < Sortedstr.Length; i+)ZZZZUTF-8格式的编码转换ZZparameter.Append(Sortedstri.Split(delimiterChars)0 + "=" +HttpUtility.UrlEncode(S

34、ortedstri.Split(delimiterChars)1) + "&");ZZZZZZparameter.Append("sign=" + sign + "&sign_type=" +sign_type);ZZZZ ZZ返回支付 Url ;ZZ return parameter.ToString();ZZ获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求public static string Get_Http( string a_strUrl, int timeout) string strResul

35、t;tryHttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(a_strUrl);myReq.Timeout = timeout;HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();Stream myStream = HttpWResp.GetResponseStream();StreamReader sr =newStreamReader(myStream,Encoding.Default);StringBuilder strBuilder =

36、newStringBuilder(); 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.C

37、onfiguration;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.Pageprotected void Page_Load( object sender, EventArgs e)p

38、rotected void BtnAlipay_Click( object sender, EventArgs e) / 业务参数赋值;string gateway = "https:/.alipay./cooperate/gateway.do?" / 支付接口string service = "create_direct_pay_by_user" ;/ 服务名称,这个是识别是何接口实现何功能的标识,请勿修改string seller_email = "" ;/ 商家签约时的支付宝,即收款的支付宝string sign_type =

39、"MD5"/ 加密类型 , 签名方式“不用改”string key = "" ; / 安全校验码,与 partner 是一组,获取方式是:用签约时支付宝登陆支付宝 www.alipay. ,在商家服务我 的商家里即可查到。string partner = "" ; / 商户 ID, 合作身份者ID ,合作伙伴IDstring _input_charset = "utf-8" ;/ 展示/ 编码类型, 完全根据客户自身的项目的编码格式而定, 千万不要填错。 否则极 其容易造成MD5加密错误。string show_u

40、rl = ".alipay./" ;地址,即在支付页面时,商品名称旁边的“详情”的地址string out_trade_no = TxtOrderno.Text.Trim();/ 客户自己的订单号,订单号必须在自身订单系统中保持唯一性string subject = TxtSubject.Text.Trim();/ 商品名称, 也可称为订单名称, 该接口并不是单一的只能买一样东西, 可把 次支付当作一次下订单string body = TxtBody.Text.Trim();/ 商品描述,即备注string total_fee = TxtTotal_fee.Text.Tri

41、m();/ 商品价格,也可称为订单的总金额/ 服务器通知 url ( Alipay_Notify.aspx 文件所在路经) ,必须是完整的路径地 址string notify_url = "localhost:8978/direct_vs2005_utf/Alipay_Notify.aspx" ;/ 服务器返回 url (Alipay_Return.aspx 文件所在路经) ,必须是完整 的路径地址string return_url = "localhost:8978/direct_vs2005_utf/Alipay_Return.aspx" ;/ 构造

42、数组;/ 以下数组即是参与加密的参数, 若参数的值不允许为空, 若该参数为 空,则不要成为该数组的元素string para = "service=" +service, "partner=" + partner, "seller_email=" + seller_email, "out_trade_no=" + out_trade_no, "subject=" + subject, "body=" + body, "total_fee=" + total

43、_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);/以下是G

44、ET方式传递参数/Response.Redirect(aliay_url);/以下是POST方式传递参数Response.Write("<form name='alipaysubmit' method='post'action='https:/.alipay./cooperate/gateway.do?_input_charset=utf-8'>" );Response.Write( service + ">" );Response.Write( partner + ">&

45、quot; );Response.Write( value=" + seller_email +Response.Write( value=" + out_trade_no +"<input type='hidden' name='service' value=""<input type='hidden' name='partner' value="IlIl<input type='hidden' name='seller_email' ">&q

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论