helperService.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: vowkin
  5. * Date: 2017/5/20
  6. * Time: 11:27
  7. */
  8. namespace app\common\service;
  9. class helperService
  10. {
  11. public static $errorInfo = null;
  12. public static $private_key = '-----BEGIN RSA PRIVATE KEY-----
  13. MIICXAIBAAKBgQDkMateIwsasBD9NT2n5iUc2RM5jERDyComwLyOCn0XIBNW246j
  14. 2yd/yhGXFFKLJ2R2wqGn7RON+tE7901eDkqsqAX9vFZ3zWBHUczWzwSS4htSS047
  15. XJOWk+cKuRwPHxX0hZwyUjBMLW7Ig2jDNGqI7MO2KgUvqZxoMrB4PQ7OfQIDAQAB
  16. AoGADxumv+XMD2lGxqzmtx4KqP1KQ44g2uf+unAaS8EwBP7vqNmCeSDCXbiQL5N9
  17. 346tHRvHvil5GPZZMgIukiKaGPJJL0lG/+sq0ZawsApO/ApCt2MLwqCS7qu7H4R6
  18. 6nf6D1caAvt+AZu+6YPMlghRceDpV2cxDgas1Bt9zgZJLrUCQQD0jx88b+pBs0YX
  19. XK+BV85wTlbaByDMsgbJ6sMjtamkzHGyJ25PZmY/MAF98+IDcci02jbXOeRm/KnG
  20. 3ImibkujAkEA7t6Oli+GKSlkBdped+rQhmfvty8NFyJybU8Zw6FXFovd+Jru/fOL
  21. yyssk7L1FHJWeESTDpA47WC+soPHqKgfXwJBAJzqH/6lSEczgeuHesygzEJe4Xcv
  22. T6pHJ/fye5az/s9QpjrK9gpYB47PfIWWMBRJs5/my305FgXGZCDGbEEeR8UCQEtA
  23. JZ8+nX8+INqPLo+Mk+Cjwart0avmGDJDZxRwMWVS7ryw4nVyUinREhv9lqO4WXFN
  24. +R3vZV+yyKCoTy/ctvUCQH4XkYv9mfPJfaYDL9E0vCsWSEBWiaCTM+Oji6vCuOJO
  25. yz+kJ+SlcLhSOAc28FlIKA5FTC/H3xYOQW0BYpJGV4I=
  26. -----END RSA PRIVATE KEY-----';
  27. //给支付传参数用的
  28. public static $sign = null;
  29. public static $nonceStr = null;
  30. /**
  31. * @param $url
  32. * @param string $param
  33. * @param bool $is_ssl 是否启用ssl请求
  34. * @return mixed
  35. */
  36. public static function http_post($url, $param='',$is_ssl=false) {
  37. $url = str_replace(' ', '', $url);
  38. $ch = curl_init();
  39. curl_setopt($ch, CURLOPT_URL, $url);
  40. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
  41. curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
  42. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  43. curl_setopt($ch, CURLOPT_HEADER, 0);
  44. if($is_ssl){
  45. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  46. }
  47. curl_setopt($ch, CURLOPT_HTTPHEADER,['Content-Type: application/json; charset=utf-8','Content-Length:' . strlen($param)]);
  48. $tmpInfo = curl_exec($ch);
  49. if (curl_errno($ch)) {
  50. self::$errorInfo = [
  51. 'msg' =>'Curl Errno : ' . curl_error($ch),
  52. 'line'=>__LINE__,
  53. 'file'=>__FILE__
  54. ];
  55. }
  56. curl_close($ch);
  57. return $tmpInfo;
  58. }
  59. public static function voice_download($mediaId){
  60. $serviceWechat = new serviceWechat();
  61. $res = $serviceWechat->getToken();
  62. $res = json_decode($res,true);
  63. if(!isset($res['code']) || $res['code'] != 200){
  64. die('获取token数据失败,请重新尝试!');
  65. }
  66. $token = $res['data'];
  67. $path = './uploads/wxVoice';
  68. $filename = time().rand(1111,9999).".amr";
  69. $filePath = "$path/$filename";
  70. self::downAndSaveFile("https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=$token&media_id=$mediaId","$filePath");
  71. return substr($filePath,1);
  72. }
  73. //根据URL地址,下载文件
  74. private static function downAndSaveFile($url,$savePath){
  75. ob_start();
  76. readfile($url);
  77. $img = ob_get_contents();
  78. ob_end_clean();
  79. $fp = fopen("$savePath", 'a');
  80. fwrite($fp, $img);
  81. fclose($fp);
  82. }
  83. public static function downloadFile($file){
  84. $file_name = $file;
  85. $mime = 'application/force-download';
  86. header('Pragma: public'); // required
  87. header('Expires: 0'); // no cache
  88. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  89. header('Cache-Control: private',false);
  90. header('Content-Type: '.$mime);
  91. header('Content-Disposition: attachment; filename="'.basename($file_name).'"');
  92. header('Content-Transfer-Encoding: binary');
  93. header('Connection: close');
  94. readfile($file_name); // push it out
  95. exit();
  96. }
  97. //组件分页样式
  98. public static function createPage($count,$page,$url,$params,$pageSize=10,$offset=5){
  99. $countPage = ceil($count/$pageSize);
  100. $pageString = "";
  101. //固化边界
  102. if($page<1){
  103. $page = 1;
  104. }
  105. if($offset < 1){
  106. $offset = 1;
  107. }
  108. if($page> $countPage){
  109. $page = $countPage;
  110. }
  111. //左右偏移页面
  112. $startPage = $page-$offset;
  113. $endPage = $page+$offset;
  114. //判断最小值(因为$page和$offset都不小于1所以最大值不会小于1不做判断,仅判断最小值即可)
  115. if($startPage < 1){
  116. $startPage = 1;
  117. }
  118. //判断最大值(同理最小值没有超过$countPage的可能)
  119. if($endPage > $countPage){
  120. $endPage = $countPage;
  121. }
  122. for($i=$startPage;$i<=$endPage;$i++){
  123. if(intval($page) == $i){
  124. $pageString .= "<a class='active' href='".url($url,array_merge($params,['page'=>$i]))."'>{$i}</a>";
  125. continue;
  126. }
  127. $pageString .= "<a href='".url($url,array_merge($params,['page'=>$i]))."'>{$i}</a>";
  128. }
  129. $pageString .= " 共有{$count}条数据,共{$countPage}页";
  130. return $pageString;
  131. }
  132. /**
  133. * 统一输出源
  134. * @param $data
  135. * @param $param
  136. */
  137. public static function returnJson($data,$param=[]){
  138. die(json_encode($data,JSON_UNESCAPED_UNICODE));
  139. }
  140. /**
  141. * 返回json数据
  142. * @param $data
  143. * @param $code
  144. * @param $msg
  145. */
  146. public static function outputData($data,$code,$msg='操作成功'){
  147. //记录日志
  148. $return = json_encode([
  149. 'code'=>$code,
  150. 'msg'=>$msg,
  151. 'data'=>$data
  152. ]);
  153. die($return);
  154. }
  155. /**
  156. * 生成唯一编号
  157. * @return string
  158. */
  159. public static function createOrderNum(){
  160. $key = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 4, 5);
  161. $key.=rand(100,999);
  162. usleep(1000);
  163. return $key;
  164. }
  165. /**
  166. * 二维数组排序
  167. * @param array $list
  168. * @param $sort
  169. * @return array
  170. */
  171. public static function arraySort($list=[],$value,$sort){
  172. foreach ($list as $item) {
  173. $k[]=$item[$value];
  174. }
  175. if($sort=='asc'){
  176. array_multisort($k,SORT_ASC,$list);
  177. }elseif($sort=='desc'){
  178. array_multisort($k,SORT_DESC,$list);
  179. }
  180. return $list;
  181. }
  182. /**
  183. * 创建文件目录
  184. * @param $path
  185. * @return bool
  186. */
  187. protected function checkPath($path)
  188. {
  189. if (is_dir($path)) {
  190. return true;
  191. }
  192. if (mkdir($path, 0755, true)) {
  193. return true;
  194. } else {
  195. $this->error = "目录 {$path} 创建失败!";
  196. return false;
  197. }
  198. }
  199. /**
  200. * 文件上传
  201. * @param $name
  202. * @param string $path_name
  203. * @param string $param_img
  204. * @return string
  205. */
  206. public static function uploadImage($name,$path_name='',$param_img=''){
  207. if(request()->isHead()){
  208. return '';
  209. }
  210. $file = request()->file($name);
  211. if($file) {
  212. if(empty($param_img)){
  213. $info = $file->rule('uniqid')->move(ROOT_PATH . 'public' . DS . 'uploads'. DS .$path_name);
  214. $save_name = DS."uploads".DS.$path_name.DS.$info->getSaveName();
  215. return $save_name;
  216. }else{
  217. return $param_img;
  218. }
  219. }else{
  220. return '上传文件出错';
  221. }
  222. }
  223. /**
  224. * 产生随机的字符串
  225. * @param $len
  226. * @param null $chars
  227. * @return string
  228. */
  229. public static function getRandomString($len, $chars=null)
  230. {
  231. if (is_null($chars)) {
  232. $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  233. }
  234. mt_srand(10000000*(double)microtime());
  235. for ($i = 0, $str = '', $lc = strlen($chars)-1; $i < $len; $i++) {
  236. $str .= $chars[mt_rand(0, $lc)];
  237. }
  238. return $str;
  239. }
  240. /**
  241. * 替换周
  242. * @param $week
  243. * @param $prefix
  244. * @return string
  245. */
  246. public static function replaceWeek($week,$prefix="周"){
  247. switch($week){
  248. case 1:
  249. $item = $prefix.'一';
  250. break;
  251. case 2:
  252. $item = $prefix.'二';
  253. break;
  254. case 3:
  255. $item = $prefix.'三';
  256. break;
  257. case 4:
  258. $item = $prefix.'四';
  259. break;
  260. case 5:
  261. $item = $prefix.'五';
  262. break;
  263. case 6:
  264. $item = $prefix.'六';
  265. break;
  266. default:
  267. $item = $prefix.'日';
  268. break;
  269. }
  270. return $item;
  271. }
  272. /**
  273. * 取出list中的,两个字段组成text,value的json输出给选择控件
  274. * @param $list
  275. * @param $text_key
  276. * @param $value_key
  277. * @return string
  278. */
  279. public static function transListToJson($list,$text_key,$value_key){
  280. if(empty($list)){
  281. return json_encode([]);
  282. }
  283. $JsonArr = [];
  284. foreach($list as $item){
  285. $arr = [];
  286. $arr['text'] = $item[$text_key];
  287. $arr['value'] = $item[$value_key];
  288. $JsonArr[] = $arr;
  289. }
  290. return json_encode($JsonArr);
  291. }
  292. /**
  293. * 创建连续的时间数组
  294. * @param $startDayTime
  295. * @param $len
  296. * @return array
  297. */
  298. public static function createWeekDay($startDayTime,$len){
  299. $arrWeekDay = [];
  300. for($i=0;$i<$len;$i++){
  301. $arr = [];
  302. $arr['format_time'] = $startDayTime+$i*86400;
  303. $arr['week'] = date('w',$arr['format_time']);
  304. $arr['znWeek'] = helperService::replaceWeek($arr['week']);
  305. $arr['day'] = date('d',$arr['format_time']);
  306. $arrWeekDay[] = $arr;
  307. }
  308. return $arrWeekDay;
  309. }
  310. /**
  311. * 模型数据转数组
  312. * @param $data
  313. * @return mixed
  314. */
  315. public static function modelDataToArr($data){
  316. return json_decode(json_encode($data),true);
  317. }
  318. /*
  319. * 返回参数,并且书写日志
  320. */
  321. public static function addLog($data,$params){
  322. if(empty($params)){
  323. $params = file_get_contents("php://input");
  324. $params = @json_decode($params,true);
  325. }
  326. $request = Request::instance();
  327. $params['_client_ip_'] = $request->ip(0,true);
  328. $log_data = [];
  329. $log_data['request_url'] = "http://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
  330. $log_data['add_time'] = time();
  331. $log_data['exec_time'] = microtime(true)-HelperService::$_startExecTime;
  332. self::pushRedis($log_data,$data,$params);
  333. }
  334. /**
  335. *
  336. * @param $path
  337. * @throws \Exception
  338. */
  339. public static function mailWarn($path){
  340. $mailService = new mailService();
  341. try {
  342. $mailService->send(
  343. "Q派API项目[" . date('Y-m-d H:i:s') . "]",
  344. "$path",
  345. "接口报错:".HelperService::$error_info,
  346. Config::get('reply_mail'),
  347. Config::get('mail_to')
  348. );
  349. }catch (\Exception $ex){
  350. //直接写死,报邮件预警失败!!!
  351. HelperService::addLog('myLog/mailWarn.log',json_encode([
  352. 'message'=>$ex->getMessage(),
  353. 'path'=>$path,
  354. 'msg'=>'邮件预警失败',
  355. 'errorInfo'=>HelperService::$error_info
  356. ]));
  357. //发送固定预警邮件
  358. $mailService->send(
  359. "Q派API项目[" . date('Y-m-d H:i:s') . "]",
  360. "HelperService::mailWarn",
  361. "邮件预警失败",
  362. 'leo.xie@kuyunnet.com',
  363. [
  364. ['mail'=>'m15329884885@163.com','name'=>'鹏哥']
  365. ]
  366. );
  367. }
  368. }
  369. }