Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 

545 строки
17 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 common\util;
  16. use yii\helpers\ArrayHelper;
  17. class Util
  18. {
  19. /**微信配置参数**/
  20. private static $weChatConfig = null;
  21. private static $siteConfig = null;
  22. /**
  23. * Des:获取配置参数
  24. * Name: getSiteConfig
  25. * @return null
  26. * @author 倪宗锋
  27. */
  28. public static function getSiteConfig()
  29. {
  30. if (static::$siteConfig == null) {
  31. static::$siteConfig = ArrayHelper::merge(
  32. require ROOT_PATH . '/common/config/siteConfig/' . YII_ENV . '/siteConfig.php',
  33. require ROOT_PATH . '/common/config/siteConfig.php'
  34. );
  35. }
  36. return static::$siteConfig;
  37. }
  38. /**
  39. * Des:设置siteConfig
  40. * Name: setSiteConfig
  41. * @param $array
  42. * @author 倪宗锋
  43. */
  44. public static function setSiteConfig($array)
  45. {
  46. $siteConfig = static::getSiteConfig();
  47. static::$siteConfig = ArrayHelper::merge(
  48. $siteConfig,
  49. $array
  50. );
  51. }
  52. /**
  53. * Function Description:返回成功Json数据到
  54. * Function Name: returnSu
  55. * @param string $msg 提示信息
  56. * @param string $url 跳转地址
  57. * @param string|array $data 需要传递的数据
  58. * @param string $code 错误码
  59. *
  60. * @return string
  61. *
  62. * @author 倪宗锋
  63. */
  64. public static function returnJsSu($msg = '', $data = '', $url = '', $code = '')
  65. {
  66. $return = array();
  67. $return['flag'] = true;
  68. $return['msg'] = $msg;
  69. $return['url'] = $url;
  70. $return['code'] = $code;
  71. $return['data'] = $data;
  72. return json_encode($return);
  73. }
  74. /**
  75. * Function Description:返回成功Json数据
  76. * Function Name: returnEr
  77. * @param string $msg 提示信息
  78. * @param string $url 跳转地址
  79. * @param string|array $data 需要传递的数据
  80. * @param string $code 错误码
  81. *
  82. * @return string
  83. *
  84. * @author 倪宗锋
  85. */
  86. public static function returnJsEr($msg = '', $data = '', $url = '', $code = '')
  87. {
  88. $return = array();
  89. $return['flag'] = false;
  90. $return['msg'] = $msg;
  91. $return['url'] = $url;
  92. $return['code'] = $code;
  93. $return['data'] = $data;
  94. return json_encode($return);
  95. }
  96. /**
  97. * Function Description:返回成功数组数据
  98. * Function Name: returnArrSu
  99. * @param string $msg 提示信息
  100. * @param string $url 跳转地址
  101. * @param string|array $data 需要传递的数据
  102. * @param string $code 错误码
  103. *
  104. * @return array
  105. *
  106. * @author 倪宗锋
  107. */
  108. public static function returnArrSu($msg = '', $data = '', $url = '', $code = '')
  109. {
  110. $return = array();
  111. $return['flag'] = true;
  112. $return['msg'] = $msg;
  113. $return['url'] = $url;
  114. $return['code'] = $code;
  115. $return['data'] = $data;
  116. return $return;
  117. }
  118. /**
  119. * Function Description:返回错误数组数据
  120. * Function Name: returnArrEr
  121. * @param string $msg 提示信息
  122. * @param string $url 跳转地址
  123. * @param string|array $data 需要传递的数据
  124. * @param string $code 错误码
  125. *
  126. * @return array
  127. *
  128. * @author 倪宗锋
  129. */
  130. public static function returnArrEr($msg = '', $data = '', $url = '', $code = '')
  131. {
  132. $return = array();
  133. $return['flag'] = false;
  134. $return['msg'] = $msg;
  135. $return['url'] = $url;
  136. $return['code'] = $code;
  137. $return['data'] = $data;
  138. return $return;
  139. }
  140. /**
  141. * Des:获取微信配置文件
  142. * Name: getWeChatConfig
  143. * @return null
  144. * @author 倪宗锋
  145. */
  146. public static function getWeChatConfig()
  147. {
  148. if (static::$weChatConfig == null) {
  149. static::$weChatConfig = require ROOT_PATH . '/common/config/wechatConfig/payConfig.php';
  150. }
  151. return static::$weChatConfig;
  152. }
  153. /**
  154. * Function Description:校验字符串的正则
  155. * Function Name: checkPattern
  156. * @param $type string 已有正则的key
  157. * @param $str string 校验的字符串
  158. * @param string $Regex 校验规则 固若该值不为空 则使用该正则校验 $type失效
  159. *
  160. * @return bool
  161. *
  162. * @author 倪宗锋 2016-11-10
  163. */
  164. public static function checkPattern($type, $str, $Regex = '')
  165. {
  166. if ($Regex == '') {
  167. $pattern = require(ROOT_PATH . '/common/config/checkParams.php');
  168. if (empty($pattern[$type])) {//正则不存在 则验证失败
  169. return false;
  170. }
  171. $Regex = $pattern[$type];
  172. }
  173. if (preg_match($Regex, $str)) {
  174. return true;
  175. } else {
  176. return false;
  177. }
  178. }
  179. /**
  180. * Function Description:json转换为xml
  181. * Function Name: jsonToXml
  182. * @param $json
  183. *
  184. * @return bool|string
  185. *
  186. * @author 倪宗锋
  187. */
  188. public static function jsonToXml($json)
  189. {
  190. if (empty($json)) {
  191. return false;
  192. }
  193. $array = json_decode($json);
  194. $xml = '';
  195. $xml .= self::arrayToXml($array);
  196. return $xml;
  197. }
  198. /**
  199. * Function Description:数组转换xml
  200. * Function Name: change
  201. * @param $array
  202. *
  203. * @return string
  204. *
  205. * @author 倪宗锋
  206. */
  207. public static function arrayToXml($array)
  208. {
  209. $string = '<xml>';
  210. foreach ($array as $k => $v) {
  211. $string .= '<' . $k . '>';
  212. if (is_array($v) || is_object($v)) {//判断是否是数组,或者,对像
  213. $string .= self::arrayToXml($v);//是数组或者对像就的递归调用
  214. } elseif (is_numeric($v)) {
  215. $string .= $v;
  216. } else {
  217. $string .= '<![CDATA[' . $v . ']]>';
  218. }
  219. $string .= '</' . $k . '>';
  220. }
  221. $string .= '</xml>';
  222. return $string;
  223. }
  224. /**
  225. * Function Description:xml转换为json
  226. * Function Name: xml_to_json
  227. * @param $source
  228. *
  229. * @return string
  230. *
  231. * @author 倪宗锋
  232. */
  233. public static function xmlToJson($source)
  234. {
  235. if (is_file($source)) { //传的是文件,还是xml的string的判断
  236. $xml_array = simplexml_load_file($source);
  237. } else {
  238. $xml_array = simplexml_load_string(trim($source));
  239. }
  240. $json = json_encode($xml_array, true);
  241. return $json;
  242. }
  243. /**
  244. * Function Description:xml转换成数组
  245. * Function Name: xmlToArray
  246. * @param $source
  247. *
  248. * @return mixed
  249. *
  250. * @author 倪宗锋
  251. */
  252. public static function xmlToArray($source)
  253. {
  254. libxml_disable_entity_loader(true);
  255. $getResult = json_decode(json_encode(simplexml_load_string(trim($source), 'SimpleXMLElement', LIBXML_NOCDATA)), true);
  256. return $getResult;
  257. }
  258. /** Function Description:加密解密函数
  259. * Function Name: authCode
  260. * @param $string
  261. * @param string $operation
  262. * @param int $expiry
  263. * @return string
  264. * @author 倪宗锋
  265. */
  266. static function authCode($string, $operation = 'DECODE', $expiry = 0)
  267. {
  268. $key = 'udM5A8S50eg8veH15dd0m601de7073N8Bcn7d1I8Res7C7o7z274D6y342I4C7t7';
  269. $ckey_length = 4; // 随机密钥长度 取值 0-32;
  270. // 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。
  271. // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方
  272. // 当此值为 0 时,则不产生随机密钥
  273. $key = md5($key);
  274. $keya = md5(substr($key, 0, 16));
  275. $keyb = md5(substr($key, 16, 16));
  276. $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';
  277. $cryptkey = $keya . md5($keya . $keyc);
  278. $key_length = strlen($cryptkey);
  279. $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
  280. $string_length = strlen($string);
  281. $result = '';
  282. $box = range(0, 255);
  283. $rndkey = array();
  284. for ($i = 0; $i <= 255; $i++) {
  285. $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  286. }
  287. for ($j = $i = 0; $i < 256; $i++) {
  288. $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  289. $tmp = $box[$i];
  290. $box[$i] = $box[$j];
  291. $box[$j] = $tmp;
  292. }
  293. for ($a = $j = $i = 0; $i < $string_length; $i++) {
  294. $a = ($a + 1) % 256;
  295. $j = ($j + $box[$a]) % 256;
  296. $tmp = $box[$a];
  297. $box[$a] = $box[$j];
  298. $box[$j] = $tmp;
  299. $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  300. }
  301. if ($operation == 'DECODE') {
  302. if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
  303. return substr($result, 26);
  304. } else {
  305. return '';
  306. }
  307. } else {
  308. return $keyc . str_replace('=', '', base64_encode($result));
  309. }
  310. }
  311. /**
  312. * Des: 生成二维码
  313. * Name: addQRCode
  314. * @param $qCode string 生成的内容
  315. * @param $QRFile string 二维码图片路径
  316. * @param int $reType 1:返回成功或失败 2 返回图片数据流
  317. * @param bool|false $isCreate 生成的图片是否保留 当$reType=2才会有效
  318. * @param bool $logo 是否添加logo图
  319. * @param string $logoUrl logo图地址
  320. * @return array
  321. * @author 倪宗锋
  322. */
  323. public static function addQRCode($qCode, $QRFile, $reType = 1, $isCreate = false, $logo = false, $logoUrl = '')
  324. {
  325. include ROOT_PATH . '/common/util/phpqrcode/phpqrcode.php';
  326. $value = $qCode;//二维码内容
  327. $errorCorrectionLevel = 'H';//容错级别
  328. $matrixPointSize = 6;//生成图片大小
  329. //生成二维码图片
  330. \QRcode::png($value, $QRFile, $errorCorrectionLevel, $matrixPointSize, 2);
  331. $QR = imagecreatefromstring(file_get_contents($QRFile));
  332. if ($logo !== FALSE && $logoUrl != '') {
  333. $logoUrl = imagecreatefromstring(file_get_contents($logoUrl));
  334. $QR_width = imagesx($QR);//二维码图片宽度
  335. $logo_width = imagesx($logoUrl);//logo图片宽度
  336. $logo_height = imagesy($logoUrl);//logo图片高度
  337. $logo_qr_width = $QR_width / 5;
  338. $scale = $logo_width / $logo_qr_width;
  339. $logo_qr_height = $logo_height / $scale;
  340. $from_width = ($QR_width - $logo_qr_width) / 2;
  341. //重新组合图片并调整大小
  342. imagecopyresampled($QR, $logoUrl, $from_width, $from_width, 0, 0, $logo_qr_width,
  343. $logo_qr_height, $logo_width, $logo_height);
  344. }
  345. //只返回成功失败的话 则图片必须保存
  346. if ($reType == 1) {
  347. @ImagePng($QR, $QRFile);
  348. if (file_exists($QRFile)) {
  349. return Util::returnArrSu();
  350. }
  351. return Util::returnArrEr('图片生成失败!');
  352. } else {
  353. //输出图片
  354. Header("Content-type: image/png");
  355. ImagePng($QR);
  356. if ($isCreate == false) {//不保存图片则删除
  357. @unlink($QRFile);
  358. } else {//保存则需图片再生成一次
  359. @ImagePng($QR, $QRFile);
  360. }
  361. die;
  362. }
  363. }
  364. /**
  365. * Function Description:调用CS接口时的加密规则
  366. * Function Name: authCodeForCs
  367. *
  368. * @return string
  369. *
  370. * @author 娄梦宁
  371. */
  372. public static function authCodeForCs($request_time)
  373. {
  374. $siteConfig = static::getSiteConfig();
  375. $user = $siteConfig['adm_user'];
  376. $user_key = $siteConfig['adm_user_key'];
  377. //加密规则为 request_time(linux时间戳)前三位作为种子,调用srand生成随机数 + user + user_key,进行MD5加密后,换成大写字母
  378. $auth_code = strtoupper(md5(substr($request_time, 0, 3) . "|" . $user . "|" . $user_key . "|" . substr($request_time, strlen($request_time) - 3, 3)));
  379. return $auth_code;
  380. }
  381. /**
  382. * Des:发送验证码
  383. * Name: sendMessage
  384. * @param $msg
  385. * @param $phone
  386. * @return array
  387. * @author 倪宗锋
  388. */
  389. public static function sendMessage($msg, $phone)
  390. {
  391. $siteConfig = static::getSiteConfig();
  392. $send_data = array();
  393. $send_data["account"] = "dh78301";
  394. $send_data["password"] = strtolower(md5("jGRk34B7"));
  395. $send_data["sign"] = "【{$siteConfig['web_name']}】";
  396. $send_data["phones"] = $phone;
  397. $send_data["content"] = $msg;
  398. $url = 'http://www.dh3t.com/json/sms/Submit';
  399. $curlInterface = new CurlInterface($send_data, 1);
  400. $result = $curlInterface->execute($url, 'POST');
  401. if (isset($result['result']) && $result['result'] == '0') {
  402. return Util::returnArrSu('验证码发送成功');
  403. }
  404. return Util::returnArrEr('验证码发送失败');
  405. }
  406. /**
  407. * 检测是微信还是支付宝 1、微信 2、支付宝
  408. * @return string
  409. */
  410. public static function checkWeChatOrAliPay()
  411. {
  412. $header = \Yii::$app->request->getHeaders();
  413. $user_agent = $header['user-agent'];
  414. //判断是不是微信
  415. if (preg_match('/MicroMessenger/i', $user_agent)) {
  416. return 1;
  417. }
  418. if (preg_match('/AlipayClient/i', $user_agent)) {
  419. return 2;
  420. }
  421. return 3;
  422. }
  423. /**
  424. * Des:发送信息到RTX
  425. * Name: sendMsgRTX
  426. * @param string $receiverList
  427. * @param $title
  428. * @param $msg
  429. * @author 倪宗锋
  430. */
  431. public static function sendMsgRTX($receiverList = 'nizf', $title, $msg)
  432. {
  433. $arr = array(
  434. 'title' => $title . '【' . date('Y-m-d H:i:s', time()) . '】',
  435. 'receiver' => $receiverList,
  436. 'msg' => substr($msg, 0, 1024),
  437. );
  438. $curl = new CurlInterface($arr, 5);
  439. $curl->execute('http://180.168.4.58:8012/SendNotify.cgi', 'POST');
  440. }
  441. /**
  442. * Des:调用蜘蛛出行接口
  443. * Name: interfaceZzcx
  444. * @param $data array 传递参数
  445. * @param $url string 接口地址
  446. * @param $timeout int 超时秒数
  447. * @return array
  448. * @author 倪宗锋
  449. */
  450. public static function interfaceZzcx($data, $url, $timeout = 0)
  451. {
  452. $time = time();
  453. $data['time'] = $time;
  454. $param = [
  455. 'code' => Util::authCode(http_build_query($data), 'ENCODE'),
  456. 'time' => $time
  457. ];
  458. $curl = new CurlInterface($param, 4);
  459. if ($timeout != 0) {
  460. $curl->setTimeOut($timeout);
  461. }
  462. $siteConfig = Util::getSiteConfig();
  463. $return = $curl->execute($siteConfig['zzcx_host'] . $url, 'POST');
  464. return $return;
  465. }
  466. /**
  467. * Des:添加订单日志
  468. * Name: addOrderLog
  469. * @param $uid
  470. * @param $u_type
  471. * @param $order_id
  472. * @param $name
  473. * @param $log_type
  474. * @author 倪宗锋
  475. */
  476. public static function addOrderLog($uid, $u_type, $order_id, $name, $log_type)
  477. {
  478. $data = [];
  479. $data['uid'] = $uid;
  480. $data['u_type'] = $u_type;
  481. $data['order_id'] = $order_id;
  482. $data['name'] = $name;
  483. $data['log_type'] = $log_type;
  484. $url = '/zzcx/interfaces/fx/add-order-log';
  485. static::interfaceZzcx($data, $url);
  486. }
  487. /**
  488. * Des:添加用户操作日志
  489. * Name: addUserOrderLog
  490. * @param $title string 标题
  491. * @param $memo string 内容
  492. * @param $uid int 用户ID
  493. * @param $u_type int 1管理员,2分销商,3微信用户,4cs系统',
  494. * @param $order_id string 订单ID
  495. * @param $source_type 资源类型 1、产品,2、订单
  496. * @author 倪宗锋
  497. */
  498. public static function addUserOrderLog($title, $memo, $uid, $u_type, $order_id,$source_type)
  499. {
  500. $data = [];
  501. $data['title'] = $title;
  502. $data['memo'] = $memo;
  503. $data['uid'] = $uid;
  504. $data['u_type'] = $u_type;
  505. $data['source_id'] = $order_id;
  506. $data['source_type'] = $source_type;
  507. $url = '/zzcx/interfaces/fx/add-user-log';
  508. static::interfaceZzcx($data, $url);
  509. }
  510. }