[PHP]误读支付宝接口可能引发的乌龙
------------------------------------------------------------------------------------
之所以发现这个坑,源起项目中的支付宝页面跳转同步通知页return_url中的$verify_result始终返回false。
$alipayNotify = new Alipaynotify($alipay_config); //支付宝通知处理类 $verify_result = $alipayNotify->verifyReturn();
verifyReturn函数用于针对return_url验证消息是否是支付宝发出的合法消息
其中生成签名结果一项,$isSign = $this->getSignVeryfy($_GET, $_GET['sign']);返回true或false
getSignVeryfy是获取返回时的签名验证结果,该函数做以下三件事(调用的均为支付宝公用函数):
1. 除去待签名参数数组中的空值和签名参数,paraFilter
2. 对签名参数数组排序,argSort
3. 把数组所有元素,按照‘参数=参数值’的模式用“&”字符拼接成字符串,createLinkstring
4. 如果是MD5加密,使用md5Verify验证签名,返回true或false
第1,2两步都没有问题,到第3步时,我们所期待的结果是这样子的:
而打印后返回的结果是这样的:
显然,这里转换出了问题,下面来看一下createLinkstring函数的具体实现
/**
* 把数组所有元素,按照"参数=参数值"的模式用“&”字符拼接成字符串
* @param $para 需要拼接的数组
* return 拼接完成以后的字符串
*/
function createLinkstring($para) {
$arg = '';
while (list ($key, $val) = each ($para)) {
$arg .= $key ."=".$val ."&";
}
//去掉最后一个&字符
$arg = substr($arg, 0, count($arg)-2); //如果存在转义字符,那么去掉释义
if(get_magic_quotes_gpc()) {
$arg = stripslashes($arg);
} return $arg;
}
上面连接字符串部分使用foreach实现都不影响$arg, substr使用rtrim实现也不影响$arg, get_agic_quotes_gpc在5.4以上才废弃,但是里面不存在转义字符;再看上面打印的结果,很有可能是 “&” 符号出了问题,程序部分将 “&” 符改为 “&” 后终于得到了期望的结果。
$arg .= $key ."=".$val ."&";
大家猜想一下,如果把上面的双引号改为单引号后,能不能得到期望的结果,如下(回复中解答):
$arg .= $key .'='.$val .'&';
另外,出现这种情况不排除PHP版本问题,大家试过之后不妨留言告诉我 你们的情况。
异步通知url和同步通知url中都不能有自定义参数,由于提交支付宝时的参数加密与跳转商家页面的验证加密机制是一致的,所以一旦url中含有自定义参数,导致提交前与提交后不相等,$verify_result将返回false,即无法通过验证;不通过这一步验证,商户的数据操作始终无法进行,如果就此忽略$verify_result必然存在安全问题。
对于mvc形式的动态url,需要去除提交时不需要的参数,保证干净,如:
unset($_GET['controller']);
unset($_GET['method']);
$alipayNotify = new Alipaynotify($alipay_config);
$verify_result = $alipayNotify->verifyReturn();
if($verify_result) {
//验证成功(商户逻辑代码)
} else {
//验证失败(调试请看Alipaynotify.php页面的verifyReturn函数)
}
同步url的参数保证了干净,同样别忘了提交时不要带有,如:
unset($_GET['controller']);
unset($_GET['method']);
$this->load->library('Alipaysubmit');
$alipay_config = $this->alipay_config;
$alipaySubmit = new Alipaysubmit($alipay_config);
...
为什么异步notify_url会失效?
如果异步notify_url地址是mvc形式,因为你的控制器和方法已经被支付宝过滤掉,那么支付宝将找不到页面,所以无法通知到这个指定的地址。
Link:http://www.cnblogs.com/farwish/p/4309520.html
@黑眼诗人 <www.farwish.com>
[PHP]误读支付宝接口可能引发的乌龙的更多相关文章
- wap支付宝接口的问题
		
今天在支付宝接口开发时,遇到的两个坑 第一个: https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.8nHr4i& ...
 - android开发支付宝接口开发流程(密钥篇)
		
