博客导读网

一个让你随便看看的地方

关于财付通接口在Discuz7.2版本无法使用的问题

推荐
My Study

使用Discuz7.2之后,发现财付通支付并不好使,并提示:
支付失败,您的资金未被扣除,原因可能是:您所下单网站链接有更新或者存在风险,请您稍后尝试或者与该网站客服联系。
于是去财付通的接口技术文档上看了一下,说为了安全,防止欺诈,财付通的接口新增加了一个参数spbill_create_ip,不能为空,于是 修改了api/trade/tenpay.api.php文件,注意,Discuz7.2的api/trade/tenpay.api.php文件是使用Zend加密的,可以使用黑刀(DeZend)解密一下, 找到
$reqHandler->setparameter( "ver", "3" );
后面加上一句:
$reqHandler->setparameter( "spbill_create_ip", $_SERVER['REMOTE_ADDR'] );
及时加上了,当时在linux系统上,由于是firefox,测试的时候,发现很正常,但在ie下死活不正常,看接口文档,估计是REFER信息不对导致,于是修改
$reqHandler->setgateurl( "https://www.tenpay.com/cgi-bin/v1.0/pay_gate.cgi" );
$reqHandler->setgateurl( "http://www.xxx.com/tmp.php" );
tmp.php是笔者写的一个测试程序,主要显示环境变量,其内容如下:
<?php phpinfo(); ?>
发现在firefox浏览器下有HTTP_REFERER这个变量,但是ie浏览器下没有HTTP_REFERER这个变量,找到原因了,那么看一下程序,为什么会出现这个现象呢?找到memcp.php文件,找到如下地方:
502 $requesturl = credit_payurl($price, $orderid); 503 504 $query = $db->query("SELECT orderid FROM {$tablepre}orders WHERE orderid='$orderid'"); 505 if($db->num_rows($query)) { 506 showmessage('credits_addfunds_order_invalid'); 507 } 508 509 $db->query("INSERT INTO {$tablepre}orders (orderid, status, uid, amount, price, submitdate) 510 VALUES ('$orderid', '1', '$discuz_uid', '$amount', '$price', '$timestamp')"); 511 512 showmessage('credits_addfunds_succeed', $requesturl);
在跳转时,程序使用了showmessage函数,而查看include/global.func.php文件里面showmessage函数定义,找到:
1099 if($url_forward) { 1100 $show_message = "<script type=\"text/javascript\" reload=\"1\">\nif($('return_$handlekey')) $('return_$handlekey').className = 'onright';\nif(typeof submithandle_$handlekey =='function') {submithandle_$handlekey('$url_forward', '$show_message');} else {location.href='$url_forward'}\n</script>"; 1101 } else { 1102 $show_message .= "<script type=\"text/javascript\" reload=\"1\">\nif(typeof messagehandle_$handlekey =='function') {messagehandle_$handlekey('$messagehandle', '$show_message');}\n</script>"; 1103 }
发现跳转使用的是location.href,而一般写前端界面的人都知道location.href在ie下是取不到refer信息的,那么现在问题就变成用什么方法代替location.href的跳转呢?问题也很简单,拷贝一份showmessage函数的内容,命名函数showmessage为函数trade_showmessage,然后找到上述的地方,修改成:
1105 if($url_forward) { 1106 $show_message = "<script type=\"text/javascript\" reload=\"1\">\nif($('return_$handlekey')) $('return_$handlekey').className = 'onright';\nif(typeof submithandle_$handlekey =='function') {submithandle_$handlekey('$url_forward', '$show_message');} else { if (document.all){ var gotoLink = document.createElement('a');gotoLink.href='$url_forward';document.body.appendChild(gotoLink);gotoLink.click();}\nelse window.location.href='$url_forward';}\n</script>"; 1107 } else { 1108 $show_message .= "<script type=\"text/javascript\" reload=\"1\">\nif(typeof messagehandle_$handlekey =='function') {messagehandle_$handlekey('$messagehandle', '$show_message');}\n</script>"; 1109 }
即创建一个DOM节点,并添加click事件,从而memcp.php文件调用trade_showmessage函数解决问题。
原文地址:http://my.huhoo.net/archives/2011/10/discuz72.html

My Study的其他文章
关于vncserver的一些问题 [ZT]人类无法抗拒的十大心理心理学效应
fedora16中如何将gnote图标自动添加信息栏 fedora各种版本的比较
fedora16中解决gnome-shell占用100%的问题 [ZT]服务价值
关于高版本的libtool v2.4的问题 新一代 Linux 文件系统 btrfs 简介
关于在firefox下SSL error renegotiation not allowed的问题 郁闷的SSH
更多...

© 2010 博客导读网 BlogABC.NET 本站所有内容皆由网友推荐而来,所有博文的版权归原作者所有,如有冒犯,请邮件告知。uncracker#gmail.com