精华内容
下载资源
问答
  • 企业微信外部联系人回调事件

    千次阅读 2019-02-22 10:20:22
    企业微信外部联系人回调事件 说明: 1) 下列"外部联系人" 和 "客户联系" 其实都是一个意思,都是指顾客,但是由于企业微信开发文档中叫"外部联系人&...

    企业微信外部联系人回调事件

    说明:

    1) 下列"外部联系人" 和 "客户联系" 其实都是一个意思,都是指顾客,但是由于企业微信开发文档中叫"外部联系人",管理后台叫"客户联系", 为方便操作,故本文名称跟企业微信保持一致
    2) 下列两段代码实例,默认使用者已经有PHP-SDK, 原生代码案例可以自行前往git下载PHP-SDK(地址见官方文档),ThinkPHP5.*版本案例,可以参考本人下载资源中的PHP-SDK,或者根据官方提供的sdk自行修改命名空间; 由于时间问题,原生代码部分由TP5版本代码修改而成,仅供参考代码,暂未实测; ThinkPHP5.*版本代码亲测有效,有异议欢迎提出讨论
    

    1.作用

    		企业成员 添加/删除外部联系人 时,可在企业后台接收添加/删除的外部人数据,及时更新企业后台数据
    

    2.运行原理

    	1) 开发者验证回调事件url有效性,验证通过后,可在企业微信管理员后台,配置回调所需的3个参数: 回调事件url, Token , EncodingAESKey
    	2) 企业微信管理后台给相关企业成员配置"客户联系"权限
    	3) 当企业成员(需要配置客户联系操作权限) 添加/删除外部联系人时,企业微信服务器会向外部联系人回调事件url 推送一段加密字符串(xml格式) ,具体事件格式可参照开发文档, 而且务必保证正确处理数据,
    

    3.开发者操作步骤

    	1) 管理后台配置外部联系人回调事件url地址,并验证该url有效性
    			A) 先调用调试工具,验证回调事件url有效性,具体参见:
    			 ![验证回调事件url的详情图片](https://img-blog.csdnimg.cn/20190221220329870.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2R1cmluZ25vbmU=,size_16,color_FFFFFF,t_70)
    			B) 除了A)操作,还需要在该url中,返回解密后的加密消息内容,首先两点;
    				a) 调用PHP-SDK中的XMLparse类中的VerifyUrl方法(Verify方法可验证回调事件url); PHP-SDK可下载本人下载资源中的SDK(此SDK根据ThinkPHP5.0进行了命名空间的封装),或者参考企业微信开发文档自行编写
    				b) **坑一**: 在回调事件中必须 return 企业微信调试工具发送的Get请求结果(ps:企业微信文档中说的是正确响应,经和其技术沟通,并亲测为使用return关键字即可,示例代码如下:
    						$params = $_GET;
    						$obj = new XMLparse();
    						$callbackRes = $obj->VerifyUrl($params);	//调用SDK中的VerifyUrl方法,返回值为解密后的消息,即步骤A)图中的 "测试消息123"
    						return $callbackRes;	// 相当于直接返回明文消息: return	"测试消息123";
    					)
    				
    				c) **坑二**: 验证回调事件url有效性时,即调用verifyUrl方法时,必须先urldecode('echoStr参数'),否则会抛出异常; 若使用原生代码示例,务必自行添加urldecode,若使用框架可自行输出参数查看;(本人使用ThinkPHP5.*框架,ThinkPHp5.*框架中做了urldecode的处理,可以不必开发者手动urldecode;)
    			
    	2) url通过验证后,添加/删除外部联系人时,会想该url推送指定格式的xml数据(加密字符)
    		A)  **坑三**: 接收xml数据时,确保接收的数据事原生的,最好使用 $params = file_get_contents('php://input');	(ps: 本人就是因为在框架配置了htmlspecialchars(html标签过滤函数)这个函数将<>转义了,导致SDK中的DOMDocument类的loadXML方法, 无法读取正确的xml数据,抛出异常,记得将数据恢复成xml格式数据,若使用了htmlspecialchars,记得htmlspecialchars_decode一次)
    		B)  **坑四**: 因为涉及的字符串长度过长(400~750个字节),使用var_dump,echo,print_r均无法正常输出字符内容,建议使用将字符写入文件中(使用函数fopen(),fwrite(),或者file_put_content())
    		C)  具体代码过程参见下列两个版本,以ThinkPHP5.*版本为准,如有异议,欢迎提出讨论
    		
    	3) 详情参见企业微信api开发文档,
    		A)文档地址:
    			https://work.weixin.qq.com/api/doc#90000/90135/90664
    		B) 接口调试工具地址: 
    			https://work.weixin.qq.com/api/devtools/devtool.php		
    

    3.注意:

    	1) 上述有提及四个坑点,请各位开发者多留意 (可结合下列示例代码理解)
    	2) 必须先登录企业管理后台(管理员身份),配置回调事件的url相关的参数,并给相关企业成员配置"客户联系"权限
    

    4.PHP原生代码示例 (使用前提,需要先获取SDK)

    <?php
    
    class External {
    	
        protected $_weworkConfig = [
            'corpId' => '',	//企业ID
        ];	
        protected $_externalCallbackEvent = [	//回调事件参数
            'url'	=> 'http://www.test.com/External/callbackEvent',
            'token' => '',
            'encodingAESKey' => ''
        ];	
        protected $_callbackObj;    // 回调事件对象(外部联系人添加/删除)
    	
        protected $_callbackErrorMsgArr = [	//企业微信(添加/删除外部联系人)回调事件错误码+错误信息
            '0'=> 'success',
            '-40001'=> '签名验证错误',
            '-40002'=> 'xml解析失败',
            '-40003'=> 'sha加密生成签名失败',
            '-40004'=> 'encodingAesKey 非法',
            '-40005'=> 'corpid 校验错误',
            '-40006'=> 'aes 加密失败',
            '-40007'=> 'aes 解密失败',
            '-40008'=> '解密后得到的buffer非法',
            '-40009'=> 'base64加密失败',
            '-40010'=> 'base64解密失败',
            '-40011'=> '生成xml失败',
        ];
        
        public function __construct() {
            # 回调事件对象
            $this->_callbackObj = new \weworkapi\callback\WXBizMsgCrypt($this->_externalCallbackEvent['token'], $this->_externalCallbackEvent['encodingAESKey'], $this->_weworkConfig['corpId']); //企业应用回调, 消息加密/解密类WXBizMsgCrypt
            
        }
    	
    	/**
         * 验证(添加/删除外部联系人)回调事件url有效性
         */
        public function verifyUrl($data) {
            $params = $_GET;
            $params2 = $_POST;
            $params = array_merge($params,$params2);    // get数据+post数据
            try {
                if (empty($params['msg_signature'])) {
                    throw new \Exception('msg_signature不得为空');
                }
                if (empty($params['timestamp'])) {
                    throw new \Exception('timestamp不得为空');
                }
                if (empty($params['nonce'])) {
                    throw new \Exception('nonce不得为空');
                }
                if (empty($params['echostr'])) {
                    throw new \Exception('echostr不得为空');
                }
                $sReplyEchoStr = "";
                $verifyRes = $this->_callbackObj->VerifyURL($data['msg_signature'], $data['timestamp'], $data['nonce'], urldecode($data['echostr']),$sReplyEchoStr);   // 此处需要urldecode($data['echoStr'])
                0 !== $verifyRes && exception('errCode: '.$verifyRes .', errMsg: '.$this->_callbackErrorMsgArr[$verifyRes]);
                return $sReplyEchoStr;
            } catch (\Exception $ex) {
                return ['errCode'=>'0084','errMsg'=>$ex->getMessage()];
            }
            return ['errCode'=>'0','errMsg'=>'success','data'=>$verifyRes];
        }
    	
    	/**
         * 测试企业微信的外部联系人事件回调
         */
        public function callbackEvent() {
            $params = $_GET; //get参数
            $params['xmlContent'] = file_get_contents('php://input');  //post的xml数据
            # 记录入参
            $params['date'] = date('Y-m-d H:i:s');
            $paramsStr = json_encode($params);
            $fp = fopen('./externalCallbackEvent_params.log', 'w');
            fwrite($fp, $paramsStr);
            try {
                 //若回调url验证通过,处理回调的xml消息
                if (!empty($params['xmlContent']) && empty($params['echostr'])) {   
                    $dealRes = $this->dealCallbackEvent($params);
                    if ('success' !== $dealRes['desc']) {
                        throw new \Exception($dealRes['desc']);
                    }
                    # 记录调用结果
                    $callbakcRes = json_encode(['date'=>date('Y-m-d H:i:s'),'result'=>$dealRes['data']]);
                    $fp2 = fopen('./externalCallbackEvent_result.log', 'w');
                    fwrite($fp2, $callbakcRes);
                    return $dealRes['data'];
                } else {     //验证url有效性
                    $verifyRes = $this->verifyUrl($params);
                    if ('success' !== $verifyRes['desc']) {
                        throw new \Exception($verifyRes['desc']);
                    }
                    return $verifyRes['data'];  // 解密后的消息内容(务必原文输出),否则报错
                }
            } catch (\Exception $ex) {
                return ['errCode'=>'0083','errMsg'=>$ex->getMessage()];
            }
        }
    	
    	/**
         * 验证(添加/删除外部联系人)回调事件消息加密
         */
        public function dealCallbackEvent($data) {
            try {
                # 解密
                $decryptMsg = $this->decryptMsg($data);
                $decryptMsgArr = $this->XMLString2Array($decryptMsg);
                switch ($decryptMsgArr['ChangeType']) {
                    case 'add_external_contact':    // 添加外部联系人回调事件
                        $dealRes = $this->addExternalCallbackEvent($decryptMsgArr);
                        break;
                    case 'del_external_contact':    // 删除外部联系人回调事件
                        $dealRes = $this->delExternalCallbackEvent($decryptMsgArr);
                        break;
                    default:
                        throw new \Exception($type . '回调事件类型不合法');
                        break;
                }
                return $dealRes;
            }catch (\Exception $ex) {
                 throw new \Exception($ex->getMessage());
            }
        }
    	
    	/**
         * 消息加密
         */
        public function encryptMsg($data) {
            try {
    	//        $sReqTimeStamp = "1409659813";
    	//        $sReqNonce = "1372623149";
    	//        $sRespData = "<xml><ToUserName><![CDATA[mycreate]]></ToUserName><FromUserName><![CDATA[wx5823bf96d3bd56c7]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[this is a test]]></Content><MsgId>1234567890123456</MsgId><AgentID>128</AgentID></xml>";
                $sReqTimeStamp = $data['timestamp'];    //时间戳
                $sReqNonce = $data['nonce'];    //随机字符串
                $content = $data['content'];    //被加密的消息内容
                // 需要发送的明文
                $sRespData = "<xml><ToUserName><![CDATA[mycreate]]></ToUserName><FromUserName><![CDATA[".Config::get('wework.CORP_ID')."]]></FromUserName><CreateTime>".$sReqNonce."</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[".$content."]]></Content><MsgId>1234567890123456</MsgId><AgentID>".Config::get('WEWORK_AGENT_ID')."</AgentID></xml>";
                $sEncryptMsg = ""; //xml格式的密文
                $errCode = $this->_callbackObj->EncryptMsg($sRespData, $sReqTimeStamp, $sReqNonce, $sEncryptMsg);
                if (0 !== $errCode) {
                    throw new \Exceptionexception('errCode: '.$errCode .', errMsg: '.$this->_callbackErrorMsgArr[$errCode]);
                }
                return $sEncryptMsg;
            } catch (\Exception $ex) {
                throw new \Exception($ex->getMessage());
            }
        }
        
        /**
         * 消息解密
         */
        public function decryptMsg($data) {
            try {
        //        $sReqMsgSig = "477715d11cdb4164915debcba66cb864d751f3e6";
        //        $sReqTimeStamp = "1409659813";
        //        $sReqNonce = "1372623149";
        //        $sReqData = "<xml><ToUserName><![CDATA[wx5823bf96d3bd56c7]]></ToUserName><Encrypt><![CDATA[RypEvHKD8QQKFhvQ6QleEB4J58tiPdvo+rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT+6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6+kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r+KqCKIw+3IQH03v+BCA9nMELNqbSf6tiWSrXJB3LAVGUcallcrw8V2t9EL4EhzJWrQUax5wLVMNS0+rUPA3k22Ncx4XXZS9o0MBH27Bo6BpNelZpS+/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl/T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==]]></Encrypt><AgentID><![CDATA[218]]></AgentID></xml>";
                $sReqMsgSig = $data['msg_signature'];
                $sReqTimeStamp = $data['timestamp'];
                $sReqNonce = $data['nonce'];
                $sReqData = $data['xmlContent'];    // post请求的密文数据
                $decryptMsg = "";  // 解析之后的明文
                $errCode = $this->_callbackObj->DecryptMsg($sReqMsgSig, $sReqTimeStamp, $sReqNonce, $sReqData, $decryptMsg);
                if (0 !== $errCode) {
                    throw new \Exception('errCode: '.$errCode .', errMsg: '.$_callbackErrorMsgArr[$errCode]);
                }
                return $decryptMsg;
            } catch (\Exception $ex) {
                throw new \Exception($ex->getMessage());
            }
        }
    	
    	/**
         * 提取xml数据中的指定参数
         * (转换原理:xml字符串->xml对象->json对象->数组)
         * @param string xml格式数据
         * @return array array格式数据
         */
        public function XMLString2Array($xmlStr) {
            try {
                //xml字符转换为xml对象
                $xmlObj = simplexml_load_string($xmlStr,'SimpleXMLElement', LIBXML_NOCDATA);
                $jsonObj = json_encode($xmlObj);
                return json_decode($jsonObj,true);
            } catch (\Exception $ex) {
                throw new Exception($ex->getMessage());
            }
        }
    	
    	 /**
         * 添加外部联系人回调处理
         * 原理:
         *  1) 获取外部联系人userid(异步处理时,userid从队列中获取)
         *  2) 获取外部联系人详情
         *  3) 将外部联系人插入数据库
         * @param array 
         */
        public function addExternalCallbackEvent($data) {
            
        }
        
        /**
         * 删除外部联系人回调处理
         * 原理:
         *   1) 获取外部联系人userid(异步处理时,userid从队列中获取)
         *   2) 删除本地数据库中外部联系人记录
         */
        public function delExternalCallbackEvent($data) {
               
        }
    	
    }
    
    

    5. ThinkPHP5.*实例(先获取PHP-SDK)

    <?php
    use \think\Validate;	//ThinkPHP5.*的验证类
    class External {
        protected $_weworkConfig = [
            'corpId' => '',	//企业ID
        ];	
        protected $_externalCallbackEvent = [	//回调事件参数
            'url'	=> 'http://www.test.com/External/callbackEvent',
            'token' => '',
            'encodingAESKey' => ''
        ];	
        protected $_callbackObj;    // 回调事件对象(外部联系人添加/删除)
        protected $_callbackErrorMsgArr = [	//企业微信(添加/删除外部联系人)回调事件错误码+错误信息
            '0'=> 'success',
            '-40001'=> '签名验证错误',
            '-40002'=> 'xml解析失败',
            '-40003'=> 'sha加密生成签名失败',
            '-40004'=> 'encodingAesKey 非法',
            '-40005'=> 'corpid 校验错误',
            '-40006'=> 'aes 加密失败',
            '-40007'=> 'aes 解密失败',
            '-40008'=> '解密后得到的buffer非法',
            '-40009'=> 'base64加密失败',
            '-40010'=> 'base64解密失败',
            '-40011'=> '生成xml失败',
        ];
        
        public function __construct() {
            # 回调事件对象
            $this->_callbackObj = new \weworkapi\callback\WXBizMsgCrypt($this->_externalCallbackEvent['token'], $this->_externalCallbackEvent['encodingAESKey'], $this->_weworkConfig['corpId']); //企业应用回调,消息加密/解密类WXBizMsgCrypt
        }
        /**
         * 测试企业微信的外部联系人事件回调
         */
        public function callbackEvent() {
            $params = Request::instance()->param(); //get参数
            $params['xmlContent'] = file_get_contents('php://input');  //post的xml数据
            # 记录入参
            $params['date'] = date('Y-m-d H:i:s');
            $paramsStr = json_encode($params);
            $fp = fopen('./externalCallbackEvent_params.log', 'w');
            fwrite($fp, $paramsStr);
            try {
                 //若回调url验证通过,处理回调的xml消息
                if (!empty($params['xmlContent']) && empty($params['echostr'])) {   
                    $dealRes = $this->dealCallbackEvent($params);
                    'success' !== $dealRes['desc'] && exception($dealRes['desc']);
                    # 记录调用结果
                    $callbakcRes = json_encode(['date'=>date('Y-m-d H:i:s'),'result'=>$dealRes['data']]);
                    $fp2 = fopen('./externalCallbackEvent_result.log', 'w');
                    fwrite($fp2, $callbakcRes);
                    return $dealRes['data'];
                } else {     //验证url有效性
                    $verifyRes = $this->verifyUrl($params);
                    'success' !== $verifyRes['desc'] && exception($verifyRes['desc']);
                    return $verifyRes['data'];  // 解密后的消息内容(务必原文输出),否则报错
                }
            } catch (\Exception $ex) {
                $this->result([],'0083',$ex->getMessage(),'json');
            }
        }
        
         /**
         * 验证(添加/删除外部联系人)回调事件消息加密
         */
        public function dealCallbackEvent($data) {
            try {
                $rules = [
                    'msg_signature' => 'require',
                    'timestamp' => 'require',
                    'nonce' => 'require',
                    'xmlContent' => 'require',  //接企业微信服务器发送的回调的xml消息内容
                ];
                $validate = new Validate($rules);
                !$validate->check($params) && exception($validate->getError());
    //            $params['xmlContent'] = htmlspecialchars_decode($params['xmlContent']); //若配置中使用了htmlspecialchars函数,转义了<,>等符号
                
                # 解密
                $decryptMsg = $this->decryptMsg($data);
                $decryptMsgArr = $this->XMLString2Array($decryptMsg);
                switch ($decryptMsgArr['ChangeType']) {
                    case 'add_external_contact':    // 添加外部联系人回调事件
                        $dealRes = $this->addExternalCallbackEvent($decryptMsgArr);
                        break;
                    case 'del_external_contact':    // 删除外部联系人回调事件
                        $dealRes = $this->delExternalCallbackEvent($decryptMsgArr);
                        break;
                    default:
                        throw new \Exception($type . '回调事件类型不合法');
                        break;
                }
                return $dealRes;
            }catch (\Exception $ex) {
                 throw new \Exception($ex->getMessage());
            }
        }
        
        /**
         * 验证URL有效性
         * @param array 参数
         * @return int 错误码,0-正常,否则出错
         */
        public function verifyUrl($data) {
            try {
                 $rules = [
                    'msg_signature' => 'require',
                    'timestamp' => 'require',
                    'nonce' => 'require',
                    'echostr' => 'require',
                ];
                $validate = new Validate($rules);
                !$validate->check($params) && exception($validate->getError());
                
                $sReplyEchoStr = "";
                $verifyRes = $this->_callbackObj->VerifyURL($data['msg_signature'], $data['timestamp'], $data['nonce'], $data['echostr'],$sReplyEchoStr);   // 此处不需要urldecode($data['echoStr']),初步猜测是TP5的Request类已经做过了urldecode处理
                0 !== $verifyRes && exception('errCode: '.$verifyRes .', errMsg: '.$this->_callbackErrorMsgArr[$verifyRes]);
                return $sReplyEchoStr;
            } catch (\Exception $ex) {
                throw new \Exception($ex->getMessage());
            }
        }
        
        /**
         * 消息加密
         */
        public function encryptMsg($data) {
            try {
    //        $sReqTimeStamp = "1409659813";
    //        $sReqNonce = "1372623149";
    //        $sRespData = "<xml><ToUserName><![CDATA[mycreate]]></ToUserName><FromUserName><![CDATA[wx5823bf96d3bd56c7]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[this is a test]]></Content><MsgId>1234567890123456</MsgId><AgentID>128</AgentID></xml>";
                $sReqTimeStamp = $data['timestamp'];    //时间戳
                $sReqNonce = $data['nonce'];    //随机字符串
                $content = $data['content'];    //被加密的消息内容
                // 需要发送的明文
                $sRespData = "<xml><ToUserName><![CDATA[mycreate]]></ToUserName><FromUserName><![CDATA[".Config::get('wework.CORP_ID')."]]></FromUserName><CreateTime>".$sReqNonce."</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[".$content."]]></Content><MsgId>1234567890123456</MsgId><AgentID>".Config::get('WEWORK_AGENT_ID')."</AgentID></xml>";
                $sEncryptMsg = ""; //xml格式的密文
                $errCode = $this->_callbackObj->EncryptMsg($sRespData, $sReqTimeStamp, $sReqNonce, $sEncryptMsg);
                0 !== $errCode && exception('errCode: '.$errCode .', errMsg: '.$this->_callbackErrorMsgArr[$errCode]);
                return $sEncryptMsg;
            } catch (\Exception $ex) {
                throw new \Exception($ex->getMessage());
            }
    
        }
        
        /**
         * 消息解密
         */
        public function decryptMsg($data) {
            try {
        //        $sReqMsgSig = "477715d11cdb4164915debcba66cb864d751f3e6";
        //        $sReqTimeStamp = "1409659813";
        //        $sReqNonce = "1372623149";
        //        $sReqData = "<xml><ToUserName><![CDATA[wx5823bf96d3bd56c7]]></ToUserName><Encrypt><![CDATA[RypEvHKD8QQKFhvQ6QleEB4J58tiPdvo+rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT+6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6+kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r+KqCKIw+3IQH03v+BCA9nMELNqbSf6tiWSrXJB3LAVGUcallcrw8V2t9EL4EhzJWrQUax5wLVMNS0+rUPA3k22Ncx4XXZS9o0MBH27Bo6BpNelZpS+/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl/T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==]]></Encrypt><AgentID><![CDATA[218]]></AgentID></xml>";
                $sReqMsgSig = $data['msg_signature'];
                $sReqTimeStamp = $data['timestamp'];
                $sReqNonce = $data['nonce'];
                $sReqData = $data['xmlContent'];    // post请求的密文数据
                $decryptMsg = "";  // 解析之后的明文
                $errCode = $this->_callbackObj->DecryptMsg($sReqMsgSig, $sReqTimeStamp, $sReqNonce, $sReqData, $decryptMsg);
                 0 !== $errCode && exception('errCode: '.$errCode .', errMsg: '.$this->_callbackErrorMsgArr[$errCode]);
                return $decryptMsg;
            } catch (\Exception $ex) {
                throw new \Exception($ex->getMessage());
            }
        }
        
        /**
         * 提取xml数据中的指定参数
         * (转换原理:xml字符串->xml对象->json对象->数组)
         * @param string xml格式数据
         * @return array array格式数据
         */
        public function XMLString2Array($xmlStr) {
            try {
                //xml字符转换为xml对象
                $xmlObj = simplexml_load_string($xmlStr,'SimpleXMLElement', LIBXML_NOCDATA);
                $jsonObj = json_encode($xmlObj);
                return json_decode($jsonObj,true);
            } catch (\Exception $ex) {
                throw new Exception($ex->getMessage());
            }
        }
    	
    	 /**
         * 添加外部联系人回调处理
         * 原理:
         *  1) 获取外部联系人userid(异步处理时,userid从队列中获取)
         *  2) 获取外部联系人详情
         *  3) 将外部联系人插入数据库
         * @param array 
         */
        public function addExternalCallbackEvent($data) {
            
        }
        
        /**
         * 删除外部联系人回调处理
         * 原理:
         *   1) 获取外部联系人userid(异步处理时,userid从队列中获取)
         *   2) 删除本地数据库中外部联系人记录
         */
        public function delExternalCallbackEvent($data) {
               
        }
    }
    
    
    展开全文
  • 研究发现,高管人员的外部薪酬缺口对企业创新具有积极作用。 而且,高管人才越多,外部薪酬差距越明显,将促进企业创新。 此外,与国有企业相比,非国有企业高管人员的外部薪酬差距对企业创新影响更大。 本文不仅...
  • 文章从内部资源、能力和外部网络的视角分析了企业研发能力与商业、研发能力与大学、内部资源与商业以及内部资源与大学的联系对财务绩效和创新绩效的作用;通过建立理论模型及270份中国企业的调研数据,就内部资源、...
  • 技术资源管理在外部社会资本和产品创新间的中介作用研究,徐凯,高山行,在以往的研究中,多将外部社会资本视为提高企业产品创新的关键因素。我国企业在创新的过程中非常重视发挥外部社会联系的作用,企
  • 网络多元性、外部知识整合与在孵企业孵化绩效关系研究,胡海青,张颖颖,网络多元性对企业绩效的作用关系仍存在争论,究其原因在于较少学者意识到网络多元性对企业绩效影响的权变性。本文基于权变理论,
  • 文章从内部资源、能力和外部网络的视角分析了企业研发能力与商业、研发能力与大学、内部资源与商业以及内部资源与大学的联系对时务绩效和创新绩效的作用;通过建立理论模型及270份中国企业的调研数据,就内部资源、...
  • 分析了企业传统存货管理存在的问题,提出合理整合内外部物流资源是现代存货管理的趋势,并重点阐述了利用第三方物流加强企业存货管理的作用
  • 基于结构方程模型与多元层级回归研究了涵盖市场、制度、技术层面的外部环境动态性影响下网络能力在提升煤炭企业创新中的影响作用。其中,网络能力包含网络规划能力、网络构建能力、网络管理能力与网络利用能力四个...
  • 企业文化在企业管理中的作用

    千次阅读 2009-12-22 20:27:00
    关键字:企业文化 企业管理一、企业文化的内容1、企业文化的定义:在商品经济范畴,作为组织单元的多种模式之一,按照一定的组织规律,有机构成的经济实体,一般以赢利为目的,以实现投资人、客户、员工、社会大众...

    关键字企业文化  企业管理

    一、企业文化的内容

    1、企业文化的定义:在商品经济范畴,作为组织单元的多种模式之一,按照一定的组织规律,有机构成的经济实体,一般以赢利为目的,以实现投资人、客户、员工、社会大众的利益最大化为使命,通过提供产品或服务换取收入。它是社会发展的产物,因社会分工的发展而成长壮大。

    2、企业文化的表现形式

    企业文化的表现形式多种多样。主要有:1企业哲学2企业精神;3企业目标;4企业道德;5企业风尚;6企业民主;7企业形象;8企业价值观;9企业素质;10企业行为规范等。

    3、企业管理:企业管理主要是对员工的管理和对财务机构、会计机构的管理。

     

    二、企业文化的企业管理中的作用

    日本丰田的一个员工在街上看到一台已经卖到客户手里的丰田车停在那里,侧合资很脏,于是就过去吧车子檫的干干净净……这就是丰田的企业文化。

    世界著名酒店希尔顿饭店永远的两个信条:第一条、客户永远是对的。第二条、客户如果错了,那么请参照第一条。这就是希尔顿的文化。

    麦当劳全世界的门口永远都设一个美丽的垃圾桶供行人使用……这是麦当劳的文化。

    牛根生情的说过:“一定要让贫困山区的孩子也喝上牛奶”,这是蒙牛的文化。

    文化是暖人心的,却又着巨大的力量。文化是先赢你的心。而不是先拖你的腿,可能是拖不动的,。如果赢了你的心,你就可能跟他跑起来。有个故事这样说的“太阳和风斗想让一个人脱掉他的外套,于是风猛烈的吹,可是那个人却把衣服裹得更紧了,太阳却集中阳光去温暖那个人,结果那个人主动地把外衣脱掉了”。这就是文化的力量。这里面体现的就是主动与被动的区别,而文化就塑造了主动性。

    企业文化一定是企业的核心竞争力。三流的企业做产品;二流的企业做市场;一流的企业永远做的是文化。

    1、企业文化在企业中到底能起到哪些功能?

    1)导向功能它指明企业的发展方向,把企业职工引导到企业所确定的企业目标上来。企业提倡什么,崇尚什么,职工的注意力必然转向什么,企业文化越强有力,越用不着巨细无遗的详 尽的规章制度。

    2)提升功能。先进的文化理念可提高企业形象的美感度,增加品牌的附加值。万宝路的文化比登喜路明显高出一筹,万宝路立意于一种人格力量和一种人类审美的局面,而登喜路仅仅着眼于烟的口味,固而万宝路的形象价值是登喜路的几十倍。
    (3)凝聚功能。企业成员既有共同的利益,也有不同的利益,但企业文化能使企业各方面力量凝聚起来,使大家认清共同的利益大于各自的一己之利。

    (4)激励功能崇高的文化会产生一种巨大的推力,让企业职工有盼头,有奔头,让企业外部的合作者产生合作的动力,对消费者激发其信心。
    (5)稳定功能正确的文化存在着一种同化力量,对一些消极的亚理念起着消弱、改造的功能,从而使正确理念一统天下,企业处于有序状态,以利平稳而有力的运行

     

    2、企业文化对企业的影响

    企业形象是企业文化的外化,是企业文化在传播媒介和对外交往中的映射,企业文化则是企业形象的核心和灵魂,企业形象与企业文化是一种标和本的关系。企业文化塑造着企业的形象。优良的企业形象是企业成功的标志,包括两个方面:一是内部形象,它可以激发企业职工本企业的自豪感,责任感和崇尚心理;二是外部形象,它能够更深刻的反映出该企业文化的特点及内涵。企业形象除了本企业有很大的影响之外,还会对本地区乃至国内外的其他一些企业产生一定的影响。企业形象是企业重要的竞争要素,优秀的企业文化向社会大众展示着企业成功的管理风格、良好的经营状况和高尚的精神风貌,良好的企业形象是企业不可忽视的无形资产。

    企业文化的作用毋庸置疑,优秀的企业文化的形成缺少不了企业文化的建设。在企业文化建设中,企业领导者起模范带头作用,坚持以人为本和企业文化建设与企业管理相融合的原则,真正认识企业文化建设中的误区,广大员工则依据规章制度和企业目标进行积极配合,最终建设一个适合企业自身特点的企业文化。

    1、优秀的企业文化对企业人力资源管理的影响
      在日益激烈的国际竞争中,企业的竞争焦点将不限于资本数量与技术水平,其更高层次的竞争是人才竞争和企业文化竞争,人才是核心竞争力的创造者,企业文化则是影响人力资源作用的一个环境。现代企业积极创建一种良好的公平的符合自身发展的企业文化会培养和留住优秀的人才,而人才价值的发挥会为企业带来持续的竞争优势,更有利于企业文化的发展。

    2优秀的企业文化对企业战略的影响

    企业文化在企业战略管理过程中起着极其重要的作用。它是以企业精神为核心,凝聚企业员工归属感、积极性和创造性的人本管理理论。企业必须在员工中建立共同的价值观,从根本上调动员工的积极性和责任感,才能激发员工的热情,统一全体员工的意志,将他们的行为引导到共同的企业发展目标和方向上来,为企业战略的实现努力奋斗

    3. 优秀的企业文化对企业营销的影响

    文化差异形成的障碍是多方面的,表现为物质文化、语言文字、审美观、传统习惯、宗教信仰、态度价值观、社会组织机构的差异等方面,这使得国际营销环境变得异常复杂。所以,各种文化成分作深入研究,须对各种文化成份进行分析,并且注意它对营销努力的影响。文化是相关联的整体,要考虑其构成因素之间相互作用和综合作用的结果。

     

     

    三、优秀企业文化的建立

    1精心提炼,严厉确立。对企业在发展过程中所形成的不同的价值观念进行 分析 整合、精心提炼出最适应本企业发展、最有价值的精神,而不是简单地模拟别人提出所谓的企业精神“而一旦提炼出了新的企业精神,就要经过厂员工代表大会这个最高权力机关予以严厉确立,使全体员工对新的企业精神有一种自豪感,从而自觉地以实际行动实践企业精神。

    2大力宣传,深入人心。深入人心。企业精神确立后,要想真正被员工所接受,就必须通过各种宣传工具、各种宣传途径、各种宣传方式进行灌输教育,把企业精神所提倡的观念、意识和原则,把体现企业精神的先进思想灌输到员工的大脑中去,使之深入人心,从而使员工在企业活动中自觉或不自觉地表现出来。

    3身体力行,发扬光大企业精神不是说在嘴上,写在纸上,挂在墙上的装饰品,而是需要企业从上到下,从治理者到员工身体力行的规范正把企业精神落实到自己的日常工作中去,只有上下联动,心往一处想,劲往一处使,我们的企业精神才能发扬光大,成为企业持续发展的不竭动力。

    作为企业文化核心的企业精神的培育和塑造,是企业内部条件和外部环境相互作用、相互结合的产物,从提炼确立,到成为企业的精神支柱和全体员工的力量源泉,需要不断地培育和塑造,只有这样,才能充分发挥企业精神在企业发展进程中的积极促进作用。

    展开全文
  • 数据中台对企业意义和作用有哪些

    千次阅读 2020-03-18 11:20:30
    那么数据中台对企业到底有哪些具体意义和作用呢?下面我们来具体看一下。  1、了解客户的观念和行为  在以客户为中心的时代,客户的观念和行为正在从根本上改变企业的经营方式以及企业与客户的互...

      随着数据浪潮席卷全球,数数据中台应运而生。众所周知,数据中台的主要功能是统一标准和口径后对数据进行存储和处理,使企业能够提供更高效的服务。总之,数据中台的目标是节约企业成本,实现精细化运营。那么数据中台对企业到底有哪些具体意义和作用呢?下面我们来具体看一下。

     

      1、了解客户的观念和行为

     

      在以客户为中心的时代,客户的观念和行为正在从根本上改变企业的经营方式以及企业与客户的互动方式。数据中台建设的核心目标就是以客户为中心的持续规模化创新,而数据中台的出现,将会极大提升数据的应用能力,将海量数据转化为高质量数据资产,为企业提供更深层的客户洞察,从而为客户提供更具个性化和智能化的产品和服务。譬如,数据中台能够汇聚全渠道的数据,在标签管理、营销圈人、效果分析等应用上实现全域的闭环,优化对客户全生命周期的理解。此外,以数据中台为基础,通过数据化运营提升客户留存、复购和忠诚度,也得到诸多企业的认可。

     

      2、为商业模式的创新提供数据基础

     

      只有依托数据和算法,将由海量数据提炼的洞察转化为行动,才能推动大规模的商业创新。数据中台在通过算法将洞察直接转化为行动、实现大规模商业创新方面的能力,令人瞩目。另一方面,数据无法被业务用起来的一个原因是数据没办法变得可阅读、易理解。信息技术人员不够懂业务,而业务人员不够懂数据,导致数据应用到业务变得很困难,数据中台需要考虑将信息技术人员与业务人员之间的障碍打破,信息技术人员将数据变成业务人员可阅读、易理解的内容,业务人员看到内容后能够很快结合到业务中去,这样才能更好地支撑商业模式的创新。此外,数据中台提供标准的数据访问能力,简化集成复杂性、促进互操作性等特性也非常受企业CIO们的青睐。同时,在快速构建服务能力、加快商业创新、提升业务适配等方面,数据中台也将会发挥重要的作用。

     

      3、打破数据孤岛

     

      面对纷繁复杂而又分散割裂的海量数据,数据中台的突出作用和意义在于能充分利用内外部数据,打破数据孤岛的现状,打造持续增值的数据资产,在此基础上,能够降低使用数据服务的门槛,繁荣数据服务的生态,实现数据“越用越多”的价值闭环,牢牢抓住客户,确保竞争优势。这些服务跟企业的业务有较强的关联性,是这个企业独有的且能复用的,它是企业业务和数据的沉淀,其不仅能降低重复建设、减少烟囱式协作的成本,也是差异化竞争优势的所在。

     

      数据中台的意义和作用是将数据作为生产资料转化为数据生产力。在全球数据化时代,企业只有了解用户,在数据支撑的条件下不断创新,打破数据孤岛,才能在日益激烈的竞争中长期保持优势。

    展开全文
  • 半导体企业正通过不断推出降低待机功耗、提高效率的新产品,在协助厂商符合这些规范的过程中起着越来越重要的作用。 笔记本电脑、打印机、调制解调器、电池充电器等等,需要外部电源的产品形形式式,不能尽录。尽管...
  • Android如何从外部跳进App

    千次阅读 2015-06-24 09:21:29
    解决这个问题有两个作用: 1、不用打开App直接进入某页面 2、实现App分享到外部,同时由外部进入App的闭环。 这个话题可以分两方面来讲,一方面是从微信进入App,另一方面是从网页进入App。 咱们拿...

    解决这个问题有两个作用:

    1、不用打开App直接进入某页面

    2、实现App分享到外部,同时由外部进入App的闭环。

    这个话题可以分两方面来讲,一方面是从微信进入App,另一方面是从网页进入App。

    咱们拿http://my.oschina.net/liucundong/blog/354029当例子来讲一下

    主要通过scheme、host、path、pathPrefix等data信息来区分

    两个方案都需要给跳转到的Activity加入intent-filter信息,例如

    <intent-filter>

    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />

    <category android:name="android.intent.category.BROWSABLE" />

    <data android:scheme="cundong" android:host="splash"/>

    </intent-filter>

    首先我们来讲微信端进入App,场景:从App分享内容到微信,再从微信直接打开App。

    第一步,注册微信公众平台,相关企业信息,下载链接,Logo等 都填写完毕

    第二步,分享时使用WXAppExtendObject,把链接url赋值给extInfo

    第三步,在IWXAPIEventHandler接口的onReq方法的req.getType()=ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX时,发起你的跳转

    第四步,跳转时需要数据,数据从哪里来,从WXEntryActivity类中onCreate方法的getIntent对象里来

    从微信进入App就这样结束了。

    -------------------我是分割线------------------------

    接着来讲网页端,由于webView的限制,如微信、微博等都采用这个控件,所以只能分享到网页,再进入App。

    原理如下:

    <div>
                <a id="J-call-app" href="javascript:;" class="label">立即打开&gt;&gt;</a>
                <input id="J-download-app" type="hidden" name="storeurl" value="http://apk.hiapk.com/appinfo/com.tmall.wireless">
            </div>
     
            <script>
                (function(){
                    var ua = navigator.userAgent.toLowerCase();
               
                    var t;
                    var url=document.location;
                    var config = {
                        /*scheme:必须*/
                        scheme_IOS: 'cundong://',
                        scheme_Adr: 'cundong://splash',
                        download_url: document.getElementById('J-download-app').value,
                        timeout: 600
                    };
     
                    function openclient() {
                        var startTime = Date.now();
     
                        var ifr = document.createElement('iframe');
     
                        //alert(config.scheme_Adr);
                        ifr.src = ua.indexOf('os') > 0 ? config.scheme_IOS : config.scheme_Adr;
                        ifr.style.display = 'none';
                        document.body.appendChild(ifr);
     
                        var t = setTimeout(function() {
                            var endTime = Date.now();
     
                            if (!startTime || endTime - startTime < config.timeout -200) { 
                                window.location = config.download_url;
                            } else {
                                       window.location.href=ifr.src.replace("http://","cundong://");;
                            }
                        }, config.timeout);


     
                        window.onblur = function() {
                            clearTimeout(t);
                        }
                    }
                    window.addEventListener("DOMContentLoaded", function(){
                        document.getElementById("J-call-app").addEventListener('click',openclient,false);
     
                    }, false);
                })()
            </script>

    点击打开四个字后,执行一个js,在限制时间内,如果可以打开App则打开,否则进入下载页

    解决这个问题的基本思路就是这样,欢迎大家交流探讨!

    展开全文
  • 面对人工智能下的信息爆炸时代,科技型中小企业的TMT决策不再是团队内部的“封闭...认知需要共享能部分中介TMT内外部互动对决策质量和决策满意度的正向影响,即TMT认知共享在TMT互动与战略决策绩效的关系中起到中介作用
  • IIS Express 开发外部访问

    千次阅读 2016-09-12 11:12:06
    转载:http://blog.csdn.net/egman/article/details/51991249 一、 [环境]   1.开发机操作系统 Windows 10 企业版 64位  使用Wifi上网,网卡绑定地址 IP: 192.168.88.238
  • 基于上市公司的高管薪酬外部公平性的分析研究,计晓东,杨玉凤,高管薪酬的公平性问题一直是学术研究的热点。已有研究对企业内部薪酬公平性的研究较多,而较少关注外部薪酬公平性的影响作用。本
  • 关于企业应用架构中前置机的作用

    千次阅读 2016-10-12 16:48:29
    如果我有某种业务接口需要跟他们的后台系统打交道,要从我们的外部网络访问他们的后台系统,这些单位是绝对不允许的。这个时候,他们要求你或者他们自己开发一个软件,运行在他们的内网,然后通过专线或硬件隔离技术...
  • 微信营销是网络经济时代企业或个人营销模式的一种。是伴随着微信的火热而兴起的一种网络营销方式。但是也正因为如此,微信官方的屏蔽封杀域名的规范的也越来越严格。...微信跳转外部浏览器的作用是什么?
  • 对知识不可分割性和知识可利用性特征的新理解,使得人们有可能认识到金钱外部性在技术知识的... 它们的综合作用决定了企业层面知识的定向特征的融合,并解释了本地和技术创新系统的路径依赖出现以及创新级联的动力学。
  • 海外背景主管对企业越来越重要。 通过对2011年至2017年中国A股上市公司数据的分析,发现海外背景高管的存在有利于企业绩效的提高。 具有海外工作经验的高级... 只有在外部机构环境良好的情况下,海外高管才能发挥作用
  • 对任何企业来讲,身份信息管理都是一项繁重的工作,一是要保证人员和组织架构信息的准确性,二是使这些信息能够在不同的目录或应用中高效地交互。 特别是对于中大型企业来说,在复杂的商业环境下,IT人员不仅要管理...
  • 企业快信JAVA

    2011-12-22 18:20:57
    企业快信的作用是帮助企业解决企业内部、企业外部沟通难、信息不能及时传播等问题。为此,企业快信系统需要提供有邮件群发、短信群发等功能。通过对多数企业日常业务的考察、分析,并结合短信及邮件自身的特点,本...
  • 提出利用数据挖掘技术建立包括监管部门、矿山企业及基层职工三层结构的矿山企业安全监管信息系统模型,为矿山企业提供一个监管机构与企业外部共同监管、设备与人共同作用的矿山安全管理系统。
  • 企业信息化管理(Enterprise Informatization Management,简称EIM):是指对... 企业信息化是指企业广泛利用现代信息技术,充分开发和利用企业内部或外部的,企业可能得到和利用的,并与企业生产经营活动有关的...
  • 关于网站外部链接策略常用方法

    千次阅读 2016-02-23 17:59:25
    1、养博客做链接 都知道博客的权重都非常高,尤为做baidu的博客,百度关注自己的...论坛是大家首先想到的外部链接,并且网站的大部分链接都靠这里的支持,大家要充分利用论坛,比较有名的论坛是必须去的,能留链接的
  • 企业快信的作用是帮助企业解决企业内部、企业外部沟通难、信息不能及时传播等问题。为此,系统提供邮件群发、短信群发、人员档案、信息的管理等功能。系统是短信猫与邮件在企业商务应用中的典型实例,因此必然受到...
  • 企业管理复习题库

    万次阅读 2020-09-23 07:17:37
    2020 年春季《企业管理》复习大纲(考试时间:90 分钟) 试题类型: ...2、管理的含义:管理是根据事物的客观规律,通过计划、组织、领导和控制等职能作用于管理对象,使之适应外部环境,以达到组织
  • 当下微服务的实践方案中,SpringCloud,Dubbo作为主流的落地方案,在企业应用架构中发挥越来越重要的作用。需要特别说明:本文讨论的架构目前适用于普通的企业级应用,其他行业(例如互联网)需要进一步扩展。在讨论...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 105,086
精华内容 42,034
关键字:

企业外部的作用