参考博客:http://blog.it985.com/12276.html 官方下载地址:http://download.alipay.com/public/api/base/WS_MOBILE_PA ...
 - ThinkPHP实现支付宝接口功能
		
最近做系统,需要实现在线支付功能,毫不犹豫,选择的是支付宝的接口支付功能.这里我用的是即时到帐的接口,具体实现的步骤如下:一.下载支付宝接口包下载地址:https://doc.open.alipay. ...
 - (实用篇)php支付宝接口用法分析
		
本文实例讲述了php支付宝接口用法.分享给大家供大家参考.具体分析如下: 现在流行的网站支持平台,支付宝当仁不让的老大了,现在我们就来告诉你如何使用支付宝api来做第三方支付,把支付宝放到自己网站来, ...
 - 【转载】关于Alipay支付宝接口(Java版)
		
转载自:http://blog.163.com/lai_chao/blog/static/70340789201412724619514/ 1.alipay 双功能支付简介 2.alipay 提交支付 ...
 - PHP支付宝接口RSA验证
		
这两天一直困扰的PHP RSA签名验证问题终于解决了,由于之前RSA接触的不多,再加上官方至今还未有PHP的SDK可供参考,因此走了一些弯路,写在这里和大家分享. 虽然支付宝官方还未提供相关SD ...
 - android应用程序如何调用支付宝接口
		
最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多. 在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单.而且支付宝提供的接口一直在 ...
 - [转]支付宝接口程序、文档及解读(ASP.NET)
		
本文转自:http://www.cnblogs.com/blodfox777/archive/2009/11/03/1595223.html 最近需要为网站加入支付宝的充值接口,而目前关于支付宝接口开 ...
 - android应用程序如何调用支付宝接口(转)
		
最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多. 在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单.而且支付宝提供的接口一直在 ...
 
随机推荐
- oracle11g的监听配置文件中的program和env两个配置,必须干掉,客户端才能正常连接
			
oracle11g的监听配置文件中的program和env两个配置,必须干掉,客户端才能正常连接 oracle11g的监听配置文件中的program和env两个配置,必须干掉,客户端才能正常连接 or ...
 - DAY 04运算符与流程控制
			
输入输出补充: python2与python3的输入输出不同 python2中有两种用户 输入方式,一种是raw_input,和input raw_input与python3的input是相同的 而p ...
 - Quartz在Spring中动态设置cronExpression
			
什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...
 - 同时开始了SQL。。。
			
SQL LIMIT OFFSET 和 LIMIT code1: SELECT id, name, score FROM table ORDER BY score DESC LIMIT OFFSET 4 ...
 - @angular/cli 工程 项目 配置
			
如果你创建工程项目用angular-cli 你的样式文件想使用scss, 并且让ng serve自动编译它们 你可以在创建项目的时候用 ng new sassy-project --style=sas ...
 - zombodb 配置设置
			
主要是关于es 集群地址以及分片,复制副本的配置,配置主要在postgresql.conf,当然我们可以在函数中指定 postgresql.conf 级别的配置 es 配置 格式 zdb.defaul ...
 - html总结2
			
(1)选择器: 1.标签选择器:用于修饰同类HTML标签的共性风格 <style type="text/css"> li{ color:red; font-size:2 ...
 - 第一章 Html+Css使用总结(下)
			
1 开场 <!DOCTYPE html> <html lang="en"> <head> <!-- 对于中文网页需要使用 <meta ...
 - python logging配置时间或大小轮转
			
python中的很多模块是非常牛X的,之前提到过logging模块(其功能类似于java下的Log4j ),由于最近一个涉及网络排障的脚本需要日志输出,这里就使用了python的logging模块去实 ...
 - Spring Cloud(Dalston.SR5)--Zuul 网关-Hystrix 回退
			
当我们对网关进行配置让其调用集群的服务时,将会执行 Ribbon 路由过滤器,该过滤器在进行转发时会封装为一个 Hystrix 命令予以执行,Hystrix 命令具有容错的功能,如果"源服务 ...