最近对接第三方通知接口时,出现一个奇怪的问题。
soap的请求,有进入soap service 的 init 事件,确没有进入最终的动作。
暂时查不出原因,因为服务器只有上传的权限,没有拦截报文和相关其它的权限。同时只有目标发起时才发生,都是要钱的,不土豪。。测试不起。。也只能做猜想,尝试各种方法先解决了。
猜想:
1.报文有出现特殊字符,在复制的过程中会被处理,但是本身程序正常处理时,碰到会异常
2.请求不完整,可能第三方通知机制,接通后不等响应就把请求停了。这块不好验证。
3.框架或服务器bug。
经过各种尝试之后,确认了些问题,问题并不出在报文和请求头,因为将报文和请求头保存之后,在本地和在服务端模拟请求。都有正常响应。(不确认是否在各种复制的过程中,特殊字符丢失)
时间紧迫,所以按最快的方式处理。因为init能正常进行访问,所以将通知请求的解析在init中进行处理,解析出目标数据再调用原来的动作。
//获取soap报文,普通的 soap?wsdl是响应报文,不要搞混 $reqxml = file_get_contents ( 'php://input' ); //判断请求报文是否有对应的动作 if ($reqxml && preg_match ( '/xxxxxRequest/', $reqxml )) //解析xml,得到对应数据 $reqxml = @simplexml_load_string ( $reqxml, NULL, LIBXML_NOCDATA ); //注意有些特殊标签在属性里,需要进行特殊关联。因为只有一个,这边进行了简单处理。 $request = json_decode ( json_encode ( $reqxml ), true ); //自己调用原来的函数。触发对应的通知处理 ..... //函数返回后,和原来的情况一样。没有经过目标函数,所以需要手动输出响应报文 echo '<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:xxxxxxControllerwsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:xxxxxxResponse>xxxxxx</ns1:xxxxxResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>';' //记得关闭, exit ();
先留位置,因为只是特殊出现。暂时只保留特殊处理。先记录,后面有时间再深入研究解决,好吧。是测试太频繁。。。。钱钱钱的问题。。。。