You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

343 lines
11 KiB

  1. <?php
  2. /**
  3. * 全局通用方法集合
  4. * ============================================================================
  5. * * 版权所有 蜘蛛出行 * *
  6. * 网站地址: http://www.zhizhuchuxing.com
  7. * ----------------------------------------------------------------------------
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
  9. * 使用;不允许对程序代码以任何形式任何目的的再发布。
  10. * ============================================================================
  11. * Author By: 倪宗锋
  12. * PhpStorm Util.php
  13. * Create By 2017/2/22 19:44 $
  14. */
  15. namespace addons\nzf;
  16. class Util
  17. {
  18. /**
  19. * Function Description:返回成功Json数据到
  20. * Function Name: returnSu
  21. * @param string $msg 提示信息
  22. * @param string $url 跳转地址
  23. * @param string|array $data 需要传递的数据
  24. * @param string $code 错误码
  25. *
  26. * @return string
  27. *
  28. * @author 倪宗锋
  29. */
  30. public static function returnJsSu($msg = '', $data = '', $url = '', $code = '')
  31. {
  32. $return = array();
  33. $return['flag'] = true;
  34. $return['msg'] = $msg;
  35. $return['url'] = $url;
  36. $return['code'] = $code;
  37. $return['data'] = $data;
  38. return json_encode($return);
  39. }
  40. /**
  41. * Function Description:返回成功Json数据
  42. * Function Name: returnEr
  43. * @param string $msg 提示信息
  44. * @param string $url 跳转地址
  45. * @param string|array $data 需要传递的数据
  46. * @param string $code 错误码
  47. *
  48. * @return string
  49. *
  50. * @author 倪宗锋
  51. */
  52. public static function returnJsEr($msg = '', $data = '', $url = '', $code = '')
  53. {
  54. $return = array();
  55. $return['flag'] = false;
  56. $return['msg'] = $msg;
  57. $return['url'] = $url;
  58. $return['code'] = $code;
  59. $return['data'] = $data;
  60. return json_encode($return);
  61. }
  62. /**
  63. * Function Description:返回成功数组数据
  64. * Function Name: returnArrSu
  65. * @param string $msg 提示信息
  66. * @param string $url 跳转地址
  67. * @param string|array $data 需要传递的数据
  68. * @param string $code 错误码
  69. *
  70. * @return array
  71. *
  72. * @author 倪宗锋
  73. */
  74. public static function returnArrSu($msg = '', $data = '', $url = '', $code = '')
  75. {
  76. $return = array();
  77. $return['flag'] = true;
  78. $return['msg'] = $msg;
  79. $return['url'] = $url;
  80. $return['code'] = $code;
  81. $return['data'] = $data;
  82. return $return;
  83. }
  84. /**
  85. * Function Description:返回错误数组数据
  86. * Function Name: returnArrEr
  87. * @param string $msg 提示信息
  88. * @param string $url 跳转地址
  89. * @param string|array $data 需要传递的数据
  90. * @param string $code 错误码
  91. *
  92. * @return array
  93. *
  94. * @author 倪宗锋
  95. */
  96. public static function returnArrEr($msg = '', $data = '', $url = '', $code = '')
  97. {
  98. $return = array();
  99. $return['flag'] = false;
  100. $return['msg'] = $msg;
  101. $return['url'] = $url;
  102. $return['code'] = $code;
  103. $return['data'] = $data;
  104. return $return;
  105. }
  106. /**
  107. * Function Description:json转换为xml
  108. * Function Name: jsonToXml
  109. * @param $json
  110. *
  111. * @return bool|string
  112. *
  113. * @author 倪宗锋
  114. */
  115. public static function jsonToXml($json)
  116. {
  117. if (empty($json)) {
  118. return false;
  119. }
  120. $array = json_decode($json);
  121. $xml = '';
  122. $xml .= '<?xml version="1.0" encoding="UTF-8"?>' . self::arraysToXml(['response' => $array]);
  123. return $xml;
  124. }
  125. /**
  126. * Function Description:数组转换成xml
  127. * Function Name: arrayToXml
  128. * @param $array
  129. * @param $key
  130. * @return string
  131. *
  132. * @author 倪宗锋
  133. */
  134. public static function arraysToXml($array, $key = '')
  135. {
  136. $string = '';
  137. if (count($array) == 0) {
  138. return '';
  139. }
  140. foreach ($array as $k => $v) {
  141. if (is_array($v) && isset($v['0'])) {
  142. $string .= self::arraysToXml($v, $k);//是数组或者对像就的递归调用
  143. } else {
  144. if ($key != '') {
  145. $k = $key;
  146. }
  147. $string .= '<' . $k . '>';
  148. if (is_array($v) || is_object($v)) {//判断是否是数组,或者,对像
  149. $string .= self::arraysToXml($v);//是数组或者对像就的递归调用
  150. } elseif (is_numeric($v)) {
  151. $string .= $v;
  152. } elseif ($v != '') {
  153. $string .= '<![CDATA[' . $v . ']]>';
  154. } else {
  155. $string .= '';
  156. }
  157. $string .= '</' . $k . '>';
  158. }
  159. }
  160. return $string;
  161. }
  162. /**
  163. * Function Description:xml转换为json
  164. * Function Name: xml_to_json
  165. * @param $source
  166. *
  167. * @return string
  168. *
  169. * @author 倪宗锋
  170. */
  171. public static function xmlToJson($source)
  172. {
  173. if (is_file($source)) { //传的是文件,还是xml的string的判断
  174. $xml_array = simplexml_load_file($source);
  175. } else {
  176. $xml_array = simplexml_load_string(trim($source));
  177. }
  178. $json = json_encode($xml_array, true);
  179. return $json;
  180. }
  181. /**
  182. * Function Description:xml转换成数组
  183. * Function Name: xmlToArray
  184. * @param $source
  185. *
  186. * @return mixed
  187. *
  188. * @author 倪宗锋
  189. */
  190. public static function xmlToArray($source)
  191. {
  192. libxml_disable_entity_loader(true);
  193. $getResult = json_decode(json_encode(simplexml_load_string(trim($source), 'SimpleXMLElement', LIBXML_NOCDATA)), true);
  194. return $getResult;
  195. }
  196. /** Function Description:加密解密函数
  197. * Function Name: authCode
  198. * @param $string
  199. * @param string $operation
  200. * @param int $expiry
  201. * @return string|array
  202. * @author 倪宗锋
  203. */
  204. static function authCode($string, $operation = 'DECODE', $expiry = 0)
  205. {
  206. $key = 'udM5A8S50eg8veH15dd0m601de7073N8Bcn7d1I8Res7C7o7z274D6y342I4C7t7';
  207. $ckey_length = 4; // 随机密钥长度 取值 0-32;
  208. // 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。
  209. // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方
  210. // 当此值为 0 时,则不产生随机密钥
  211. $key = md5($key);
  212. $keya = md5(substr($key, 0, 16));
  213. $keyb = md5(substr($key, 16, 16));
  214. $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';
  215. $cryptkey = $keya . md5($keya . $keyc);
  216. $key_length = strlen($cryptkey);
  217. $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
  218. $string_length = strlen($string);
  219. $result = '';
  220. $box = range(0, 255);
  221. $rndkey = array();
  222. for ($i = 0; $i <= 255; $i++) {
  223. $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  224. }
  225. for ($j = $i = 0; $i < 256; $i++) {
  226. $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  227. $tmp = $box[$i];
  228. $box[$i] = $box[$j];
  229. $box[$j] = $tmp;
  230. }
  231. for ($a = $j = $i = 0; $i < $string_length; $i++) {
  232. $a = ($a + 1) % 256;
  233. $j = ($j + $box[$a]) % 256;
  234. $tmp = $box[$a];
  235. $box[$a] = $box[$j];
  236. $box[$j] = $tmp;
  237. $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  238. }
  239. if ($operation == 'DECODE') {
  240. if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
  241. return substr($result, 26);
  242. } else {
  243. return '';
  244. }
  245. } else {
  246. return $keyc . str_replace('=', '', base64_encode($result));
  247. }
  248. }
  249. /**
  250. * 获取客户端IP地址
  251. * @return mixed
  252. */
  253. public static function getclientip()
  254. {
  255. static $realip = NULL;
  256. if ($realip !== NULL) {
  257. return $realip;
  258. }
  259. if (isset($_SERVER)) {
  260. if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { //但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取。
  261. $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
  262. /* 取X-Forwarded-For中第一个非unknown的有效IP字符串 */
  263. foreach ($arr AS $ip) {
  264. $ip = trim($ip);
  265. if ($ip != 'unknown') {
  266. $realip = $ip;
  267. break;
  268. }
  269. }
  270. } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {//HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是"超级匿名代理",则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。
  271. $realip = $_SERVER['HTTP_CLIENT_IP'];
  272. } else {
  273. if (isset($_SERVER['REMOTE_ADDR'])) { //正在浏览当前页面用户的 IP 地址
  274. $realip = $_SERVER['REMOTE_ADDR'];
  275. } else {
  276. $realip = '0.0.0.0';
  277. }
  278. }
  279. } else {
  280. //getenv环境变量的值
  281. if (getenv('HTTP_X_FORWARDED_FOR')) {//但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址
  282. $realip = getenv('HTTP_X_FORWARDED_FOR');
  283. } elseif (getenv('HTTP_CLIENT_IP')) { //获取客户端IP
  284. $realip = getenv('HTTP_CLIENT_IP');
  285. } else {
  286. $realip = getenv('REMOTE_ADDR'); //正在浏览当前页面用户的 IP 地址
  287. }
  288. }
  289. preg_match("/[\d\.]{7,15}/", $realip, $onlineip);
  290. $realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';
  291. return $realip;
  292. }
  293. /**
  294. * Des:获取浏览器机器类型
  295. * Name: get_device_type
  296. * @return string
  297. * @author 倪宗锋
  298. */
  299. public static function get_device_type()
  300. {
  301. //全部变成小写字母
  302. $agent = strtolower($_SERVER['HTTP_USER_AGENT']);
  303. $type = 'other';
  304. //分别进行判断
  305. if (strpos($agent, 'iphone') || strpos($agent, 'ipad')) {
  306. $type = 'ios';
  307. }
  308. if (strpos($agent, 'android')) {
  309. $type = 'android';
  310. }
  311. return $type;
  312. }
  313. }