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

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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值