php soap https 登录 复杂请求 上海资信 金融p2p Error cannot find parameter <faultstring>Function ' not found

来源:互联网 发布:c语言从右至左的运算符 编辑:程序博客网 时间:2024/04/30 07:16

php soap 复杂请求 上海资信 金融p2p <faultstring>Error cannot find parameter <faultstring>Function ' not found


要点

1 soap 链接 https的接口的时候 dorequest 方法需要重写

2 需要需要登录的话 dorequest 也要加入cookie

3 注意要加入wsdl规范  new soapclient('wsdl.txt',options)

wsdl.txt 从soap接口服务器下载


问题:


1 群友(php群 50194090)问soap接口的问题,,上海资信soap 。比较复杂的接口 需要登录 vpn,登录后输入网址,得到soap 接口的真实地址

2 、

先登录


$url = 'https://vpn.shanghai-cis.com.cn/+webvpn+/index.html';$post_data = array('tgroup' =>'','next' =>'','tgcookieset' =>'','username'=>'aaa','password'=>'bbb','Login'=>'登录',);$headers = array("Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Encoding:gzip, deflate","Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3","Connection:keep-alive","Cookie:webvpnx=; webvpnlogin=1; webvpn_state=; csc_next=; webvpnlogin=1; webvpnLang=en","Host:vpn.shanghai-cis.com.cn","Referer:https://vpn.shanghai-cis.com.cn/+CSCOE+/logon.html","User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:39.0) Gecko/20100101 Firefox/39.0");$link = curl($url,$headers,$post_data);//var_dump($link);$reg = '/webvpn=\s*([^;]+);/is';echo $link;if (preg_match_all($reg,$link['header'],$p))$cookiestr = implode(';',$p[1]);

