让代码更简单

关于集成支付宝即时到账功能官方demo中的异常总结

重要:本文最后更新于2019-01-08 08:37:42,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

前不久代码狗拿到了个体工商户证件,成功申请了支付宝即时到账接口。不得不说大企业的开发文档真的很坑,腾讯如此,阿里也是一样只有一个字形容,乱。各种文档没有目录,而且邮件中给的文档地址根本没有需要的内容。好不容易找到的即时到账接口文档,下载的demo中还有异常,花了我好长时间浪费精力,下面是我在集成支付宝即时到账功能时,遇到的坑,写给大家共勉。

支付宝即时到账接口集成问题总结

支付宝即时到账接口集成问题总结

支付成功校验失败

测试支付时出现支付成功后跳转到自己网站同步通知时,出现校验错误,按照官方demo中的代码逻辑,支付成功后会同步通知商家,并校验签名取得通知id向支付宝服务器请求核实,核实成功结果以布尔类型返回,然而坑就在这里。

复制
	function verifyReturn(){
		if(empty($_GET)) {//判断POST来的数组是否为空
			return false;
		}
		else {
			//生成签名结果
			$isSign = $this->getSignVeryfy($_GET, $_GET["sign"]);
			//获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
			$responseTxt = 'false';
			if (! empty($_GET["notify_id"])) {$responseTxt = $this->getResponse($_GET["notify_id"]);}
					
			//验证
			//$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
			//isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
			if (preg_match("/true$/i",$responseTxt) && $isSign) {
				return true;
			} else {
				return false;
			}
		}
	}

为了找出这个问题,我将支付宝给的demo中通知类里验证部分逐步die并输出后发现,支付宝服务器返回的核实结果是空的,以至于后面使用正则匹配字符串true没有找到,也就出现验证失败的情况。

既然知道返回空,那么我们只需要检查下我们提交的数据是不是正常的,于是我将提交的数据使用var_dump函数打印出来后发现了异常。&notify这个字段被转义成了乱码字符,乍一看我还以为原因在这里,后面发现是我理解错了。

这里要说到特殊字符在HTML中显示可能会被转义的情况,可以使用PHP函数htmlspecialchars过滤下就能看到真实的数据了,过滤后发现没问题。但在一个文件路径中发现了新的异常。

关于集成支付宝即时到账功能官方demo中的异常总结

关于集成支付宝即时到账功能官方demo中的异常总结

就是这段获取支付宝证书的代码带来的错误,重点在于路径分隔符!

Windows与Linux路径分隔符是不同的,Windows使用过\表示,Linux中使用/,这份demo应该是支付宝的技术人员使用Windows平台验证后发布的,而我的服务器是Linux,在向支付宝服务器要求核验时,由于没有携带正确的支付宝证书,导致支付宝服务器未响应我们的请求,也就出现了上面支付成功但验证失败的情况。

解决办法只需要根据你自己的运行平台修改对应的路径连接符即可,真是坑。问了三个支付宝接口集成技术客服,个个都说我的编码问题,我真想喷他们。总结了下,一般情况下,任何技术支持都是没作用的,除非你直接花钱让他们给你搞定,反正不管腾讯还是阿里我发的工单已经有十多个了,没一个解决了的,反正是自己的问题。虽然最后确实是用户的问题,但用户反馈了情况,你应该结合自己的技术给予对方一点提示吧,乱码提示???擦!

感觉很棒!可以赞赏支持我哟~

1 打赏

评论 (0)

登录后评论
QQ咨询 邮件咨询 狗哥推荐