return_url.asp 是用户点击返回商城取货,或者页面自动跳转的地址,在这一页里,你可以将获取的返回结果写到数据库里。但是如果用户在页面跳转前关了页面,你将无法获得支付结果。这个跳转只有一次。
notify_url.asp 是在交易完成后,支付宝24小时内对你的服务器定时发起的请求页面,其中请求中包含了各种你需要的查询字符串。你如果设置了这一页,你就可以在这一页对查询字符串进行处理,成功后返回success,支付宝将不会继续请求这个页面。
如果你在以前的同步跳转页面因为某些原因,比如用户将浏览器关闭,或者你的服务器出了问题等,没有将交易订单处理成功,你就可以在notify_url.asp再处理一次,成功后返回sucess.如果你在之前的同步中已经处理成功了,则这一次就不需要再写数据库了,直接返回sucess就行了。
引用:http://www.oschina.net/question/163900_24009
原因: 买家支付完成后,当前界面会停留在支付宝的交易付款成功的提示界面上,如:
该页面有短暂的停留时间,买家看到这个提示信息后有可能会把当前页面关掉,导致页面没有自动跳转回商户网站(return_url)使得商户的业务数据没有被处理(如:订单没有更新)。出现这种情况的原因是:商户网站的支付宝接口并没有利用服务器异步通知页面文件(notify_url)或是该页面在订单执行过程中也出现异常。 解决方法: 解决人员:商户网店开发、维护或管理的程序开发技术人员、商户网店系统提供商 解决步骤: 1、打开return_url页面文件(参数参数return_url对应返回文件),找到已经编写好的业务逻辑处理程序代码段,对其增加防止该笔交易被重复处理判断。 2、打开notify_url页面文件(参数参数notify_url对应返回文件),找到可插入商户的业务逻辑处理程序代码的地方,编写与return_url页面文件中相类似的程序,也需要包含防止该笔交易被重复处理的判断。 修改完成后效果: 当买家关掉自动跳转回商户网站的返回页面(参数return_url对应的return_url返回文件)时,商户的业务处理依旧被notify_url页面文件所执行,因此就不会发生业务没有同步的现象出现(如:订单没有被更新) 注意: 1、注意获取值的方式,notify_url页面文件的获取方式如:request.form("参数名 ")、$_POST['参数名'],return_url页面文件的获取方式,如:request.querrystring("参数名 ")、$_GET['参数名'] 2、notify_url文件的特性是: 1、 必须保证服务器异步通知页面(notify_url)上无任何字符,如空格、HTML标签、开发系统自带抛出的异常提示信息等; 2、 该页面中获得参数的方式,需要使用POST方式获取,如: request.Form(“out_order_no”)、$_POST['out_order_no']; 3、 支付宝主动发起通知,该方式才会被启用; 4、 只有在支付宝的交易管理中存在该笔交易,且发生了交易状态的改变,支付宝才会通过该方式发起服务器通知(即时到账中交易状态为“等待买家付款”的状态默认是不会发送通知的); 5、 服务器间的交互,不像页面跳转同步服务器异步通知页面可以在页面上显示出来,这种交互方式是不可见的; 6、 第一次交易状态改变(即时到账中此时交易状态是交易完成)时,不仅页面跳转同步通知页面会启用,而且服务器异步通知页面也会收到支付宝发来的处理结果通知; 7、 程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。 在25小时内完成6~10次通知(通知频率:5s,2m,10m,15m,1h,2h,6h,15h); 8、 程序执行完成后,该页面不能执行页面跳转。如果执行页面跳转,支付宝会收不到success字符,会被支付宝服务器判定为该页面程序运行出现异常,而重发处理结果通知; 9、 cookies、session等在此页面会失效,即无法获取这些数据; 10、 该方式的调试与运行必须在服务器上,即互联网上能访问; 11、 该方式的作用主要防止订单丢失,即页面跳转同步服务器异步通知页面没有处理订单更新,它则去处理; 12、 通知ID(参数notify_id)只有一分钟有效期,超过一分钟该次通知会验证失败。一旦验证成功下次再验证就会失效。 "如果您依照以上方法还无法解决,可提交集成申请,我们的技术支持会及时与您联系,协助您解决。 申请地址:https://b.alipay.com/support/helperApply.htm?action=supportHome"
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小时以内。
-------------------------------------------------------------------接口原理-------------------------------------------------------------------
二、 工作原理
大家对结构部分已经有所了解,那么我们就开始分析具体的这个接口是如何运作的。
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等。
以ASP.NET C#语言代码程序为例:
string service = "trade_create_by_buyer";
string seller_email = "aaaa@126.com";
string sign_type = "MD5";
string key = "********************************";
string partner = "2088************";
string _input_charset = "utf-8";
string show_url = "http://www.alipay.com/";
string out_trade_no = TxtOrderno.Text.Trim();
string subject = TxtSubject.Text.Trim();
string body = TxtBody.Text.Trim();
string price = TxtPrice.Text.Trim();
string quantity = TxtQua.Text.Trim();
string logistics_type = "POST";
string logistics_fee = TxtPost.Text.Trim();
string logistics_payment = "BUYER_PAY";
string notify_url = "http://www.xxx.com/swnet05utf8/Alipay_Notify.aspx";
string return_url = "http://www.xxx.com/swnet05utf8/Alipay_Return.aspx";
ii. 第二步——排序:
把这些参数的变量名(即技术文档里给出的变量名,以这种方式组合:service=”trade_create_by_buyer”作为一串字符串)按从a到z的顺序依次排序。以ASP.NET C#语言代码程序为例,该功能在ALIPAY.CS类中;以ASP代码中的程序为例,该功能在alipayto/Alipay_Payto.asp文件中。
iii. 第三步——加密:
目前一般的加密方式是MD5,不论是哪种加密方式,要加密的信息是要传给支付宝的信息,且存在于技术文档中,而非自定义的变量名。对以上排序好的所有参数(不包括网关参数即:string gateway = "https://www.alipay.com/cooperate/gateway.do?" ;)以循环的方式,用‘&’字符拼接成一长串字符串(这里需要注意,所有的参数都是&字符来拼接的,拼接后直接再拼接安全校验码Key, 在程序中大家可看到,这个key是直接加到该字符串后面而没有用&字符 ),之后进行加密。得出的加密字符串集存储于sign这个参数中。
iv. 第四步——拼接字符串成URL链接
我们已经拿到了各个参数、参数所属的值以及加密得出的加密字符串,那么手上现在的所有参数信息的格式,应当都是一组一组的 service=”trade_create_by_buyer”这种格式的字符串,拼接的话,则依靠循环的方式遍历所有的这种字符串,因为这次的拼接是要成URL链接,所以之前排除在外的网关gaetway和加密类型参数sig
n_type也都会被拼接进来,那么,连接的字符则用大家所熟知的字符’&’,就这样得出一个完整的URL链接地址,如:
https://www.alipay.com/cooperate/gateway.do?s...3d199ba&sign_type=MD5
该链接来自支付宝官方的技术文档“标准实物双接口技术文档”
v. 第五步——自动跳转
第四步中已经运算得出的URL链接字符串,我们则要让其活起来,那么活起来的方式就是——用程序调用它,也就是所谓的页面自动跳转。这样就能跳到支付宝的官方收银台页面。
可以说,现在已经成功的把支付宝接口融合进了大家自己的网站中,且能够使用支付宝来进行付款了。
b) 通知返回部分原理
i. 专业术语
通知返回是两个页面,即传递给支付宝时的notify_url参数所对应的页面文件(asp.net的是Alipay_Notify.aspx、asp的是Alipay_Notify.asp)称之为通知页,传递
给支付宝时的return_url参数所对应的页面文件(asp.net的是Alipay_Return.aspx、asp的是return_Alipay_Notify.asp)称之为返回页。
ii. 通知返回原理
1. 第一步——验证是否是支付宝服务器发来的请求:
a) 以asp程序代码为例:
alipayNotifyURL = "http://notify.alipay.com/trade/notify_query.do?"
alipayNotifyURL = alipayNotifyURL &"partner=" & partner & "¬ify_)这句话,说明您自己编写进去的程序代码执行出错,请检查。
----------------------------------------------------------
六、 其他
a) 有些接口,例如支付的接口,是支持POST或者GET方式传递参数的。
i. POST传递方式:
这里需要注意的地方是:<form action=” aliay_url” …>中action的值是网关+编码格式参数,即https://www.alipay.com/cooperate/gateway.do? _input_charset=utf-8,GBK的编码格式可以为:https://www.alipay.com/cooperate /gateway.do?。
ii. GET传递方式:
是用&字符来连接起来的一长串URL链接字符串,通过自动跳转不是<form action=” aliay_url” …>的方式来存放,而是用Response.Redirect(aliay_url)方式来进行跳转。
引用:http://www.oschina.net/question/163900_24009
原因: 买家支付完成后,当前界面会停留在支付宝的交易付款成功的提示界面上,如:
该页面有短暂的停留时间,买家看到这个提示信息后有可能会把当前页面关掉,导致页面没有自动跳转回商户网站(return_url)使得商户的业务数据没有被处理(如:订单没有更新)。出现这种情况的原因是:商户网站的支付宝接口并没有利用服务器异步通知页面文件(notify_url)或是该页面在订单执行过程中也出现异常。 解决方法: 解决人员:商户网店开发、维护或管理的程序开发技术人员、商户网店系统提供商 解决步骤: 1、打开return_url页面文件(参数参数return_url对应返回文件),找到已经编写好的业务逻辑处理程序代码段,对其增加防止该笔交易被重复处理判断。 2、打开notify_url页面文件(参数参数notify_url对应返回文件),找到可插入商户的业务逻辑处理程序代码的地方,编写与return_url页面文件中相类似的程序,也需要包含防止该笔交易被重复处理的判断。 修改完成后效果: 当买家关掉自动跳转回商户网站的返回页面(参数return_url对应的return_url返回文件)时,商户的业务处理依旧被notify_url页面文件所执行,因此就不会发生业务没有同步的现象出现(如:订单没有被更新) 注意: 1、注意获取值的方式,notify_url页面文件的获取方式如:request.form("参数名 ")、$_POST['参数名'],return_url页面文件的获取方式,如:request.querrystring("参数名 ")、$_GET['参数名'] 2、notify_url文件的特性是: 1、 必须保证服务器异步通知页面(notify_url)上无任何字符,如空格、HTML标签、开发系统自带抛出的异常提示信息等; 2、 该页面中获得参数的方式,需要使用POST方式获取,如: request.Form(“out_order_no”)、$_POST['out_order_no']; 3、 支付宝主动发起通知,该方式才会被启用; 4、 只有在支付宝的交易管理中存在该笔交易,且发生了交易状态的改变,支付宝才会通过该方式发起服务器通知(即时到账中交易状态为“等待买家付款”的状态默认是不会发送通知的); 5、 服务器间的交互,不像页面跳转同步服务器异步通知页面可以在页面上显示出来,这种交互方式是不可见的; 6、 第一次交易状态改变(即时到账中此时交易状态是交易完成)时,不仅页面跳转同步通知页面会启用,而且服务器异步通知页面也会收到支付宝发来的处理结果通知; 7、 程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。 在25小时内完成6~10次通知(通知频率:5s,2m,10m,15m,1h,2h,6h,15h); 8、 程序执行完成后,该页面不能执行页面跳转。如果执行页面跳转,支付宝会收不到success字符,会被支付宝服务器判定为该页面程序运行出现异常,而重发处理结果通知; 9、 cookies、session等在此页面会失效,即无法获取这些数据; 10、 该方式的调试与运行必须在服务器上,即互联网上能访问; 11、 该方式的作用主要防止订单丢失,即页面跳转同步服务器异步通知页面没有处理订单更新,它则去处理; 12、 通知ID(参数notify_id)只有一分钟有效期,超过一分钟该次通知会验证失败。一旦验证成功下次再验证就会失效。 "如果您依照以上方法还无法解决,可提交集成申请,我们的技术支持会及时与您联系,协助您解决。 申请地址:https://b.alipay.com/support/helperApply.htm?action=supportHome"
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小时以内。
-------------------------------------------------------------------接口原理-------------------------------------------------------------------