在线支付技术设计文档修改版.docx
《在线支付技术设计文档修改版.docx》由会员分享,可在线阅读,更多相关《在线支付技术设计文档修改版.docx(18页珍藏版)》请在冰豆网上搜索。
在线支付技术设计文档修改版
在线支付技术设计文档
以下是关于支付宝接口的所有东西,包括支付宝接口需要的参数,一些通用规则、特殊用途等。
一.结构
a)一般由两部分组成,接入部分与通知返回部分。
接入部分即为传递参数等信息组合成超级链接,并用该链接来进行跳转。
通知返回部分则是支付宝服务器对该笔订单处理完毕后,通知与返回该笔订单的详细信息到商户服务器,商户服务器接收到后,并对其进行数据处理。
b)以实物标准双接口的程序为例。
接入部分的页面文件包含:
配置页alipayapi.jsp、程序入口页index.jsp、服务器异步通知页notify_url.jsp以及页面跳转同步通知页return_url.jsp。
通知返回部分的页面文件包含:
基础配置类文件AlipayConfig.java、支付宝接口公用函数类文件AlipayCore.java、支付宝通知处理类AlipayNotify.java、支付宝各接口请求提交类文件AlipaySubmit.java、支付宝自定义订单类文件UtilDate.java、MD5签名类文件MD5.java、支付宝HttpClient处理类文件HttpProtocolHandler.java、支付宝HttpClient请求类文件、支付宝HttpClient返回类文件HttpResponse.java、支付宝HttpClient返回的结果字符方式类文件。
这里大家可以一目了然,MD5加密方法类与方法详细页不论是哪部分都有被调用,因此AlipayCore.java文件可视为核心代码部分,
c)详细介绍
1.AlipayCore.java
publicstaticMapparaFilter(MapsArray)
功能:
除去数组中的空值和签名参数
输入:
MapsArray要签名的数组
输出:
Map去掉空值与签名参数后的新签名参数组。
publicstaticStringcreateLinkString(Mapparams)
功能:
把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串。
输入:
Mapparams需要拼接的数组
输出:
String拼接完成以后的字符串
publicstaticvoidlogResult(StringsWord)
功能:
写日志,方便测试(看网站需求,也可以改成存入数据库)
输入:
StringsWord要写入日志里的文本内容
publicstaticStringgetAbstract(StringstrFilePath,Stringfile_digest_type)throwsIOException
功能:
生成文件摘要
输入:
StringstrFilePath文件路径
Stringfile_digest_type摘要算法
输出:
String文件摘要结果
2.MD5.java
publicstaticStringsign(Stringtext,Stringkey,Stringinput_charset)
功能:
MD5签名
输入:
Stringtext明文
Stringkey私钥
Stringinput_charset编码格式
输出:
String签名结果
publicstaticbooleanverify(Stringtext,Stringsign,Stringkey,Stringinput_charset)
功能:
MD5验签名检查
输入:
Stringtext明文
Stringsign支付宝的签名值
Stringkey私钥
Stringinput_charset编码格式
输出:
boolean签名结果
3.AlipayNotify.java
publicstaticbooleanverify(Mapparams)
功能:
根据反馈回来的信息,生成签名结果
输入:
MapParams通知返回来的参数数组
输出:
boolean验证结果
privatestaticbooleangetSignVeryfy(MapParams,Stringsign)
功能:
根据反馈回来的信息,验证签名
输入:
MapParams通知返回来的参数数组
Stringsign支付宝的签名值
输出:
boolean签名结果
privatestaticStringverifyResponse(Stringnotify_id)
功能:
获取远程服务器ATN结果,验证返回URL
输入:
Stringnotify_id验证通知ID
输出:
String验证结果
privatestaticStringcheckUrl(Stringurlvalue)
功能:
获取远程服务器ATN结果
输入:
Stringurlvalue指定URL路径地址
输出:
String服务器ATN结果字符串
4.AlipaySubmit.java
publicstaticStringbuildRequestMysign(MapsPara)
功能:
生成签名结果
输入:
MapsPara要签名的数组
输出:
String签名结果
privatestaticMapbuildRequestPara(MapsParaTemp)
功能:
生成要请求给支付宝的参数数组
输入:
MapsParaTemp请求前的参数数组
输出:
Map要请求的参数数组
publicstaticStringbuildRequest(MapsParaTemp,StringstrMethod,StringstrButtonName)
功能:
建立请求,以表单HTML形式构造(默认)
输入:
MapsParaTemp请求参数数组
StringstrMethod提交方式。
两个值可选:
post、get
StringstrButtonName确认按钮显示文字
输出:
String提交表单HTML文本
publicstaticStringbuildRequest(MapsParaTemp,StringstrMethod,StringstrButtonName,StringstrParaFileName)
功能:
建立请求,以表单HTML形式构造,带文件上传功能
输入:
MapsParaTemp请求参数数组
StringstrMethod提交方式。
两个值可选:
post、get
StringstrButtonName确认按钮显示文字
StringstrParaFileName文件上传的参数名
输出:
String提交表单HTML文本
publicstaticStringbuildRequest(StringstrParaFileName,StringstrFilePath,MapsParaTemp)throwsException
功能:
建立请求,以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果
输入:
StringstrParaFileName文件类型的参数名
StringstrFilePath文件路径
MapsParaTemp请求参数数组
输出:
String支付宝处理结果
privatestaticNameValuePair[]generatNameValuePair(Mapproperties)
功能:
MAP类型数组转换成NameValuePair类型
输入:
MapsParaTempMAP类型数组
输出:
NameValuePair[]NameValuePair类型数组
publicstaticStringquery_timestamp()
功能:
用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数
输出:
String时间戳字符串
5.UtilDate.java
publicstaticStringgetOrderNum()
功能:
自动生出订单号,格式yyyyMMddHHmmss
输出:
String订单号
publicstaticStringgetDateFormatter()
功能:
获取日期,格式:
yyyy-MM-ddHH:
mm:
ss
输出:
String日期
publicstaticStringgetDate()
功能:
获取日期,格式:
yyyyMMdd
输出:
String日期
publicstaticStringgetThree()
功能:
产生随机的三位数
输出:
String随机三位数
二.工作原理
a)接入部分原理
i.第一步——选定参数信息:
结合技术文档以及接口代码Demo,选定传递给支付宝服务器的参数,以实物标准双接口为例。
如必传项service、partner、seller_email、sign、sign_type、out_trade_no、price、subject、quantity、payment_type以及最少一组的物流信息参数三个logistics_type、logistics_fee、logistics_payment等,选填项body、discount、show_url等。
stringservice="trade_create_by_buyer";
stringseller_email="aaaa@";
stringsign_type="MD5";
stringkey="我是秘钥";
stringpartner="我是唯一商铺号";
string_input_charset="utf-8";
stringshow_url="
stringout_trade_no=TxtOrderno.Text.Trim();
stringsubject=TxtSubject.Text.Trim();
stringbody=TxtBody.Text.Trim();
stringprice=TxtPrice.Text.Trim();
stringquantity=TxtQua.Text.Trim();
stringlogistics_type="POST";
stringlogistics_fee=TxtPost.Text.Trim();
stringlogistics_payment="BUYER_PAY";
stringnotify_url=“我是异步通信地址”
stringreturn_url=“我是回执地址”
ii.第二步——排序:
把这些参数的变量名(即技术文档里给出的变量名,以这种方式组合:
service=”trade_create_by_buyer”作为一串字符串)按从a到z的顺序依次排序。
iii.第三步——加密:
目前一般的加密方式是MD5,不论是哪种加密方式,要加密的信息是要传给支付宝的信息,且存在于技术文档中,而非自定义的变量名。
对以上排序好的所有参数(不包括网关参数即:
stringgateway=";)以循环的方式,用‘&’字符拼接成一长串字符串(这里需要注意,所有的参数都是&字符来拼接的,拼接后直接再拼接安全校验码Key,在程序中大家可看到,这个key是直接加到该字符串后面而没有用&字符),之后进行加密。
得出的加密字符串集存储于sign这个参数中。
iv.第四步——拼接字符串成URL链接
我们已经拿到了各个参数、参数所属的值以及加密得出的加密字符串,那么手上现在的所有参数信息的格式,应当都是一组一组的service=”trade_create_by_buyer”这种格式的字符串,拼接的话,则依靠循环的方式遍历所有的这种字符串,因为这次的拼接是要成URL链接,所以之前排除在外的网关gaetway和加密类型参数sign_type也都会被拼接进来,那么,连接的字符则用大家所熟知的字符’&’,就这样得出一个完整的URL链接地址,如:
该链接来自支付宝官方的技术文档“标准实物双接口技术文档”
v.第五步——自动跳转
第四步中已经运算得出的URL链接字符串,我们则要用程序调用它,也就是所谓的页面自动跳转。
这样就能跳到支付宝的官方收银台页面。
可以说,现在已经成功的把支付宝接口融合进了我们的网站中,且能够使用支付宝来进行付款了。
b)通知返回部分原理
i.专业术语
通知返回是两个页面,即传递给支付宝时的notify_url参数所对应的页面文件,称之为通知页,传递给支付宝时的return_url参数所对应的页面文件称之为返回页。
ii.通知返回原理
1.第一步——验证是否是支付宝服务器发来的请求:
a)以一个小程序为例:
alipayNotifyURL="
alipayNotifyURL=alipayNotifyURL&"partner="&partner&"¬ify_id="&request("notify_id")SetRetrieval=Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
Retrieval.setOption2,13056
Retrieval.open"GET",alipayNotifyURL,False,"",""
Retrieval.send()
ResponseTxt=Retrieval.ResponseText
SetRetrieval=Nothing
得到的便是ResponseTxt的值,这是下面的步骤要用到的。
b)在看下面的步骤:
//获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求
publicStringGet_Http(Stringa_strUrl,inttimeout)
{
stringstrResult;
try
{
HttpWebRequestmyReq=(HttpWebRequest)HttpWebRequest.Create(a_strUrl);
myReq.Timeout=timeout;
HttpWebResponseHttpWResp=(HttpWebResponse)myReq.GetResponse();
StreammyStream=HttpWResp.GetResponseStream();
StreamReadersr=newStreamReader(myStream,Encoding.Default);
StringBuilderstrBuilder=newStringBuilder();
while(-1!
=sr.Peek())
{
strBuilder.Append(sr.ReadLine());
}
strResult=strBuilder.ToString();
}
catch(Exceptionexp)
{
strResult="错误:
"+exp.Message;
}
returnstrResult;
}
调用部分:
//支付宝的URL
stringalipayNotifyURL="
stringpartner="我是唯一商铺号";
alipayNotifyURL=alipayNotifyURL+"&partner="+partner+"¬ify_id="+Request.Form["notify_id"];
//获取支付宝ATN返回结果,true是正确的订单信息,false是无效的
stringresponseTxt=Get_Http(alipayNotifyURL,120000);
得到的便是ResponseTxt的值,这是下面的步骤要用到的。
2.第二步——排序:
该部分的排序的原理与“接入部分”的原理“排序步骤”一样,值得注意的是,这里的参数是支付宝通知返回时,传回来的订单信息的各种参数以及值。
3.第三步——加密:
该部分的加密原理与“接入部分”的原理“加密步骤”一样,依然值得注意的部分是加密的参数信息,这些参数信息是来源于上面一步骤排序好后的参数拼接起来的字符串来加密的。
4.第四步——判断:
上面我们有得到加密的结果(命名为mysign吧)、检验是否是支付宝发来的消息的正确性ResponseTxt、以及通过POST或GET的方式得到的sign参数的值,那么这个判断的含义便是通知返回里最重要的部分了,因为它是来检验下面的程序是否执行我们的数据处理的。
如何判断呢?
各语言程序代码中,都是把加密得出的结果mysign与从支付宝那或得到的sign的值进行比较,并且还要让reponseTxt这个的值要等于true,这样才达到验证成功。
值得注意的是,大家都有遇到过这种事,支付部分即接入部分的确是做好了,但为什么无法与支付宝的交易信息同步,出现的问题就在这个判断上没有成功,下面的第五部分则会详细说明。
5.第五步——自身网站的数据处理
终于判断成功了,程序已经执行到了这里。
各语言程序代码的这块地方的注释都写着“更新自己数据库的订单语句”或是“这里可以指定你需要显示的内容”。
如字面上的意思,这块地方就是要我们大家来对这笔交易信息进行数据处理,即编写程序。
这个说法大概专业了点,简单易懂的讲法便是,支付宝的交易成功的信息和其他的一切交易状态,自己的网站也能够对这笔订单同步起来,即支付宝里这笔订单的交易状态是“买家已付款等待卖家发货”,那么自己网站里显示的这笔状态也因如此,那么就应当在这里面写下诸如:
复制代码
if(Request.Form["trade_status"]=="WAIT_SELLER_SEND_GOODS")
//判断支付状态_买家付款成功,等待卖家发货(文档中有枚举表可以参考)
{
//更新自己数据库的订单语句,请自己填写一下
stringstrOrderNO=Request.Form["out_trade_no"];//订单号
stringstrPrice=Request.Form["price"];//金额
stringsql="updateorder_tablesetorder_status=‘买家已付款,等待卖家发货’whereorder_no="+strOrderNO;
Update(sql);
}
等数据库处理代码。
iii.存在的区别
1.以上程序在通知页中运行时,获取参数的方法是用POST方式,而返回页中程序运行时,获取参数的方法是用GET方式。
由此可知一些基本的信息——返回页传递回来的参数信息是储存在URL链接里的,而通知页的参数信息是不在URL链接里,也能从中推断出二者在功能上的差异。
2.通知页面比返回页中多一个环节,那就是Response.Write("success");
作用上不同的详细说明,看下面的第四部分:
通知返回。
三.参数说明
支付宝提供的技术文档中的输入参数列表中给出了诸多参数,我们则只需要一部分参数来进行传递信息。
以下说明的参数不涵盖网关gateway、加密参数sign、加密类型sign_type,因为这些都是必须的。
以标准双接口为例,可把参数看做几个功能部分组成
a)不可缺少的参数
1.service服务参数,这个是用来区别这个接口是用的什么接口,所以绝对不能修改。
2.partner合作身份者ID、key安全校验码或称私钥这一组参数是签约合同生效后才能拿的到,partner是来鉴别是哪个商家与支付宝签约,而这个Key它如同钥匙般相当重要。
3.seller_email收款人支付宝账号,支付宝中有手机类型、电子邮件类型的支付宝账号是都可以用这个参数的。
4.subject在支付宝的收银台里是直接与商品名称关联在一起的,但是说的更准确些的话,这个参数是这笔交易的名称,因为这笔交易不一定只买一件商品。
它的作用不仅是在收银台里可以清晰的显示出来,而且在支付宝的账户的交易明细的列表里,它也是排在第一列,由此可推测出,它有财务对账、作为交易查询的筛选条件等诸多作用。
非常重要。
5.out_trade_no技术文档中给出的是商户交易号(确保在商户系统中唯一),顾名思义这个就是我们大家自己网站的订单系统里的唯一订单号,而非支付宝的。
这里需要强调的,这个订单号