一个调用webservice的php基类

原创 2016年08月29日 12:05:24

调用webservice肯定需要验证来源方和接收方的数据合法性,只有对于合法的数据才处理。


本代码使用CI框架编写,主要有

1.生成响应内容的方法;

2.发送请求的方法;

3.包括将xml转化为array的方法;

4.验证签名是否正确的方法;

5.构造发送请求的xml字符串方法

签名主要根据内容和盐值生成,可以判断接收到的内容是否正确;判断发来的xml字符串是否被篡改,如果一旦被篡改就给出错误提示,不再后续处理。


<?php
class Basewebservice
{
    /**
     * 数字签名验证是否成功
     * @param  string $xmlContent xml字符串
     * @return boolean
     */
    public function checkSignIsValid($xmlContent)
    {
        $posSign = strpos($xmlContent, '<sign>');
        $sign = substr($xmlContent, $posSign+6,32);
        
        $pos1 = strpos($xmlContent, '<body>');
        $pos2 = strpos($xmlContent, '</body>');
        $content = substr($xmlContent, $pos1, $pos2-$pos1+7);
        
        $this->load->config('security');
        
        if (strtolower($sign) != md5($this->config->item('soap_salt_hash', 'security').$content)) {
            $content = NULL;
            return FALSE;
        }
        $content = NULL;
        return TRUE;
    }

    /**
     * the body string of the xml content for outputing
     * @param  string $strBody xml字符串body部分
     * @return string           返回的xml字符串
     */
    public function makeOutput($strBody)
    {
        $this->load->config('security');
        $sign = md5($this->config->item('soap_salt_hash', 'security').$strBody);
        
        $output  =  '<?xml version="1.0" encoding="UTF-8" ?><response><version>1</version>';
        $output .= '<sign>'.$sign.'</sign>';
        $output .= $strBody;
        $output .= '</response>';
        return $output;
    }