function curl($url,$headers=array(),$post_data=''){    $ch = curl_init();    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查    //curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);  // 从证书中检查SSL加密算法是否存在    curl_setopt($ch, CURLOPT_URL, $url);    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);    curl_setopt($ch, CURLOPT_HEADER, true);    curl_setopt($ch, CURLOPT_POST, true);    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    curl_setopt($ch, CURLOPT_TIMEOUT, 30);    $response = curl_exec($ch);    $errmsg = curl_error($ch);    $pos = strpos($response,"\r\n\r\n");    return array(        'code'=>curl_getinfo($ch,CURLINFO_HTTP_CODE),        'header'=>substr($response,0,$pos),        'body'=>substr($response,$pos+4),        'error'=>$errmsg    );    //curl_close($ch);}
链接 soap
       $context = stream_context_create( array (            'ssl' => array (                'verify_peer' => false,                'allow_self_signed' => true            ),        ));        $options['stream_context'] = $context;$client = new SoapClientAuth('wsdl.txt', array(            'location' => 'https://vbbb/batchcredit?wsdl', // 设置server路径            'uri' => 'https://vpn.ddd/batchcredit?wsdl',            'login' => 'ccc', // HTTP auth login            'password' => 'ddd', // HTTP auth password            'trace'=>true,            'targetNamespace'=>'http://webservice.creditreport.p2p.sino.com/',            'stream_context'=>$context        ));        $client->__setCookie('webvpn',$cookiestr);        var_dump($client);
返回方法,和测试方法

$param1 = array(            'orgcode'=>'Q100000000',            'secret'=>'bbbbb',            'plate'=>'1',            'certtype'=>'0',            'certno'=>'111',            'name'=>'李亚',            'reason'=>'06',            'createtype'=>'0'        );


        var_dump($client->__getFunctions());        //var_dump($client->__soapCall());$ret = $client->queryCredit($param1);



最重要的soap 类

<?php/** *    SoapClientAuth for accessing Web Services protected by HTTP authentication *    Author: tc *    Last Modified: 04/08/2011 *    Update: 14/03/2012 - Fixed issue with CURLAUTH_ANY not authenticating to NTLM servers *    Download from: http://tcsoftware.net/blog/ * *    Copyright (C) 2011  tc software (http://tcsoftware.net) * *    This program is free software: you can redistribute it and/or modify *    it under the terms of the GNU General Public License as published by *    the Free Software Foundation, either version 3 of the License, or *    (at your option) any later version. * *    This program is distributed in the hope that it will be useful, *    but WITHOUT ANY WARRANTY; without even the implied warranty of *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *    GNU General Public License for more details. * *    You should have received a copy of the GNU General Public License *    along with this program.  If not, see <http://www.gnu.org/licenses/>. */    /**     * SoapClientAuth     * The interface and operation of this class is identical to the PHP SoapClient class (http://php.net/manual/en/class.soapclient.php)     * except this class will perform HTTP authentication for both SOAP messages and while downloading WSDL over HTTP and HTTPS.     * Provide the options login and password in the options array of the constructor.     *     * @author tc     * @copyright Copyright (C) 2011 tc software     * @license http://opensource.org/licenses/gpl-license.php GNU Public License     * @link http://php.net/manual/en/class.soapclient.php     * @link http://tcsoftware.net/     */    class SoapClientAuth extends SoapClient{        public $Username = NULL;        public $Password = NULL;        /**         *         * @param string $wsdl         * @param array $options         */        function SoapClientAuth($wsdl, $options = NULL)        {            @stream_wrapper_unregister('https');            @stream_wrapper_unregister('http');            stream_wrapper_register('https', 'streamWrapperHttpAuth');            stream_wrapper_register('http', 'streamWrapperHttpAuth');            if($options)            {                $this->Username = $options['login'];                streamWrapperHttpAuth::$Username = $this->Username;                $this->Password = $options['password'];                streamWrapperHttpAuth::$Password = $this->Password;            }            parent::SoapClient($wsdl, ($options?$options:array()));            @stream_wrapper_restore('https');            @stream_wrapper_restore('http');        }        function __doRequest($request, $location, $action, $version) {            $headers = array(                'User-Agent: PHP-SOAP',                'Content-Type: text/xml; charset=utf-8',                'SOAPAction: "' . $action . '"',                'Content-Length: ' . strlen($request),                'Expect: 100-continue',                'Connection: Keep-Alive'            );            $this->__last_request_headers = $headers;            $ch = curl_init($location);            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);            curl_setopt($ch, CURLOPT_POST, TRUE);            curl_setopt($ch, CURLOPT_POSTFIELDS, $request);            curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);            curl_setopt($ch, CURLOPT_FAILONERROR, FALSE);            curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);            curl_setopt($ch, CURLOPT_USERPWD, $this->Username . ':' . $this->Password);            global $cookiestr;            curl_setopt($ch, CURLOPT_COOKIE,'webvpn='.$cookiestr);            //curl_setopt($ch, CURLOPT_SSLVERSION, 3);            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);            //curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);            curl_setopt($ch, CURLOPT_VERBOSE, TRUE);            curl_setopt($ch, CURLOPT_CERTINFO, TRUE);            $response = curl_exec($ch);            if(($info = curl_getinfo($ch)) && $info['http_code']==200)                return $response;            else if($info['http_code']==401)                throw new Exception ('Access Denied', 401);            else if(curl_errno($ch)!=0)            {                throw new Exception(curl_error($ch), curl_errno($ch));            }else                print_r($info);                echo $info['http_code'];                throw new Exception('Error', $info['http_code']);        }    }    class streamWrapperHttpAuth    {        public static $Username = NULL;        public static $Password = NULL;        private $path = NULL;        private $position = 0;        private $buffer = NULL;        private $curlHandle = NULL;        public function stream_close()        {            if($this->curlHandle)                curl_close ($this->curlHandle);        }        public function stream_open($path, $mode, $options, &$opened_path)        {            $this->path = $path;            $response = $this->postRequest($this->path);            $this->buffer = ($response!==FALSE?$response:NULL);            $this->position = 0;            return $response!==FALSE;        }        public function stream_eof()        {            return $this->position>strlen($this->buffer);        }        public function stream_flush()        {            $this->position = 0;            $this->buffer = NULL;        }        public function stream_read($count)        {            if($this->buffer)            {                $data = substr($this->buffer, $this->position, $count);                $this->position += $count;                return $data;            }            return FALSE;        }        public function stream_write($data)        {            return ($this->buffer?TRUE:FALSE);        }        public function stream_seek($offset, $whence = SEEK_SET)        {            switch($whence)            {                case SEEK_SET:                    $this->position = $offset;                    break;                case SEEK_CUR:                    $this->position += $offset;                    break;                case SEEK_END:                    $this->position = strlen($this->buffer) + $offset;                    break;            }            return TRUE;        }        public function stream_tell()        {            return $this->position;        }        public function stream_stat()        {            return array('size' => strlen($this->buffer));        }        public function url_stat($path, $flags)        {            $response = $this->postRequest($path);            return array('size' => strlen($response));        }        protected function postRequest($path, $authType = CURLAUTH_ANY)        {            $this->curlHandle = curl_init($path);            curl_setopt($this->curlHandle, CURLOPT_RETURNTRANSFER, TRUE);            curl_setopt($this->curlHandle, CURLOPT_FOLLOWLOCATION, TRUE);            if(streamWrapperHttpAuth::$Username)            {                curl_setopt($this->curlHandle, CURLOPT_HTTPAUTH, $authType);                curl_setopt($this->curlHandle, CURLOPT_USERPWD, streamWrapperHttpAuth::$Username . ':' . streamWrapperHttpAuth::$Password);            }            //curl_setopt($this->curlHandle, CURLOPT_SSLVERSION, 3);            curl_setopt($this->curlHandle, CURLOPT_SSL_VERIFYPEER, FALSE);            //curl_setopt($this->curlHandle, CURLOPT_SSL_VERIFYHOST, 2);            $response = curl_exec($this->curlHandle);            if(($info = curl_getinfo($this->curlHandle)) && $info['http_code']==200)            {                if(curl_errno($this->curlHandle)==0)                {                    return $response;                }else                    throw new Exception(curl_error($this->curlHandle), curl_errno($this->curlHandle));            }else if($info['http_code']==401)            { // Attempt NTLM Auth only, CURLAUTH_ANY does not work with NTML                if($authType!=CURLAUTH_NTLM)                    return $this->postRequest($path, CURLAUTH_NTLM);                else                {                    throw new Exception ('Access Denied', 401);                }            }else if(curl_errno($this->curlHandle)!=0)            {                throw new Exception(curl_error($this->curlHandle), curl_errno($this->curlHandle));            }else                throw new Exception('Error', $info['http_code']);            return FALSE;        }    }?>


0 0