杭州神话信息技术有限公司
标题:
BUG反馈-支付宝接口notify_url失效BUG
[打印本页]
作者:
omasm
时间:
2010-12-15 12:56:29
标题:
BUG反馈-支付宝接口notify_url失效BUG
前几天下了天天团购系统测试,发现在使用支付宝付款之后,如果用户关闭了支付成功的跳转页面,再返回到我的团购页面显示订单仍然是未付款状态,但是如果等待支付宝的支付成功页面自动跳转回来则没有这个问题,于是我抽空看了下系统的支付宝模块代码,发现在/modules/alipay.pay.php 59行,有这样一句代码
$sql='select * from '.TABLE_PREFIX.'tttuangou_order where orderid = '.addslashes($_GET['out_trade_no']).' and userid ='.MEMBER_ID;
$query = $DatabaseHandler->Query($sql);
$order=$query->GetRow();
if($order=='')return "无法继续付款,无法找到订单!";
注意这里在验证订单时候用了MEMBER_ID这个常量,而这个常量的定义在/include/lib/member.han.php的110行,并且是通过MemberHandler这个类的GetMember()方法获取的(/include/lib/member.han.php,529行)。
我没有往下细看这个GetMember()方法,但已经大概明了系统获取MEMBER_ID的方法,即通过SESSION的方式,返回用户的ID并借此判断用户的权限及其他基本信息(此处可能有出入,待进一步研究)。
这里的问题是,支付宝接口提供了两个通知参数,一个是return_url,另一个是notify_url,return_url用于使用支付宝支付成功后等待数秒的跳转,只请求一次,而notify_url是支付宝异步请求,不可能返回SESSION信息,而系统的return_url和notify_url却设为了同一个(见alipay.pay.php26行,
'_input_charset' => $charset, 'notify_url' => "$returnurl", 'return_url' => "$returnurl",
)
,这样就造成了前面描述的问题,即如果用户在成功支付后等待页面跳转至return_url,这样浏览器跳转过程中系统一定可以获取用户的SESSION信息,但是一旦用户关闭了成功支付页面,即return_url没有经过浏览器跳转,此时支付宝通过notify_url异步请求系统的 ‘/?mod=index?code=repay&pay=alipay’时,就会造成用户的SESSION信息丢失,从而导致付款失败。
由于对天天团购系统研究的时间不多,以上仅为我的一些个人看法,可能有所纰漏,还望管理员及时指正。
如果有同学对此主题同样感兴趣,也可通过邮件进一步讨论,
我的邮箱:
omasm.us@gmail.com
谢谢!
作者:
wsktianxia
时间:
2010-12-16 09:22:48
不知道新版本有没有修改好
作者:
omasm
时间:
2010-12-16 15:25:47
本帖最后由 omasm 于 2010-12-16 15:29 编辑
据我的看法,这个bug要修复,要改动的代码相当多。因为补单的机制就是原本由return_url处理的流程(账户充值 - 扣款 - 订单支付成功 - 检查团购人数-生成团购券)现在用notify_url再执行一遍。而天天系统return_url与notify_url是同一个,并且return_url里面所有的业务逻辑都需要MEMBER_ID这个常量才能执行,现在要把notify_url独立出来就比较困难了。
本来我打算在/?mod=index里添加加一个自定义的code(也就是Action)用来处理notify_url请求,后来发现由于无法获取正确的MEMBER_ID常量,根本不能调用系统内置的处理函数,只好作罢。
作者:
放牛郎
时间:
2010-12-18 00:46:03
回复
3#
omasm
看来楼主也是高手啊。
这个问题在V1.2beta中已经得以完善解决,请升级测试。
欢迎光临 杭州神话信息技术有限公司 (http://www.cenwor.com/)
Powered by Discuz! X2