    /**
     * XML转数组
     * @param  string $xmlstring XML字符串
     * @return string            数组
     */
    public function xml2Array($xmlstring)
    {
        $str_source = array('\\x00','\\x01','\\x02','\\x03','\\x04','\\x05','\\x06','\\x07','\\x08',
        '\\x0b','\\x0c','\\x0e','\\x0f','\\x10','\\x11','\\x12','\\x13','\\x14','\\x15',
        '\\x16','\\x17','\\x18','\\x19','\\x1a','\\x1b','\\x1c','\\x1d','\\x1e','\\x1f');
        $xmlstring = str_replace($str_source, '', $xmlstring);
        $str_source = ['&'   ,     "'" ];//,'<','>','"',"'"
        $str_target = ['&','''];//,'<','>','"','''
        $xmlstring = str_replace($str_source, $str_target, $xmlstring);
        
        return json_decode(json_encode((array)simplexml_load_string($xmlstring)),true);
    }

    /**
     * 发送一个webservice请求
     * @param  string $xmlContent 完整的xml请求字符串
     * @param  string $method     服务器提供的webservice中的方法
     * @return Maxed             array or false
     */
    public function sendRequest($xmlContent, $method)
    {

        ini_set("soap.wsdl_cache_enabled" , 0);

        $errorLevel = error_reporting(); //先获取到系统的默认错误报告级别
        error_reporting(E_ERROR);
        ini_set('default_socket_timeout' , 3);
        $receiveArr = [];
        $this->load->config('biz');
        $url = $this->config->item('targetWebServiceUrl', 'biz');
        try
        {
              libxml_disable_entity_loader(false);
              $client = new SoapClient($url,array('connection_timeout' => 3));
              $params = array('parameters'=>array('xmlContent' => $xmlContent));
              $res = $client->__soapCall($method, $params);
              $this->load->library('bizlog');
    //              $this->bizlog->info('b2b_services', 'return res:['.$res->Result.']');
              
              $result = $this->checkSignIsValid($res->Result);
              if ( ! $result) {

                   $this->bizlog->info('b2b_services', '签名错误,具体收到的xml串为:['.$res->Result.']');

                   error_reporting($errorLevel);
                  return FALSE;
              }
              

              $receiveArr = $this->xml2Array($res->Result);

              error_reporting($errorLevel);//恢复到以前的错误级别设置
              return $receiveArr;

        }
        catch(Exception $e)

        {

            error_reporting($errorLevel);
            throw $e;
        }
        
         return $receiveArr;
        
    }

    /**
     * 构造发送请求的xml字符串
     * @param  string $xmlBody body部分xml字符串
     * @return string          完整的xml请求字符串
     */
    public function makeRequestXml($xmlBody)
    {
        $this->load->config('security');
        $salt = $this->config->item('soap_salt_hash', 'security');
        
        $output  =  '<?xml version="1.0" encoding="UTF-8" ?><request><version>1</version>';
        $sign    = md5($salt.$xmlBody);
        $output .= '<sign>'.$sign.'</sign>';
        $output .= $xmlBody;
        $output .= '</request>';
        return $output;
    }
}
?>


版权声明:本文为博主原创文章,未经博主允许不得转载。

php调用webservice的几种方法

1.WSDL模式: [php] view plaincopy $soap = new SoapClient("http://192.168.6.69...
  • younger_z
  • younger_z
  • 2015年07月10日 15:13
  • 2342

java调用php的webService

1.首先先下载php的webservice包:NuSOAP,自己到官网去下载,链接就不给出来了,自己去google吧    基于NoSOAP我们写了一个php的webservice的服务端,例子如下:...
  • joliny
  • joliny
  • 2008年06月10日 15:05
  • 4684

PHP调用WebService接口

WebService是一个提供外部使用的一个服务,使用PHP去调用它其实是很简单的,写一个demo如下: 1、首先你的PHP要支持SOAP 检测PHP是否支持SOAP打印phpinfo(),如下图说明...
  • u013032788
  • u013032788
  • 2015年07月16日 17:28
  • 4652

PHP Webservice的发布与调用

PHP Webservice的发布与调用 1.  环境配置配置php.ini,把php_soap.dll前面的分号去掉, 不然会报错class soapserver not found  重启apac...
  • 21aspnet
  • 21aspnet
  • 2011年10月28日 10:55
  • 8009

PHP调用java写的webservice

  • harbor1981
  • harbor1981
  • 2016年08月11日 17:58
  • 1237

php中的基类,派生类

基类就是父类,派生类就是子类 你可以理解为生活中的父子关系, 也就是说儿子继承了所有的父亲的样貌特征,但是儿子也有父亲所没有的一些特点 专业点讲,就是子类可以继承并使用父类的属性和方法,也可以有...
  • matiantian666
  • matiantian666
  • 2016年07月05日 16:21
  • 1674

java调用php的webservice示例

主要是接上一篇文章,因为开发中,我们这边用php的soap的方式来实现的webservice,而调用这个接口的客户是用java来调用的,所以自己写的时候也是为了测试,就顺便写了测试了下java调用ph...
  • treesky
  • treesky
  • 2011年01月20日 12:22
  • 2557

php连接webservice传入自定义对象

  • kongling16688
  • kongling16688
  • 2012年09月13日 15:05
  • 1387

使用Curl调用WebService

使用Curl调用WebService
  • liangpei2008
  • liangpei2008
  • 2010年12月07日 22:06
  • 11848

php调用.net的WebService传参问题

从合作方获取数据,往往都是合作方提供xml格式的数据,或者rsync,甚至 直接SQLServer数据库,对应地,我写php解析xml,直接读取rsync推送过来的文件,用freetds连接SQLSe...
  • load_life
  • load_life
  • 2012年11月06日 17:08
  • 1162
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个调用webservice的php基类
举报原因:
原因补充:

(最多只允许输入30个字)