安装中付出现sign验校失败原因

2025-03-23 19:17:40
推荐回答(1个)
回答(1):

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验证失败原因分析