common.class.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868
  1. <?php
  2. defined('IS_INITPHP') || die('Access Denied!');
  3. /**
  4. * 扩展类库
  5. *
  6. * @version 0.1.0
  7. * @author clh
  8. */
  9. class commonClass{
  10. /**
  11. *生成时间戳
  12. * @return string
  13. */
  14. function timestamp() {
  15. list($s1, $s2) = explode(' ', microtime());
  16. return (float)sprintf('%.0f', (floatval($s1) + floatval($s2)));
  17. }
  18. /**
  19. * 生成时间
  20. * @return string
  21. */
  22. function timenow() {
  23. return date("Y-m-d H:i:s", time());
  24. }
  25. /**
  26. * 生成时间
  27. * @return string
  28. */
  29. function datenow() {
  30. return date("Y-m-d", time());
  31. }
  32. /**
  33. * 生成时间
  34. * @return string
  35. */
  36. function datemore() {
  37. return date("Y-m-d", strtotime("+7 day"));
  38. }
  39. /**
  40. * 生成时间戳大于 多少分钟,30分种有效期
  41. * @param $timestamp 时戳
  42. * @return string
  43. */
  44. function timestampeq($timestamp=0) {
  45. list($s1, $s2) = explode(' ', microtime());
  46. return (float) floatval($timestamp)+ (floatval(60*3000));
  47. }
  48. /**
  49. * 用户token
  50. * @param $uid 用户ID
  51. * @param $timestamp 时戳
  52. * @return string
  53. */
  54. function token($uid=0,$timestamp=0) {
  55. return md5($uid.$timestamp);
  56. }
  57. /**
  58. *生成时间戳+随机码 唯一订单ID号
  59. * @return string
  60. */
  61. function orderId() {
  62. list($s1, $s2) = explode(' ', microtime());
  63. return (float)sprintf('%.0f', (floatval($s1) + floatval($s2))).$this->randomnum();
  64. }
  65. /**
  66. * 先验证用户密码是否正确
  67. * @param string $appKey 用户的KEY
  68. * @param string $appToken 请求的token
  69. * @return boolean
  70. */
  71. function checkToken($appKey,$appToken)
  72. {
  73. /*$bool=false;
  74. switch (strtoupper($appToken))
  75. {
  76. case strtoupper(md5($appKey."|".date("Y-m-d H", strtotime()))):
  77. $bool=true;
  78. break;
  79. case strtoupper(md5($appKey."|".date("Y-m-d H", strtotime("+1 hour")))):
  80. $bool=true;
  81. break;
  82. case strtoupper(md5($appKey."|".date("Y-m-d H", strtotime("-1 hour")))):
  83. $bool=true;
  84. break;
  85. default:
  86. $bool=false;
  87. break;
  88. }
  89. return $bool;*/
  90. return true;
  91. }
  92. /**
  93. * 用于在检测过滤列表的方法名
  94. * @param string $funName 请求方法名
  95. * @return boolean
  96. */
  97. function checkAction($accessName,$actionName)
  98. {
  99. $bool=true;
  100. $noCheckFun = $accessName;
  101. $json = json_decode($noCheckFun[0]);
  102. if (strpos('|'.$json->funName.'|', '|'.$actionName.'|') !== false){
  103. $bool=false;
  104. }
  105. return $bool;
  106. }
  107. /**
  108. * 获取返回错
  109. */
  110. function commErr($type){
  111. $res ="<Response><ResultCode>1</ResultCode><ResultContent>失败</ResultContent>";
  112. switch ($type)
  113. {
  114. case "1":
  115. $res="<Response><ResultCode>1</ResultCode><ResultContent>appUser和appToken不能为空</ResultContent>";
  116. break;
  117. case "2":
  118. $res="<Response><ResultCode>1</ResultCode><ResultContent>appUser不正确</ResultContent>";
  119. break;
  120. case "3":
  121. $res="<Response><ResultCode>1</ResultCode><ResultContent>appToken不正确</ResultContent>";
  122. break;
  123. case "4":
  124. $res="<Response><ResultCode>1</ResultCode><ResultContent>没有权限访问</ResultContent>";
  125. break;
  126. case "5":
  127. $res="<Response><ResultCode>1</ResultCode><ResultContent>系统出错</ResultContent>";
  128. break;
  129. }
  130. echo $res;
  131. }
  132. /**
  133. * 获取地址错误
  134. */
  135. function urlErr(){
  136. //jsonp回调参数,必需
  137. $callback = isset($_GET['callback']) ? trim($_GET['callback']) : '';
  138. $jsonData["dataToken"]["timestamp"]="";
  139. $jsonData["dataToken"]["token"]="";
  140. $jsonData["dataToken"]["status"]=0;
  141. $jsonData["dataToken"]["info"]="验证失败";
  142. $jsonData["dataInfo"]["status"]="0";
  143. $jsonData["dataInfo"]["info"]="非法访问";
  144. $jsonData["dataInfo"]["data"]="";
  145. //返回格式,有回调或没有回调两种方式
  146. if($callback){
  147. echo $callback . '(' .json_encode($jsonData) .')'; //返回格式,回调来jsonp 必需 json 数据
  148. }else{
  149. echo json_encode($jsonData); //返回格式,必需 json 数据
  150. }
  151. }
  152. function array_multi2single($array)
  153. {
  154. static $result_array=array();
  155. foreach($array as $key=>$value)
  156. {
  157. if(is_array($value))
  158. {
  159. $this->array_multi2single($value);
  160. }
  161. else
  162. $result_array[]=$value;
  163. }
  164. return $result_array;
  165. }
  166. /**
  167. * 将多维数组转为一维数组
  168. * @author echo
  169. * @param array $arr
  170. * @return array
  171. */
  172. function ArrMd2Ud($arr) {
  173. #将数值第一元素作为容器,作地址赋值。
  174. $ar_room = &$arr[key($arr)];
  175. #第一容器不是数组进去转呀
  176. if (!is_array($ar_room)) {
  177. #转为成数组
  178. $ar_room = array($ar_room);
  179. }
  180. #指针下移
  181. next($arr);
  182. #遍历
  183. while (list($k, $v) = each($arr)) {
  184. #是数组就递归深挖,不是就转成数组
  185. $v = is_array($v) ? call_user_func(__FUNCTION__, $v) : array($v);
  186. #递归合并
  187. $ar_room = array_merge_recursive($ar_room, $v);
  188. #释放当前下标的数组元素
  189. unset($arr[$k]);
  190. }
  191. return $ar_room;
  192. }
  193. /**
  194. * 获取客户端IP地址
  195. * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字
  196. * @param boolean $adv 是否进行高级模式获取(有可能被伪装)
  197. * @return mixed
  198. */
  199. function ip($type = 0,$adv=false) {
  200. $type = $type ? 1 : 0;
  201. static $ip = NULL;
  202. if ($ip !== NULL) return $ip[$type];
  203. if($adv){
  204. if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  205. $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
  206. $pos = array_search('unknown',$arr);
  207. if(false !== $pos) unset($arr[$pos]);
  208. $ip = trim($arr[0]);
  209. }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
  210. $ip = $_SERVER['HTTP_CLIENT_IP'];
  211. }elseif (isset($_SERVER['REMOTE_ADDR'])) {
  212. $ip = $_SERVER['REMOTE_ADDR'];
  213. }
  214. }elseif (isset($_SERVER['REMOTE_ADDR'])) {
  215. $ip = $_SERVER['REMOTE_ADDR'];
  216. }
  217. // IP地址合法验证
  218. $long = sprintf("%u",ip2long($ip));
  219. $ip = $long ? array($ip, $long) : array('0.0.0.0', 0);
  220. return $ip[$type];
  221. }
  222. //用php从身份证中提取生日,包括15位和18位身份证
  223. function getIDCardInfo($IDCard){
  224. $result['error']=0;//0:未知错误,1:身份证格式错误,2:无错误
  225. $result['flag']='';//0标示成年,1标示未成年
  226. $result['tdate']='';//生日,格式如:2012-11-15
  227. if(!eregi("^[1-9]([0-9a-zA-Z]{17}|[0-9a-zA-Z]{14})$",$IDCard)){
  228. $result['error']=1;
  229. return $result;
  230. }else{
  231. if(strlen($IDCard)==18){
  232. $tyear=intval(substr($IDCard,6,4));
  233. $tmonth=intval(substr($IDCard,10,2));
  234. $tday=intval(substr($IDCard,12,2));
  235. if($tyear>date("Y")||$tyear<(date("Y")-100)){
  236. $flag=0;
  237. }elseif($tmonth<0||$tmonth>12){
  238. $flag=0;
  239. }elseif($tday<0||$tday>31){
  240. $flag=0;
  241. }else{
  242. $tdate=$tyear."-".$tmonth."-".$tday."";
  243. if((time()-mktime(0,0,0,$tmonth,$tday,$tyear))>18*365*24*60*60){
  244. $flag=0;
  245. }else{
  246. $flag=1;
  247. }
  248. }
  249. }elseif(strlen($IDCard)==15){
  250. $tyear=intval("19".substr($IDCard,6,2));
  251. $tmonth=intval(substr($IDCard,8,2));
  252. $tday=intval(substr($IDCard,10,2));
  253. if($tyear>date("Y")||$tyear<(date("Y")-100)){
  254. $flag=0;
  255. }elseif($tmonth<0||$tmonth>12){
  256. $flag=0;
  257. }elseif($tday<0||$tday>31){
  258. $flag=0;
  259. }else{
  260. $tdate=$tyear."-".$tmonth."-".$tday."";
  261. if((time()-mktime(0,0,0,$tmonth,$tday,$tyear))>18*365*24*60*60){
  262. $flag=0;
  263. }else{
  264. $flag=1;
  265. }
  266. }
  267. }
  268. }
  269. $result['error']=2;//0:未知错误,1:身份证格式错误,2:无错误
  270. $result['isAdult']=$flag;//0标示成年,1标示未成年
  271. $result['birthday']=$tdate;//生日日期
  272. return $result;
  273. }
  274. /**
  275. * 发送HTTP状态
  276. * @param integer $code 状态码
  277. * @return void
  278. */
  279. function send_http_status($code) {
  280. static $_status = array(
  281. // Informational 1xx
  282. 100 => 'Continue',
  283. 101 => 'Switching Protocols',
  284. // Success 2xx
  285. 200 => 'OK',
  286. 201 => 'Created',
  287. 202 => 'Accepted',
  288. 203 => 'Non-Authoritative Information',
  289. 204 => 'No Content',
  290. 205 => 'Reset Content',
  291. 206 => 'Partial Content',
  292. // Redirection 3xx
  293. 300 => 'Multiple Choices',
  294. 301 => 'Moved Permanently',
  295. 302 => 'Moved Temporarily ', // 1.1
  296. 303 => 'See Other',
  297. 304 => 'Not Modified',
  298. 305 => 'Use Proxy',
  299. // 306 is deprecated but reserved
  300. 307 => 'Temporary Redirect',
  301. // Client Error 4xx
  302. 400 => 'Bad Request',
  303. 401 => 'Unauthorized',
  304. 402 => 'Payment Required',
  305. 403 => 'Forbidden',
  306. 404 => 'Not Found',
  307. 405 => 'Method Not Allowed',
  308. 406 => 'Not Acceptable',
  309. 407 => 'Proxy Authentication Required',
  310. 408 => 'Request Timeout',
  311. 409 => 'Conflict',
  312. 410 => 'Gone',
  313. 411 => 'Length Required',
  314. 412 => 'Precondition Failed',
  315. 413 => 'Request Entity Too Large',
  316. 414 => 'Request-URI Too Long',
  317. 415 => 'Unsupported Media Type',
  318. 416 => 'Requested Range Not Satisfiable',
  319. 417 => 'Expectation Failed',
  320. // Server Error 5xx
  321. 500 => 'Internal Server Error',
  322. 501 => 'Not Implemented',
  323. 502 => 'Bad Gateway',
  324. 503 => 'Service Unavailable',
  325. 504 => 'Gateway Timeout',
  326. 505 => 'HTTP Version Not Supported',
  327. 509 => 'Bandwidth Limit Exceeded'
  328. );
  329. if(isset($_status[$code])) {
  330. header('HTTP/1.1 '.$code.' '.$_status[$code]);
  331. // 确保FastCGI模式下正常
  332. header('Status:'.$code.' '.$_status[$code]);
  333. }
  334. }
  335. function think_filter(&$value){
  336. // TODO 其他安全过滤
  337. // 过滤查询特殊字符
  338. if(preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i',$value)){
  339. $value .= ' ';
  340. }
  341. }
  342. // 不区分大小写的in_array实现
  343. function in_array_case($value,$array){
  344. return in_array(strtolower($value),array_map('strtolower',$array));
  345. }
  346. /**
  347. * 对用户的密码进行加密
  348. * @param $password
  349. * @param $encrypt //传入加密串,在修改密码时做认证
  350. * @return array/password
  351. */
  352. function password($password, $encrypt='') {
  353. $pwd = array();
  354. $pwd['encrypt'] = $encrypt ? $encrypt : getRandChar();
  355. $pwd['password'] = md5(md5(trim($password)).$pwd['encrypt']);
  356. return $encrypt ? $pwd['password'] : $pwd;
  357. }
  358. /**
  359. * 生成随机字符串
  360. * @param string $lenth 长度
  361. * @return string 字符串
  362. */
  363. function randomstr($lenth = 6) {
  364. return random($lenth, '123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ');
  365. }
  366. /**
  367. * 生成随机数字串
  368. * @param string $lenth 长度
  369. * @return string 字符串
  370. */
  371. function randomnum() {
  372. $str = null;
  373. $strPol = "0123456789";
  374. $max = strlen($strPol)-1;
  375. for($i=0;$i<6;$i++){
  376. $str.=$strPol[rand(0,$max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
  377. }
  378. return $str;
  379. }
  380. function getRandChar($length=6){
  381. $str = null;
  382. $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
  383. $max = strlen($strPol)-1;
  384. for($i=0;$i<$length;$i++){
  385. $str.=$strPol[rand(0,$max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
  386. }
  387. return $str;
  388. }
  389. function post_check($post)
  390. {
  391. if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开
  392. {
  393. $post = addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤
  394. }
  395. $post = str_replace("_", "\_", $post); // 把 '_'过滤掉
  396. $post = str_replace("%", "\%", $post); // 把' % '过滤掉
  397. $post = nl2br($post); // 回车转换
  398. $post= htmlspecialchars($post); // html标记转换
  399. return $post;
  400. }
  401. /**
  402. * 简单对称加密算法之加密
  403. * @param String $string 需要加密的字串
  404. * @param String $skey 加密EKY
  405. * @author Anyon Zou <zoujingli@qq.com>
  406. * @date 2013-08-13 19:30
  407. * @update 2014-10-10 10:10
  408. * @return String
  409. */
  410. function encode($string = '', $skey = 'hongzeit') {
  411. $strArr = str_split(base64_encode($string));
  412. $strCount = count($strArr);
  413. foreach (str_split($skey) as $key => $value)
  414. $key < $strCount && $strArr[$key].=$value;
  415. return str_replace(array('=', '+', '/'), array('O0O0O', 'o000o', 'oo00o'), join('', $strArr));
  416. }
  417. /**
  418. * 简单对称加密算法之解密
  419. * @param String $string 需要解密的字串
  420. * @param String $skey 解密KEY
  421. * @author Anyon Zou <zoujingli@qq.com>
  422. * @date 2013-08-13 19:30
  423. * @update 2014-10-10 10:10
  424. * @return String
  425. */
  426. function decode($string = '', $skey = 'hongzeit') {
  427. $strArr = str_split(str_replace(array('O0O0O', 'o000o', 'oo00o'), array('=', '+', '/'), $string), 2);
  428. $strCount = count($strArr);
  429. foreach (str_split($skey) as $key => $value)
  430. $key <= $strCount && isset($strArr[$key]) && $strArr[$key][1] === $value && $strArr[$key] = $strArr[$key][0];
  431. return base64_decode(join('', $strArr));
  432. }
  433. //$str = 'abcdef';
  434. //$key = 'www.helloweba.com';
  435. //echo authcode($str,'ENCODE',$key,0); //加密
  436. //$str = '56f4yER1DI2WTzWMqsfPpS9hwyoJnFP2MpC8SOhRrxO7BOk';
  437. //echo authcode($str,'DECODE',$key,0); //解密
  438. function authcode($string, $operation = 'D', $key = 'hongzeit', $expiry = 0) {
  439. // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
  440. $ckey_length = 4;
  441. // 密匙
  442. $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
  443. // 密匙a会参与加解密
  444. $keya = md5(substr($key, 0, 16));
  445. // 密匙b会用来做数据完整性验证
  446. $keyb = md5(substr($key, 16, 16));
  447. // 密匙c用于变化生成的密文
  448. $keyc = $ckey_length ? ($operation == 'D' ? substr($string, 0, $ckey_length):
  449. substr(md5(microtime()), -$ckey_length)) : '';
  450. // 参与运算的密匙
  451. $cryptkey = $keya.md5($keya.$keyc);
  452. $key_length = strlen($cryptkey);
  453. // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),
  454. //解密时会通过这个密匙验证数据完整性
  455. // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
  456. $string = $operation == 'D' ? base64_decode(substr($string, $ckey_length)) :
  457. sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
  458. $string_length = strlen($string);
  459. $result = '';
  460. $box = range(0, 255);
  461. $rndkey = array();
  462. // 产生密匙簿
  463. for($i = 0; $i <= 255; $i++) {
  464. $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  465. }
  466. // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
  467. for($j = $i = 0; $i < 256; $i++) {
  468. $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  469. $tmp = $box[$i];
  470. $box[$i] = $box[$j];
  471. $box[$j] = $tmp;
  472. }
  473. // 核心加解密部分
  474. for($a = $j = $i = 0; $i < $string_length; $i++) {
  475. $a = ($a + 1) % 256;
  476. $j = ($j + $box[$a]) % 256;
  477. $tmp = $box[$a];
  478. $box[$a] = $box[$j];
  479. $box[$j] = $tmp;
  480. // 从密匙簿得出密匙进行异或,再转成字符
  481. $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  482. }
  483. if($operation == 'D') {
  484. // 验证数据有效性,请看未加密明文的格式
  485. if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&
  486. substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
  487. return substr($result, 26);
  488. } else {
  489. return '';
  490. }
  491. } else {
  492. // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
  493. // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
  494. return $keyc.str_replace('=', '', base64_encode($result));
  495. }
  496. }
  497. //加解密函数encrypt()
  498. //$str = 'abc';
  499. //$key = 'www.helloweba.com';
  500. //$token = encrypt($str, 'E', $key);
  501. //echo '加密:'.encrypt($str, 'E', $key);
  502. //echo '解密:'.encrypt($str, 'D', $key);
  503. function encrypt($string,$operation,$key='hongzeit'){
  504. $key=md5($key);
  505. $key_length=strlen($key);
  506. $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string;
  507. $string_length=strlen($string);
  508. $rndkey=$box=array();
  509. $result='';
  510. for($i=0;$i<=255;$i++){
  511. $rndkey[$i]=ord($key[$i%$key_length]);
  512. $box[$i]=$i;
  513. }
  514. for($j=$i=0;$i<256;$i++){
  515. $j=($j+$box[$i]+$rndkey[$i])%256;
  516. $tmp=$box[$i];
  517. $box[$i]=$box[$j];
  518. $box[$j]=$tmp;
  519. }
  520. for($a=$j=$i=0;$i<$string_length;$i++){
  521. $a=($a+1)%256;
  522. $j=($j+$box[$a])%256;
  523. $tmp=$box[$a];
  524. $box[$a]=$box[$j];
  525. $box[$j]=$tmp;
  526. $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256]));
  527. }
  528. if($operation=='D'){
  529. if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){
  530. return substr($result,8);
  531. }else{
  532. return'';
  533. }
  534. }else{
  535. return str_replace('=','',base64_encode($result));
  536. }
  537. }
  538. /**
  539. * 发送get请求
  540. * @param string $url 请求地址
  541. * @param array $post_data post键值对数据
  542. * @return string
  543. */
  544. function send_get($url) {
  545. $ch = curl_init();
  546. curl_setopt($ch, CURLOPT_URL, $url);
  547. curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
  548. $result = curl_exec($ch);
  549. return $result;
  550. }
  551. /**
  552. * 发送post请求
  553. * @param string $url 请求地址
  554. * @param array $post_data post键值对数据
  555. * @return string
  556. */
  557. function send_post($url, $post_data) {
  558. $postdata = http_build_query($post_data);
  559. $options = array(
  560. 'http' => array(
  561. 'method' => 'POST',
  562. 'header' => 'Content-type:text/xml',
  563. 'content' => $postdata,
  564. 'timeout' => 15 * 60 // 超时时间(单位:s)
  565. )
  566. );
  567. $context = stream_context_create($options);
  568. $result = file_get_contents($url, false, $context);
  569. return $result;
  570. }
  571. /**
  572. * php异步请求
  573. * $args array[
  574. * "host":主机
  575. * "url":地址
  576. * "method":方法
  577. * "data":数据
  578. * ]
  579. */
  580. function asyn_request($args) {
  581. $host = $args["host"] ? $args["host"] : "localhost";//主机
  582. $method = $args["method"] == "POST" ? "POST" : "GET";//方法
  583. $url = $args["url"] ? $args["url"] : "http://".$host ;//地址
  584. $data = is_array($args["data"]) ? $args["data"] : array();//请求参数
  585. $fp = @fsockopen($host,80,$errno,$errstr,30);
  586. //错误
  587. if(!$fp){echo"$errstr ($errno)<br/>\n";exit;}
  588. $qstr = http_build_query($data);//请求参数
  589. $params.= $method == "GET" ? "GET {$url}?{$qstr} HTTP/1.1\r\n" : "POST {$url} HTTP/1.1\r\n";
  590. $params.= "Host: ".$host."\r\n";
  591. $params.= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5\r\n";
  592. $params.= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
  593. $params.= "Accept-Language: zh-cn,zh;q=0.5\r\n";
  594. $params.= "Accept-Encoding: gzip,deflate\r\n";
  595. $params.= "Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7\r\n";
  596. $params.= "Keep-Alive: 300\r\n";
  597. $params.= "Connection: keep-alive\r\n";
  598. $params.= "Content-Type: application/x-www-form-urlencoded\r\n";
  599. $params.= "Content-Length: ".strlen($qstr)."\r\n\r\n";
  600. $params.= $method == "GET" ? null :$qstr;
  601. //file_put_contents("C:\\http.txt",$params);
  602. fwrite($fp, $params);
  603. fclose($fp);
  604. /* $args["host"] = "localhost";//主机
  605. $args["url"] = "http://localhost/test/socket/doing.php";//异步执行的脚本
  606. $args["method"] = "POST";//请求方式
  607. $args["data"] = array("a"=>"中","b"=>"国");//参数
  608. asyn_request($args);*/
  609. }
  610. //发送XML返回数据
  611. function sendDataByCurlJosn($url,$data){
  612. $header[] = "Content-type: text/xml"; //定义content-type为xml,注意是数组
  613. $ch = curl_init ($url);
  614. curl_setopt($ch, CURLOPT_URL, $url);
  615. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  616. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  617. curl_setopt($ch, CURLOPT_HEADER, 0);
  618. curl_setopt($ch,CURLOPT_TIMEOUT,60); //定义超时3秒钟
  619. curl_setopt($ch, CURLOPT_POST, 1);
  620. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  621. $response = curl_exec($ch);
  622. if(curl_errno($ch)){
  623. Log::cur_err(curl_error($ch));
  624. }
  625. curl_close($ch);
  626. Log::posthis($url.$data);
  627. return $response;
  628. }
  629. //发送XML返回数据
  630. function sendDataByCurl($url,$data){
  631. $header[] = "Content-type: text/xml"; //定义content-type为xml,注意是数组
  632. $ch = curl_init ($url);
  633. curl_setopt($ch, CURLOPT_URL, $url);
  634. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  635. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  636. curl_setopt($ch, CURLOPT_HEADER, 0);
  637. curl_setopt($ch,CURLOPT_TIMEOUT,60); //定义超时3秒钟
  638. curl_setopt($ch, CURLOPT_POST, 1);
  639. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  640. $response = curl_exec($ch);
  641. if(curl_errno($ch)){
  642. Log::cur_err(curl_error($ch));
  643. }
  644. curl_close($ch);
  645. Log::posthis($url.$data);
  646. try{
  647. Log::posthis($response);
  648. //$response = mb_convert_encoding($response, 'UTF-8', 'GB2312');
  649. //$txt = mb_convert_encoding($txt, 'UTF-8', 'GBK');
  650. //print_r($response);
  651. $response = str_replace("\r\n","",$response);
  652. $response = str_replace("\n","",$response);
  653. $response = str_replace("\t","",$response);
  654. $xml = simplexml_load_string($response);
  655. header("Content-Type: text/html; charset=UTF-8");
  656. if($xml) {
  657. Log::gethis($response);
  658. } else {
  659. Log::xmlerr($response);
  660. }
  661. } catch(exception $e){
  662. Log::xmltc($e);
  663. }
  664. return $xml;
  665. }
  666. //发送XML返回数据
  667. function sendDataByCurlCode($url,$data){
  668. $header[] = "Content-type: text/xml"; //定义content-type为xml,注意是数组
  669. $ch = curl_init ($url);
  670. curl_setopt($ch, CURLOPT_URL, $url);
  671. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  672. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  673. curl_setopt($ch, CURLOPT_HEADER, 0);
  674. curl_setopt($ch,CURLOPT_TIMEOUT,60); //定义超时3秒钟
  675. curl_setopt($ch, CURLOPT_POST, 1);
  676. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  677. $response = curl_exec($ch);
  678. if(curl_errno($ch)){
  679. Log::cur_err(curl_error($ch));
  680. }
  681. curl_close($ch);
  682. Log::posthis($url.$data);
  683. try{
  684. $response = mb_convert_encoding($response, 'UTF-8', 'GB2312');
  685. //$response = mb_convert_encoding($response, 'UTF-8', 'GBK');
  686. $response = new SimpleXMLElement($response);
  687. //加入反馈内容
  688. $property = $response->result->attributes()->property;
  689. $response->addChild("property",$property);
  690. //$xml = simplexml_load_string($response);
  691. header("Content-Type: text/html; charset=UTF-8");
  692. if($response) {
  693. Log::gethis($response);
  694. } else {
  695. Log::xmlerr($response);
  696. }
  697. } catch(exception $e){
  698. Log::xmltc($e);
  699. }
  700. return $response;
  701. }
  702. /**
  703. * 把对象转换成数组
  704. * @param object $object 要转换的对象
  705. * @return array
  706. */
  707. function objectToArray($object) {
  708. if( count($object)==0 ) return trim((string)$object);
  709. $result = array();
  710. $object = is_object($object) ? get_object_vars($object) : $object;
  711. foreach ($object as $key => $val) {
  712. $val = (is_object($val) || is_array($val)) ? objectToArray($val) : $val;
  713. $result[$key] = $val;
  714. }
  715. return $result;
  716. }
  717. function ToHtml($xml)
  718. {
  719. $xml = str_replace("&","&amp;",$xml);
  720. $xml = str_replace("<","&lt;",$xml);
  721. $xml = str_replace(">","&gt;",$xml);
  722. $xml = str_replace("\r\n","<br />",$xml);
  723. $xml = str_replace("\n","<br />",$xml);
  724. $xml = str_replace("\t"," ",$xml);
  725. $xml = str_replace("\"","&quot;",$xml);
  726. $xml = str_replace('{}','""',$xml);
  727. return $xml;
  728. }
  729. function SoapToXml1($xml)
  730. {
  731. //api测试先关闭
  732. $startStr=strrpos($xml,"<![CDATA[");
  733. $endStr=strpos($xml,"]]>");
  734. $xml=substr($xml,$startStr,$endStr-$startStr);
  735. $xml = str_replace("<![CDATA[>","",$xml);
  736. $xml = str_replace("<![CDATA[","",$xml);
  737. $xml = str_replace("]]]]>","",$xml);
  738. $xml = str_replace("]]>","",$xml);
  739. $xml = str_replace("<ILLEGAL VALUE>","",$xml);
  740. return $xml;
  741. }
  742. function SoapToXml2($xml)
  743. {
  744. //api测试先关闭
  745. $xml = str_replace("<![CDATA[< 2.00E+1 ]]]]><![CDATA[>","",$xml);
  746. $startStr=strrpos($xml,"<![CDATA[");
  747. $endStr=strpos($xml,"]]>");
  748. $xml=substr($xml,$startStr,$endStr-$startStr);
  749. $xml = str_replace("<![CDATA[","",$xml);
  750. $xml = str_replace("<![CDATA[>","",$xml);
  751. $xml = str_replace("]]]]>","",$xml);
  752. $xml = str_replace("]]>","",$xml);
  753. $xml = str_replace("<ILLEGAL VALUE>","",$xml);
  754. return $xml;
  755. }
  756. function SoapToXml($xml,$funName)
  757. {
  758. //api测试先关闭
  759. $startStr=strrpos($xml,"<".$funName."Result>");
  760. $endStr=strpos($xml,"</".$funName."Result>");
  761. $xml=substr($xml,$startStr,$endStr-$startStr);
  762. $xml = str_replace("<".$funName."Result>","",$xml);
  763. $xml = str_replace("<![CDATA[","",$xml);
  764. $xml = str_replace("]]>","",$xml);
  765. $xml = str_replace("]]>","",$xml);
  766. $xml = str_replace("<ILLEGAL VALUE>","",$xml);
  767. return $xml;
  768. }
  769. }
  770. ?>