1.获取$_GET中key为不为sign、sign_type并且value不为空的项
本文来自http://leo108.com
2.将新生成的数组按照key的ascii值进行排序(使用ksort函数)
本文来自leo108's blog
3.把数组所有元素,按照“key=value”的模式用“&”字符拼接成字符串
http://leo108.com/pid-1921.asp
4.把这个字符串和支付宝的安全验证码(配置中的“key”这一项)拼接,并计算md5
未经允许严禁转载
5.将计算出的md5值与$_GET['sign']比较,如果相同则Sign验证通过
未经允许严禁转载
也就是说,Sign验证失败的原因就在于$_GET数组拼接成字符串过程采集者烂JJ
于是找了条同步返回的日志,因为是GET方式返回的,所以所有参数都有记录,通过上述方式计算md5,结果发现和支付宝服务器返回的md5是一致的,大概就可以猜出是Thinkphp对$_GET数组的改造导致的
ThinkPHP
在代码中将$_GET数组输出,发现多了一项_URL_,这是使用Thinkphp的pathinfo模式导致,可以通过$_GET['_URL_']来获取url信息。
本文来自http://leo108.com
而支付宝服务器异步返回却没有这个问题,是因为异步返回使用的是POST方式,验证的也是$_POST数组,Thinkphp对$_GET的改造不影响到Sign验证。
ThinkPHP
所以解决方案是在进行Sign验证之前将$_GET中的_URL_删除,unset($_GET['_URL_'])Thinkphp中使用支付宝接口同步返回Sign验证失败原因分析