精华内容
下载资源
问答
  • PDM 和 ERP 数据对接面临的问题点 PDM 和 ERP 是在企业信息化过程中发挥重要作用的系统随着它们的发展 两者出现了功能上的交叉当同时维护相同部分数据时就可能出现数据不一致的 情况而且信息无法在两个系统之间相互...
  • 涉及到企业和单位多个领域,既要做好顶层设计,又要解决好统一标准、统一流程、统一管理体系等问题,同时也要解决好数据采集、数据清洗、数据对接和应用集成等相关问题,这时就要注意以下方面:  1.跨组织的沟通...

      数据治理是一个复杂的系统工程,涉及到企业和单位多个领域,既要做好顶层设计,又要解决好统一标准、统一流程、统一管理体系等问题,同时也要解决好数据采集、数据清洗、数据对接和应用集成等相关问题,这时就要注意以下方面:

     

      1.跨组织的沟通协调问题

     

      数据治理是一个组织的全局性项目,需要IT部门与业务部门的倾力合作和支持,需要各个部门站在组织战略目标和组织长远发展的视角来看待数据治理。因此,数据治理项目需要得到组织高层的支持,在条件允许的情况下,成立以组织高层牵头的虚拟项目小组,会让数据治理项目事半功倍。

     

      2.投资决策的困难

     

      组织的投资决策以能够产生可预期的建设成效为前提,但往往综合性的数据治理的成效并不能立马体现,它更像一个基础设施,是以支撑组织战略和长期发展为目标,所以,导致此类项目无法界定明确的边界和目标,从而难以作出明确的投资决策。

     

      3.工作的持续推进

     

      数据治理是以支撑组织战略和长远发展为目标,应当不断吸收新的数据来源,持续追踪数据问题并不断改进,所以数据治理工作不应当是一锤子买卖,应当建立长效的数据改进机制,并在有条件的情况下,尽量自建数据治理团队。

     

      4.技术选型

     

      这几年随着大数据的发展,有针对传统数据库的,有针对大数据数据库的,再加上组织对自身数据资产情况没有一个清晰的认识,这也就导致了数据治理的技术选型困难。

     

      一般来说,数据价值变现的方式有两种,一种是通过数据治理将数据资源转化为数据资产,再把数据资产链接到提供数据资产交易的平台上进行交易,让数据资产具有直接变现的能力;第二种是通过数据治理实现数据资产的汇集和预处理,在通过基于场景的算法将数据应用到业务中去,让数据产生洞察力,为管理和业务的创新提供支撑,让数据具备间接变现的能力。

    展开全文
  • WMS系统是仓库的重要组成部分。传统企业使用纸质文件进行记录,会导致数据不同步、信息丢失、效率降低等...WMS上线前需要注意什么? 1.接口对接  WMS需要与上层的MES系统或ERP系统对接。如果期间需要更换或准备上M

      WMS系统是仓库的重要组成部分。传统企业使用纸质文件进行记录,会导致数据不同步、信息丢失、效率降低等各种问题。一些企业通过ERP系统中的仓库管理模块来管理仓库。虽然这取代了纸张,并允许数据同步共享,但它对仓库优化的要求较低,并且只管理货物到地点。如果指定哪个位置或者哪个位置适合,ERP中的仓库管理模块就很难做到。WMS系统才是企业实施精细化仓库管理的重要一步。市场上有许多WMS。WMS上线前需要注意什么?

    WMS系统

    1.接口对接

      WMS需要与上层的MES系统或ERP系统对接。如果期间需要更换或准备上MES生产系统,最好在上层系统完成后再进行WMS定制开发。如果WMS先做开发MES,这就可能导致二次接口对接出现问题。

    2.需求确认

      其实发展也不是很复杂。关键的是确定需求,而需求也是WMS系统开发的重中之重。如果一开始需求不明确,或者在与客户沟通中发现问题,会给后期开发带来很大的麻烦,甚至导致整个项目需要重新开发。

    3.内部调整

      WMS的实施不仅需要供应商来做这项工作,还需要需求方的配合,及时规范仓库中的货物,并根据货物的类型和属性规定储存区域的位置。

    4.团队规模

      虽然wms是一个软件系统,但是在选择供应商的时候,一般都是直接找的开发商定制或者直接购买成品软件。因为有些互联网软件开发团队有能力开发WMS仓库系统,但是也只能完成WMS系统,因为不清楚客户需求和业务逻辑关系,不会从深层次思考开发问题。而且开发时间周期长,速度慢,云表无代码开发平台,不需要代码编程,搭积木式开发软件,企业不需要请额外的开发人员,企业内部普通的业务人员就能开发出企业级的WMS系统软件,如果选择让企业内部的业务人员来开发,他们对工厂仓库有所了解,对仓库管理之间的流程协调有相对了解。他们还将在开发和设计中考虑多层次的问题,避免将来重复修改需求,大大提高效率。

      这是企业实现单独的仓库管理的唯一途径。一般企业都达到了一定的规模,都会使用WMS系统。在现代仓储中也比较规范。全自动的机器操作和系统软件的自动记录和分发与人工相比,大大提高了效率。随着业务量的增加,将慢慢定制或开发独立的WMS系统

    展开全文
  • 啊呸,不要装x了,就跟普通的对接什么区别。 嘻嘻,只是想记录一下,万一以后用得着,可以回来看一下。 --只记录核心-- 步骤: 1、按照接口的要求进行参数封装 2、请求接口,拿到数据 3、添加接口请求参数...

    啊呸,不要装x了,就跟普通的对接没什么区别。

    嘻嘻,只是想记录一下,万一以后用得着,可以回来看一下。

    --只记录核心--

    步骤:

    1、按照接口的要求进行参数封装

    2、请求接口,拿到数据

    3、添加接口请求参数日志[输入日志]

    4、保存数据[原始数据]

    5、添加接口返回数据日志[输出日志]

    6、将自身业务系统需要的数据抽离出来,避免在原始数据上更改

    注意:[因为有时候接口会有限制,何况准确同步一次也需要大量时间]

    7、在抽离出来的数据中做业务处理

    提示:这样的好处是保持原始数据无误,即使业务数据改乱了,还可以快速恢复。

    重要提示:一定要搞清楚业务的逻辑再写代码,否则会做很多无用功,也就是避免代码重构!!!

    这算是自我总结吧。

    展开全文
  • Dora第三方接口提现接口对接(POST)

    千次阅读 2018-07-19 15:48:32
    最近对接了几个第三方接口,这里给大家分享一下开发过程以及...(2)回调的处理,看文档需要给返回什么参数,防止一直请求,有的需要返回“success”,有的需要返回“status = 0”,返回数据按接口提供。 (3)二...

     最近对接了几个第三方接口,这里给大家分享一下开发过程以及心得。

    (1)文档,文档,文档!重要的事情说三遍,一定要仔细阅读第三方提供的接口文档,这类文档虽然不及微信支付宝那种文档那么仔细,但是照着文档做,注意参数的类型就差不多可以了。

    (2)回调的处理,看文档需要给返回什么参数,防止一直请求,有的需要返回“success”,有的需要返回“status = 0”,返回数据按接口提供。

    (3)二话不说,上代码。这个是POST请求。

    <?php
    //代付接口调试
    header("Content-type:text/html;charset=utf-8");
    require_once('init.php');
    require_once('function.php');
    require_once('mysqli.class.php');
    require_once('http.class.php');
    
    //实例化数据库
    $db=new mysqliconnet($localhost,$root,$pwd,$db);
    if(!$db->connectonerror()){
    	$str='连接数据库失败'.$db->connecterror();
    	file_put_contents('db.log',$str);
    	exit;
    }
    
    
    // 根据id和order_no获取申请提现的信息
    $apply_sql = "select id,order_no,amount,account_name,bank_cardno,bank_no,user_name from apply where id = '".$_POST['id']."' and order_no = '".$_POST['order_no']."' and status = 0";
    $apply = $db->getRow($apply_sql);
    // 数据不存在或已审核则直接返回
    if (empty($apply)) {
    	$info['code'] = 0;
    	$info['msg'] = '提现申请信息不存在!';
    }else{
    	// 公共参数
    	$client_ip = getIP();
    	// 业务参数
    	// 支付公司为商户分配的唯一账号
    	$company_id = XX;
    	// 商户订单号
    	$company_order_no = $apply['order_no'];
    	// 商户用户在商户系统存在的唯一ID
    	$player_id = $apply['user_name'];
    	// 1:mobile 2:pc
    	$terminal = 1;
    	// 商家订单金额(以元为单位,精确到小数点后两位)
    	$amount_money = $apply['amount'];
    	// 1:支付宝 2:微信 3:银行卡
    	$channel_code = 3;
    	// 姓名
    	$name = $apply['account_name'];
    	// 昵称
    	$nick_name = '';
    	// 银行卡号
    	$card_no = $apply['bank_cardno'];
    
    	// 二维码链接地址
    	$qrcode_url = '';
    	// 对于银行卡提现,开户行是必填字段,填写的值必须是数字(3,4,): 3. CMB    招商银行 4. CMBC   中国民生银行  9 建设银行
    	$bank_addr = $apply['bank_no'];
    	// 参数名称:业务扩展参数
    	$extra_param = '';
    
    	$biz_content = array(
    		"company_id"       => $company_id,
    		"company_order_no" => $company_order_no,
    		"player_id"        => $player_id,
    		"terminal"         => $terminal,
    		"amount_money"     => $amount_money,
    		"channel_code"     => $channel_code,
    		"notify_url"       => $notifyurl,
    		"name"             => $name,
    		"nick_name"        => $nick_name,
    		"card_no"          => $card_no,
    		"qrcode_url"       => $qrcode_url,
    		"bank_addr"        => $bank_addr,
    		"extra_param"      => $extra_param,
    	);
    
    	$biz_content = json_encode($biz_content);
    
    	$sign = md5('company_id='.$company_id.'&company_order_no='.$company_order_no.'&player_id='.$player_id.'&amount_money='.$amount_money.'&client_ip='.$client_ip.'&api_version='.$api_version.'&channel_code='.$channel_code.$api_key);
    
    	//设置post数据
    	$postdata = array(
    		"app_id"      => null,
    		"format"      => null,
    		"timestamp"   => date("YmdHis",time()),
    		"charset"     => "UTF-8",
    		"api_version" => $api_version,
    		"client_ip"   => $client_ip,
    		"sign"        => $sign,
    		"biz_content" => $biz_content,
    	);
    
    	$http = new Http();
    	$result = $http->post($apply_url, $postdata );
    	$result = json_decode($result, true);
    	// var_export($result);die;
    
    	if ($result['status'] == 200) {
    		$info['code'] = 1;
    		$info['msg'] = $result['msg'];
    		$info['data'] = $result['data'];
    	}else{
    		$info['code'] = 0;
    		$info['msg'] = $result['msg'];
    	}
    
    }
    exit(json_encode($info));

    http.class.php

    <?php
    
    /**
     * 
     * @desc  HTTP 请求类, 支持 CURL 和 Socket, 默认使用 CURL , 当手动指定  
     *              useCurl 或者 curl 扩展没有安装时, 会使用 Socket
     *              目前支持 get 和 post 两种请求方式
     * 
     * @example 
     * 
    1. 基本 get 请求: 
    
        $http = new Http();         // 实例化对象
        $result =  $http->get('http://weibo.com/at/comment');
        
    2. 基本 post 请求: 
    
        $http = new Http();         // 实例化对象
        $result = $http->post('http://someurl.com/post-new-article', array('title'=>$title, 'body'=>$body) );
        
    3. 模拟登录 ( post 和 get 同时使用, 利用 cookie 存储状态 ) : 
    
        $http = new Http();         // 实例化对象
        $http->setCookiepath(substr(md5($username), 0, 10));        // 设置 cookie, 如果是多个用户请求的话
        // 提交 post 数据
        $loginData = $http->post('http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.19)', array('username'=>$username, 'loginPass'=>$password) );
        $result =  $http->get('http://weibo.com/at/comment');
        
    4. 利用 initialize 函数设置多个 config 信息
    
        $httpConfig['method']     = 'GET';
        $httpConfig['target']     = 'http://www.somedomain.com/index.html';
        $httpConfig['referrer']   = 'http://www.somedomain.com';
        $httpConfig['user_agent'] = 'My Crawler';
        $httpConfig['timeout']    = '30';
        $httpConfig['params']     = array('var1' => 'testvalue', 'var2' => 'somevalue');
        
        $http = new Http();
        $http->initialize($httpConfig);
        
        $result = $http->result;
    
    5. 复杂的设置: 
        
        $http = new Http();
        $http->useCurl(false);      // 不使用 curl
        $http->setMethod('POST');       // 使用 POST method
        
        // 设置 POST 数据
        $http->addParam('user_name' , 'yourusername');
        $http->addParam('password'  , 'yourpassword');
        
        // Referrer
        $http->setReferrer('https://yourproject.projectpath.com/login');
        
        // 开始执行请求
        $http->execute('https://yourproject.projectpath.com/login/authenticate');
        $result = $http->getResult();
    
    6. 获取开启了 basic auth 的请求
        
        $http = new Http();
        
        // Set HTTP basic authentication realms
        $http->setAuth('yourusername', 'yourpassword');
        
        // 获取某个被保护的应用的 feed
        $http->get('http://www.someblog.com/protected/feed.xml');
        
        $result = $http->result;
    
     * 
     * @from http://www.phpfour.com/lib/http
     * @since Version 0.1
     * @original author      Md Emran Hasan <phpfour@gmail.com>
     * @modify by       Charlie Jade
     */
    
    class Http
    {
        /**  目标请求 @var string */
        var $target;
        
        /**  目标 URL 的 host @var string */
        var $host;
        
        /**  请求目标的端口 @var integer */
        var $port;
        
        /** 请求目标的 path @var string */
        var $path;
        
        /** 请求目标的 schema  @var string */
        var $schema;
        
        /** 请求的 method (GET 或者 POST)  @var string */
        var $method;
        
        /** 请求的数据  @var array */
        var $params;
        
        /**  请求时候的 cookie 数据  @var array */
        var $cookies;
        
        /**  请求返回的 cookie 数据 @var array  */
        var $_cookies;
        
        /** 请求超时时间, 默认是 25 @var integer */
        var $timeout;
        
        /** 是否使用 cURL , 默认为 TRUE @var boolean */
        var $useCurl;
        
        /**   referrer 信息 @var string */
        var $referrer;
        
        /** 请求客户端 User agent  @var string */
        var $userAgent;
        
        /**  Contains the cookie path (to be used with cURL) @var string */
        var $cookiePath;
        
        /**  是否使用 Cookie @var boolean  */
        var $useCookie;
        
        /** 是否为下一次请求保存 Cookie @var boolean */
        var $saveCookie;
        
        /** HTTP Basic Auth 用户名 (for authentication) @var string */
        var $username;
        
        /** HTTP Basic Auth 密码 (for authentication) @var string */
        var $password;
        
        /** 请求的结果集 @var string */
        var $result;
        
        /** 最后一个请求的 headers 信息  @var array */
        var $headers;
        
        /** Contains the last call's http status code @var string  */
        var $status;
        
        /** 是否跟随 http redirect 跳转  @var boolean */
        var $redirect;
        
        /** 最大 http redirect 调整数 @var integer */
        var $maxRedirect;
        
        /** 当前请求有多少个 URL  @var integer */
        var $curRedirect;
        
        /** 错误代码 @var string */
        var $error;
        
        /** Store the next token  @var string */
        var $nextToken;
        
        /** 是否存储 bug 信息 @var boolean  */
        var $debug;
        
        /** Stores the debug messages  @var array @todo will keep debug messages */
        var $debugMsg;
        
        /**  Constructor for initializing the class with default values. @return void   */
        public function __construct()
        {
            // 先初始化
            $this->clear();    
        }
        
        /**
         * 初始化配置信息
         * Initialize preferences
         * 
         * This function will take an associative array of config values and 
         * will initialize the class variables using them. 
         * 
         * Example use:
         * 
         * <pre>
         * $httpConfig['method']     = 'GET';
         * $httpConfig['target']     = 'http://www.somedomain.com/index.html';
         * $httpConfig['referrer']   = 'http://www.somedomain.com';
         * $httpConfig['user_agent'] = 'My Crawler';
         * $httpConfig['timeout']    = '30';
         * $httpConfig['params']     = array('var1' => 'testvalue', 'var2' => 'somevalue');
         * 
         * $http = new Http();
         * $http->initialize($httpConfig);
         * </pre>
         *
         * @param array Config values as associative array
         * @return void
         */    
        public function initialize($config = array())
        {
            $this->clear();
            foreach ($config as $key => $val)
            {
                if (isset($this->$key))
                {
                    $method = 'set' . ucfirst(str_replace('_', '', $key));
                    
                    if (method_exists($this, $method))
                    {
                        $this->$method($val);
                    }
                    else
                    {
                        $this->$key = $val;
                    }            
                }
            }
        }
        
        /**
         * 初始化所有
         * 
         * Clears all the properties of the class and sets the object to
         * the beginning state. Very handy if you are doing subsequent calls 
         * with different data.
         *
         * @return void
         */
        public function clear()
        {
            // Set the request defaults
            $this->host         = '';
            $this->port         = 0;
            $this->path         = '';
            $this->target       = '';
            $this->method       = 'GET';
            $this->schema       = 'http';
            $this->params       = array();
            $this->headers      = array();
            $this->cookies      = array();
            $this->_cookies     = array();
            
            // Set the config details        
            $this->debug        = FALSE;
            $this->error        = '';
            $this->status       = 0;
            $this->timeout      = '25';
            $this->useCurl      = TRUE;
            $this->referrer     = '';
            $this->username     = '';
            $this->password     = '';
            $this->redirect     = TRUE;
            
            // Set the cookie and agent defaults
            $this->nextToken    = '';
            $this->useCookie    = FALSE;
            $this->saveCookie   = FALSE;
            $this->maxRedirect  = 3;
            $this->cookiePath   = 'cookie.txt';
            $this->userAgent    = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7';
        }
        
        /** 设置目标 @return void */
        public function setTarget($url)
        {
            $this->target = $url;
        }
        
        /** 设置 http 请求方法  @param string HTTP method to use (GET or POST)  @return void */
        public function setMethod($method)
        {
             $this->method = $method;
        }
        
        /** 设置 referrer URL @param string URL of referrer page @return void */
        public function setReferrer($referrer)
        {
             $this->referrer = $referrer;
        }
        
        /**  设置 User agent  @param string Full user agent string @return void */
        public function setUseragent($agent)
        {
            $this->userAgent = $agent;
        }
        
        /** 设置请求 timeout  @param integer Timeout delay in seconds @return void */
        public function setTimeout($seconds)
        {
            $this->timeout = $seconds;
        }
        
        /** 设置  cookie path (只支持cURL ) @param string File location of cookiejar @return void */
        public function setCookiepath($path)
        {
            
            $this->cookiePath = $path;
            $this->useCookie(TRUE);
            $this->saveCookie(TRUE);
        }
        
        /** 设置请求参数 parameters @param array GET or POST 的请求数据 @return void  */
        public function setParams($dataArray)
        {
            $this->params = array_merge($this->params, $dataArray);
        }
        
        /** 设置 basic http auth 域验证 @param string 用户名  @param string 密码  @return void */
        public function setAuth($username, $password)
        {
            $this->username = $username;
            $this->password = $password;
        }
        
        /** 设置最大跳转数 @param integer Maximum number of redirects @return void */
        public function setMaxredirect($value)
        {
            $this->maxRedirect = $value;
        }
        
        /** 添加多一个新的请求数据 @param string Name of the parameter @param string Value of the paramete  @return void  */
        public function addParam($name, $value)
        {
            $this->params[$name] = $value;
        }
        
        /** 添加 cookie 请求数据  @param string Name of cookie  @param string Value of cookie */
        public function addCookie($name, $value)
        {
            $this->cookies[$name] = $value;
        }
        
        /** 是否使用 curl, 默认 true, false 为使用 socket  */
        public function useCurl($value = TRUE)
        {
            if (is_bool($value))
            {
            $this->useCurl = $value;
            }   
        }
        
        /** 是否使用 cookie , 默认为 false  @param boolean Whether to use cookies or not  @return void  */
        public function useCookie($value = FALSE)
        {
            $this->useCookie = $value;
        }
        
        /** 是否使用 cookie , 以供下一次请求使用 @param boolean Whether to save persistent cookies or not @return void  */
        public function saveCookie($value = FALSE)
        {
            $this->saveCookie = $value;
        }
        
        /** 是否跟随 302 跳转 @param boolean Whether to follow HTTP redirects or not  */
        public function followRedirects($value = TRUE)
        {
            $this->redirect = $value;
        }
        
        /** 获取结果集  @return string output of execution */
        public function getResult()
        {
            return $this->result;
        }
        
        /** 获取最后一个返回的 headers 数组 */
        public function getHeaders()
        {
            return $this->headers;
        }
    
        /** 获取请求的状态码  */
        public function getStatus()
        {
            return $this->status;
        }
            
        /** 获取最后运行错误   */
        public function getError()
        {
            return $this->error;
        }
        
        /** 执行一条 http get 请求  */
        public function get($url, $data=array()){
            return $this->execute($url, '', 'get', $data);
        }
        
        /** 执行一条 http post 请求  */
        public function post($url, $data=array()){
            return $this->execute($url, '', 'post', $data);
        }
        
        /**
         * 使用当前的配置, 发送一条 HTTP 请求  
         * 
         * @param string URL of the target page (optional)
         * @param string URL of the referrer page (optional)
         * @param string 请求方法 (GET or POST) (optional)
         * @param array 请求数据, key 和 value 对应的数组 (optional)
         * @return string 请求的结果集
         */    
        public function execute($target = '', $referrer = '', $method = '', $data = array())
        {
            // Populate the properties
            $this->target = ($target) ? $target : $this->target;
            $this->method = ($method) ? $method : $this->method;
            
            $this->referrer = ($referrer) ? $referrer : $this->referrer;
            
            // Add the new params
            if (is_array($data) && count($data) > 0) 
            {
                $this->params = array_merge($this->params, $data);
            }
            
            // Process data, if presented
            if(is_array($this->params) && count($this->params) > 0)
            {
                // Get a blank slate
                $tempString = array();
                
                // Convert data array into a query string (ie animal=dog&sport=baseball)
                foreach ($this->params as $key => $value) 
                {
                    if(strlen(trim($value))>0)
                    {
                        $tempString[] = $key . "=" . urlencode($value);
                    }
                }
                
                $queryString = join('&', $tempString);
            }
            
            // 如果 cURL 没有安装就使用 fscokopen 执行请求
            $this->useCurl = $this->useCurl && in_array('curl', get_loaded_extensions());
            
            // GET method configuration
            if($this->method == 'GET')
            {
                if(isset($queryString))
                {
                    $this->target = $this->target . "?" . $queryString;
                }
            }
            
            // Parse target URL
            $urlParsed = parse_url($this->target);
            
            // Handle SSL connection request
            if ($urlParsed['scheme'] == 'https')
            {
                $this->host = 'ssl://' . $urlParsed['host'];
                $this->port = ($this->port != 0) ? $this->port : 443;
            }
            else
            {
                $this->host = $urlParsed['host'];
                $this->port = ($this->port != 0) ? $this->port : 80;
            }
            
            // Finalize the target path
            $this->path   = (isset($urlParsed['path']) ? $urlParsed['path'] : '/') . (isset($urlParsed['query']) ? '?' . $urlParsed['query'] : '');
            $this->schema = $urlParsed['scheme'];
            
            // Pass the requred cookies
            $this->_passCookies();
            
            // Process cookies, if requested
            if(is_array($this->cookies) && count($this->cookies) > 0)
            {
                // Get a blank slate
                $tempString   = array();
                
                // Convert cookiesa array into a query string (ie animal=dog&sport=baseball)
                foreach ($this->cookies as $key => $value) 
                {
                    if(strlen(trim($value)) > 0)
                    {
                        $tempString[] = $key . "=" . urlencode($value);
                    }
                }
                
                $cookieString = join('&', $tempString);
            }
            
            // Do we need to use cURL
            if ($this->useCurl)
            {
                // Initialize PHP cURL handle
                $ch = curl_init();
        
                // GET method configuration
                if($this->method == 'GET')
                {
                    curl_setopt ($ch, CURLOPT_HTTPGET, TRUE); 
                    curl_setopt ($ch, CURLOPT_POST, FALSE); 
                }
                // POST method configuration
                else
                {
                    if(isset($queryString))
                    {
                        curl_setopt ($ch, CURLOPT_POSTFIELDS, $queryString);
                    }
                    
                    curl_setopt ($ch, CURLOPT_POST, TRUE); 
                    curl_setopt ($ch, CURLOPT_HTTPGET, FALSE); 
                }
                
                // Basic Authentication configuration
                if ($this->username && $this->password)
                {
                    curl_setopt($ch, CURLOPT_USERPWD, $this->username . ':' . $this->password);
                }
                
                // Custom cookie configuration
                if($this->useCookie && isset($cookieString))
                {
                    curl_setopt ($ch, CURLOPT_COOKIE, $cookieString);
                }
                
                curl_setopt($ch, CURLOPT_HEADER,         array('Accept-Language: zh-cn','Connection: Keep-Alive','Cache-Control: no-cache')); 
                curl_setopt($ch, CURLOPT_NOBODY,         FALSE);                // Return body
    
                curl_setopt($ch, CURLOPT_COOKIEJAR,      $this->cookiePath);    // cookie 文件
                curl_setopt($ch, CURLOPT_COOKIEFILE,      $this->cookiePath);    // cookie 文件
    
                curl_setopt($ch, CURLOPT_TIMEOUT,        $this->timeout);       // Timeout
                curl_setopt($ch, CURLOPT_USERAGENT,      $this->userAgent);     // Webbot name
                curl_setopt($ch, CURLOPT_URL,            $this->target);        // Target site
                curl_setopt($ch, CURLOPT_REFERER,        $this->referrer);      // Referer value
                
                curl_setopt($ch, CURLOPT_VERBOSE,        FALSE);                // Minimize logs
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);                // No certificate
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $this->redirect);      // Follow redirects
                curl_setopt($ch, CURLOPT_MAXREDIRS,      $this->maxRedirect);   // Limit redirections to four
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);                 // 是否以 string 格式返回
                
                // Get the target contents
                $content = curl_exec($ch);
                
                // Get the request info 
                $curl_info = curl_getinfo($ch);
                $header_size = $curl_info["header_size"];
    
                // 赋值结果集
                $this->result = substr($content, $header_size);
                
                $reader = explode("\r\n\r\n", trim(substr($content, 0, $header_size))); 
                $this->status = $curl_info['http_code'];
                
                // Parse the headers
                $this->_parseHeaders( explode("\r\n\r\n", trim(substr($content, 0, $header_size))) );
                
                // Store the error (is any)
                $this->_setError(curl_error($ch));
                
                // Close PHP cURL handle
                curl_close($ch);
            }
            else
            {
                // Get a file pointer
                $filePointer = fsockopen($this->host, $this->port, $errorNumber, $errorString, $this->timeout);
           
                // We have an error if pointer is not there
                if (!$filePointer)
                {
                    $this->_setError('Failed opening http socket connection: ' . $errorString . ' (' . $errorNumber . ')');
                    return FALSE;
                }
    
                // Set http headers with host, user-agent and content type
                $requestHeader  = $this->method . " " . $this->path . "  HTTP/1.1\r\n";
                $requestHeader .= "Host: " . $urlParsed['host'] . "\r\n";
                $requestHeader .= "User-Agent: " . $this->userAgent . "\r\n";
                $requestHeader .= "Content-Type: application/x-www-form-urlencoded\r\n";
                
                // Specify the custom cookies
                if ($this->useCookie && $cookieString != '')
                {
                    $requestHeader.= "Cookie: " . $cookieString . "\r\n";
                }
    
                // POST method configuration
                if ($this->method == "POST")
                {
                    $requestHeader.= "Content-Length: " . strlen($queryString) . "\r\n";
                }
                
                // Specify the referrer
                if ($this->referrer != '')
                {
                    $requestHeader.= "Referer: " . $this->referrer . "\r\n";
                }
                
                // Specify http authentication (basic)
                if ($this->username && $this->password)
                {
                    $requestHeader.= "Authorization: Basic " . base64_encode($this->username . ':' . $this->password) . "\r\n";
                }
           
                $requestHeader.= "Connection: close\r\n\r\n";
           
                // POST method configuration
                if ($this->method == "POST")
                {
                    $requestHeader .= $queryString;
                }           
    
                // We're ready to launch
                fwrite($filePointer, $requestHeader);
           
                // Clean the slate
                $responseHeader = '';
                $responseContent = '';
    
                // 3...2...1...Launch !
                do
                {
                    $responseHeader .= fread($filePointer, 1);
                }
                while (!preg_match('/\\r\\n\\r\\n$/', $responseHeader));
                
                // Parse the headers
                $this->_parseHeaders($responseHeader);
                
                // Do we have a 301/302 redirect ?
                if (($this->status == '301' || $this->status == '302') && $this->redirect == TRUE)
                {
                    if ($this->curRedirect < $this->maxRedirect)
                    {
                        // Let's find out the new redirect URL
                        $newUrlParsed = parse_url($this->headers['location']);
                        
                        if ($newUrlParsed['host'])
                        {
                            $newTarget = $this->headers['location'];    
                        }
                        else
                        {
                            $newTarget = $this->schema . '://' . $this->host . '/' . $this->headers['location'];
                        }
                        
                        // Reset some of the properties
                        $this->port   = 0;
                        $this->status = 0;
                        $this->params = array();
                        $this->method = 'GET';
                        $this->referrer = $this->target;
                        
                        // Increase the redirect counter
                        $this->curRedirect++;
                        
                        // Let's go, go, go !
                        $this->result = $this->execute($newTarget);
                    }
                    else
                    {
                        $this->_setError('Too many redirects.');
                        return FALSE;
                    }
                }
                else
                {
                    // Nope...so lets get the rest of the contents (non-chunked)
                    if ($this->headers['transfer-encoding'] != 'chunked')
                    {
                        while (!feof($filePointer))
                        {
                            $responseContent .= fgets($filePointer, 128);
                        }
                    }
                    else
                    {
                        // Get the contents (chunked)
                        while ($chunkLength = hexdec(fgets($filePointer)))
                        {
                            $responseContentChunk = '';
                            $readLength = 0;
                           
                            while ($readLength < $chunkLength)
                            {
                                $responseContentChunk .= fread($filePointer, $chunkLength - $readLength);
                                $readLength = strlen($responseContentChunk);
                            }
    
                            $responseContent .= $responseContentChunk;
                            fgets($filePointer);  
                        }
                    }
                    
                    // Store the target contents
                    $this->result = chop($responseContent);
                }
            }
            
            // There it is! We have it!! Return to base !!!
            return $this->result;
        }
        
        /** 解析 header 信息*/
        private function _parseHeaders($responseHeader)
        {
            // Break up the headers
            $headers = $responseHeader;
            
            // Clear the header array
            $this->_clearHeaders();
            
            // Get resposne status
            if($this->status == 0)
            {
                // Oooops !
                if(!eregi($match = "^http/[0-9]+\\.[0-9]+[ \t]+([0-9]+)[ \t]*(.*)\$", $headers[0], $matches))
                {
                    $this->_setError('Unexpected HTTP response status');
                    return FALSE;
                }
                
                // Gotcha!
                $this->status = $matches[1];
                array_shift($headers);
            }
            
            // Prepare all the other headers
            foreach ($headers as $header)
            {
                // Get name and value
                $headerName  = strtolower($this->_tokenize($header, ':'));
                $headerValue = trim(chop($this->_tokenize("\r\n")));
                
                // If its already there, then add as an array. Otherwise, just keep there
                if(isset($this->headers[$headerName]))
                {
                    if(gettype($this->headers[$headerName]) == "string")
                    {
                        $this->headers[$headerName] = array($this->headers[$headerName]);
                    }
                        
                    $this->headers[$headerName][] = $headerValue;
                }
                else
                {
                    $this->headers[$headerName] = $headerValue;
                }
            }
                
            // Save cookies if asked 
            if ($this->saveCookie && isset($this->headers['set-cookie']))
            {
                $this->_parseCookie();
            }
        }
        
        /** 去除所有 header 信息 */
        private function _clearHeaders()
        {
            $this->headers = array();
        }
        
        /** 解析 COOKIE */
        private function _parseCookie()
        {
            // Get the cookie header as array
            if(gettype($this->headers['set-cookie']) == "array")
            {
                $cookieHeaders = $this->headers['set-cookie'];
            }
            else
            {
                $cookieHeaders = array($this->headers['set-cookie']);
            }
    
            // Loop through the cookies
            for ($cookie = 0; $cookie < count($cookieHeaders); $cookie++)
            {
                $cookieName  = trim($this->_tokenize($cookieHeaders[$cookie], "="));
                $cookieValue = $this->_tokenize(";");
                
                $urlParsed   = parse_url($this->target);
                
                $domain      = $urlParsed['host'];
                $secure      = '0';
                
                $path        = "/";
                $expires     = "";
                
                while(($name = trim(urldecode($this->_tokenize("=")))) != "")
                {
                    $value = urldecode($this->_tokenize(";"));
                    
                    switch($name)
                    {
                        case "path"     : $path     = $value; break;
                        case "domain"   : $domain   = $value; break;
                        case "secure"   : $secure   = ($value != '') ? '1' : '0'; break;
                    }
                }
                
                $this->_setCookie($cookieName, $cookieValue, $expires, $path , $domain, $secure);
            }
        }
        
        /** 设置 cookie , 为下一次请求做准备 */
        private function _setCookie($name, $value, $expires = "" , $path = "/" , $domain = "" , $secure = 0)
        {
            if(strlen($name) == 0)
            {
                return($this->_setError("No valid cookie name was specified."));
            }
    
            if(strlen($path) == 0 || strcmp($path[0], "/"))
            {
                return($this->_setError("$path is not a valid path for setting cookie $name."));
            }
                
            if($domain == "" || !strpos($domain, ".", $domain[0] == "." ? 1 : 0))
            {
                return($this->_setError("$domain is not a valid domain for setting cookie $name."));
            }
            
            $domain = strtolower($domain);
            
            if(!strcmp($domain[0], "."))
            {
                $domain = substr($domain, 1);
            }
                
            $name  = $this->_encodeCookie($name, true);
            $value = $this->_encodeCookie($value, false);
            
            $secure = intval($secure);
            
            $this->_cookies[] = array( "name"      =>  $name,
                                       "value"     =>  $value,
                                       "domain"    =>  $domain,
                                       "path"      =>  $path,
                                       "expires"   =>  $expires,
                                       "secure"    =>  $secure
                                     );
        }
        
        /** cookie  数据集编码  */
        private function _encodeCookie($value, $name)
        {
            return($name ? str_replace("=", "%25", $value) : str_replace(";", "%3B", $value));
        }
        
        /** 把正确的 cookie 传输给当前请求 */
        private function _passCookies()
        {
            if (is_array($this->_cookies) && count($this->_cookies) > 0)
            {
                $urlParsed = parse_url($this->target);
                $tempCookies = array();
                
                foreach($this->_cookies as $cookie)
                {
                    if ($this->_domainMatch($urlParsed['host'], $cookie['domain']) && (0 === strpos($urlParsed['path'], $cookie['path']))
                        && (empty($cookie['secure']) || $urlParsed['protocol'] == 'https')) 
                    {
                        $tempCookies[$cookie['name']][strlen($cookie['path'])] = $cookie['value'];
                    }
                }
                
                // cookies with longer paths go first
                foreach ($tempCookies as $name => $values) 
                {
                    krsort($values);
                    foreach ($values as $value) 
                    {
                        $this->addCookie($name, $value);
                    }
                }
            }
        }
        
        /** 匹配域名 */
        private function _domainMatch($requestHost, $cookieDomain)
        {
            if ('.' != $cookieDomain{0}) 
            {
                return $requestHost == $cookieDomain;
            } 
            elseif (substr_count($cookieDomain, '.') < 2) 
            {
                return false;
            } 
            else 
            {
                return substr('.'. $requestHost, - strlen($cookieDomain)) == $cookieDomain;
            }
        }
        
        /** 给当前操作做记号用的 */
        private function _tokenize($string, $separator = '')
        {
            if(!strcmp($separator, ''))
            {
                $separator = $string;
                $string = $this->nextToken;
            }
            
            for($character = 0; $character < strlen($separator); $character++)
            {
                if(gettype($position = strpos($string, $separator[$character])) == "integer")
                {
                    $found = (isset($found) ? min($found, $position) : $position);
                }
            }
            
            if(isset($found))
            {
                $this->nextToken = substr($string, $found + 1);
                return(substr($string, 0, $found));
            }
            else
            {
                $this->nextToken = '';
                return($string);
            }
        }
        
        /** 设置错误信息 */
        private function _setError($error)
        {
            if ($error != '')
            {
                $this->error = $error;
                return $error;
            }
        }
    }
    
    ?>

    function.php

    <?php
    	//写日志
    	function writeFile($file,$str,$mode='a') {
    				
    		$str.="********************************";
    		$fp = fopen($file,$mode); 
    		$encode = check_utf8($str); 
    		if($encode){ 
    			$str=iconv('UTF-8','GBK',$str);
    		} 
    		$startTime = microtime();
     		do{
            	$canWrite = flock($fp, LOCK_EX);
      			if(!$canWrite) usleep(round(rand(0, 100)*1000));
     		} while ((!$canWrite)&&((microtime()-$startTime) < 1000));
    		if(!$fp) { 
    			Return false; 
    		} else { 
    			fwrite($fp,"$str\r\n"); 
    			fclose($fp);
    			Return true; 
    		} 
    	}
    
    	//获取ip
    	function getIP(){
    		global $ip;
    		
    		if (getenv("HTTP_CLIENT_IP"))
    			$ip = getenv("HTTP_CLIENT_IP");
    		else if(getenv("HTTP_X_FORWARDED_FOR"))
    			$ip = getenv("HTTP_X_FORWARDED_FOR");
    		else if(getenv("REMOTE_ADDR"))
    			$ip = getenv("REMOTE_ADDR");
    		else 
    			$ip = "Unknow";
    			
    		return $ip;
    	}
    
    	function throwError($result){
    		try{
                if($result) {
                    throw new Exception('this is an db exception');
                }else {
                    //do something
                }
            }catch (Exception $e) {
                //db exception, you can log the db error message or do something useful
                var_dump($e->getMessage());
            }
    	}
    
    	/**
         * 如果位数不够的话可以进行修改增加订单号位数
         * @return string
         */
        function CreateOrderNo()
        {
            mt_srand((double)microtime() * 1000000);
            return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
        }
        
        // API接口响应 by tsf
        function api_response($status=0, $data=array())
        {
        	$info = array(
        		'status'			=> $status,
        		'company_order_no'	=> $data['company_order_no'],
        		'trade_no'			=> $data['trade_no'],
        	);
        	echo json_encode($info);
        	exit();
        }
    
    
    ?>

    回调:notify.php

    <?php
    header("Content-Type: application/json; charset=utf-8");
    require_once('init.php');
    require_once('function.php');
    require_once('mysqli.class.php');
    
    //实例化数据库
    $db=new mysqliconnet($localhost,$root,$pwd,$db);
    if(!$db->connectonerror()){
    	$str=date("Y-m-d H:i:s").'连接数据库失败'.$db->connecterror();
    	file_put_contents('db.log',$str);
    }
    
    // 将回调返回的参数写入日志中
    $post_data = $_REQUEST;
    $post_data_str = date("Y-m-d H:i:s").' '.serialize($post_data);
    file_put_contents('notify.log',$post_data_str.PHP_EOL,FILE_APPEND);
    
    $return_info = array();
    $biz_content = json_decode($post_data['biz_content'], true);
    
    if ($post_data['type'] == 2) {
    	// TODO:签名、金额校验
    	
    	return api_response(0, $biz_content);
    }elseif ($post_data['type'] == 3) {
    	// 提现成功
    	if ($post_data['status'] == 0) {
    		$sql_str = "update apply set status=1 where order_no=".$biz_content['company_order_no'];
    		$update_bz = $db->query($sql_str);
    		if (!$update_bz) {
    			$err_str='更新订单状态出错:'.$db->error;
    			file_put_contents('notify.log',$err_str.PHP_EOL,FILE_APPEND);
    			exit();
    		}
    
    		return api_response(0, $biz_content);
    	} else {
    		// 提现失败,将错误信息写入日志
    		$fail_str = date("Y-m-d H:i:s")." 错误编号:".$post_data['code']." 错误信息:".$post_data['msg'];
    		file_put_contents('notify.log',$fail_str.PHP_EOL,FILE_APPEND);
    		return api_response(1, $biz_content);
    	}
    }
    
    ?>

     

    展开全文
  • 21 改进全站视频外链形式推荐mp4格式视频,以支持手机播放 站外支持 iframe形式调用 注意:这里以前的外链需要重新更改新的调用代码,否则更新后视频会失效 22 改进网站在房产频道中水印功能 如开启此项水印功能,新增...
  • 可能有人会问为什么不用ELK,主要是目前觉得Exceptionless足够我们生产使用,后期看项目扩容度决定是否替换,言归正传,需要注意的就是由于Exceptionless接收到nlog的日志记录是通过API进行数据传输,可能存在不稳.....
  • 什么是管道流

    2017-03-22 09:41:52
    注意需要加入多线程技术,因为单线程,先执行read,会发生死锁,因为read方法是阻塞式的,没有数据的read方法会让线程等待。 public static void main(String[] args) throws IOException{ PipedInputStream ...
  • 也可以是为了获取产品设计、广告定价、投资等任何方向,但是你一定要注意:行业报告良莠不齐,需要有一定的经验和对行业的理解来判断,不同行业报告的口径不一致,可能导致结论对接不上,所以在行业报告的选择和使用...
  • 这一阵子因为项目需要对接别家公司的restful接口,其中有一个接口是上传视频文件。接着上网找找资料。后来文件是上传成功了,但上服务器一看,文件没有后缀,我勒个去,这是什么个鬼。接着继续找资料,最终发现是...
  • api设计干货

    2017-11-15 16:28:59
    接口开发需要注意以下几个基本点。确定接口风格到底你是采用传统的风格,还是使用restful风格。这很重要,直接关系到你的接口长相,换句话说,让对接你的人考到你的接口是什么样的。 比如微信的接口,采用的是传统...
  • 2016.12.26回顾

    2016-12-27 10:29:18
    1、对接knowru接口,给我们的文档反而没写太清楚,倒是网站上面的示例更健全一些,注意的地方就是key要加在请求头中 2、查找了一下问题,包括那几个报错的,发现是算话方面的异常,爱尚通过率方面的问题是因为...
  • 这些工具可以归类为监控器(收集有关环境和设备运行状态的数据和/或将尽可能多的相关数据汇总到一个地方),进行预测(对接下来应发生的事情进行预测)或进行控制(实施更改,并将更多数据反馈到显示器中)。...
  • 以及对接硬件的项目数据在十六进制&&byte&&int的转换处理。 要注意BufferedReader的readLine()方法的阻塞问题: 读取socket输入流的时候很多代码都会这么写,一般也不会有什么问题,但是readLine()方法读取不到换行...
  • redis缓存与mysql同样的道理,开发者只需要知道redis的命令即可,无需去管所在的语言使用什么redis库,怎么引用库,如何操作等等; 定时器,程序总免不了存在定时执行、周期执行的任务。在以往的编程中,我们可能是...
  • 近日在CDB并行测试中发现一个问题:我们需要的小区负荷话统结果总是为零,开始还以为小区负荷太小,于是加大短消息下发数量,但还为零,于是在程序中加入测试代码,把收到的数据在BAM上打印出来, 结果打印出来的...
  • 注意: @符号后面需要加=号才能达到双向绑定效果;userName需要是public的,不然viewModel无法找到它。 点击事件绑定: 在LoginViewModel中定义 //登录按钮的点击事件 public View.OnClickListener loginOnClick = ...
  • 问:这个服务端是什么意思,客户端是什么意思? 答: 服务端源码是用来接收客户端推送收款信息,客户端是监听支付宝和微信的收款信息并实时推送到服务器。 问: 微信公众号可以使用吗? 答: 可以使用微信,长按二维码...
  • 零代码、热更新、自动化 ORM 库 后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构 English 通用文档 视频教程 在线体验 导航目录: 项目简介 上手使用 ...
  • 一文带你搞懂API网关

    2020-12-28 06:45:32
    Dubbo, 但这里需要注意很多问题,比如参数类型,如果类型搞错了,导致转换出问题,而日志又不够详细的话,问题会很难定位。 服务发现 网关作为流量的入口,负责请求的转发&#...

空空如也

空空如也

1 2 3 4 5
收藏数 98
精华内容 39
关键字:

数据对接需要注意什么