common.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: 流年 <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. // 应用公共文件
  12. /*微信小程序用
  13. * code 成功
  14. * 20210927
  15. * wj
  16. */
  17. function backjson($code, $data)
  18. {
  19. $jsonData = [
  20. 'code' => $code,
  21. 'resultData' => $data,
  22. ];
  23. return json_encode($jsonData, 320);
  24. }
  25. /*app用
  26. * 20210927
  27. * wj
  28. */
  29. function backjson2($code, $msg = "", $data = [])
  30. {
  31. $jsonData = [
  32. 'code' => $code,
  33. 'msg' => $msg,
  34. 'data' => $data,
  35. ];
  36. return json_encode($jsonData, 320);
  37. }
  38. /* 内部使用
  39. * 20210927
  40. * wj
  41. */
  42. function backarr($status, $msg = "", $data = [])
  43. {
  44. $backData = [
  45. 'status' => $status,
  46. 'msg' => $msg,
  47. 'data' => $data,
  48. ];
  49. return $backData;
  50. }
  51. /***
  52. * 获取单号
  53. * wj
  54. * 20210911
  55. */
  56. function createOrderNo($key = null)
  57. {
  58. //$ordrNo = date("YmdHis") . $key . rand(0, 1000);
  59. //$ordrNo = date("YmdHis") . $key;
  60. if (!empty($key)) {
  61. $ordrNo = date("YmdHis") . uniqid() . $key;
  62. } else {
  63. $ordrNo = date("YmdHis") . uniqid();
  64. }
  65. return $ordrNo;
  66. }
  67. /***
  68. * 获取随机字符串
  69. * wj
  70. * 20210911
  71. */
  72. function getRandomStrings($str = "")
  73. {
  74. $str .= time();
  75. return md5($str);
  76. }
  77. /***
  78. * 判断是否为日期
  79. * wj
  80. * 20211013
  81. */
  82. function isDate($date, $foramt)
  83. {
  84. $date1 = $date;
  85. $time = strtotime($date1);
  86. if (!$time) {
  87. return false;
  88. }
  89. $date2 = date($foramt, $time);
  90. return $date1 == $date2;
  91. }
  92. //curl请求
  93. function requestCurl($url, $method = "get", $data = '', $header = [], $second = 10)
  94. {
  95. $method = strtoupper($method);
  96. $method = in_array($method, ['GET', 'POST']) ? $method : 'GET';
  97. $ch = curl_init();
  98. //设置超时
  99. curl_setopt($ch, CURLOPT_TIMEOUT, $second);
  100. curl_setopt($ch, CURLOPT_URL, $url);
  101. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  102. //要求结果为字符串且输出到屏幕上
  103. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  104. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  105. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //严格校验2
  106. //设置header
  107. curl_setopt($ch, CURLOPT_HEADER, false);
  108. if (!empty($header)) {
  109. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  110. }
  111. if ('POST' == $method) {
  112. //$data = json_encode($data, JSON_UNESCAPED_UNICODE);
  113. curl_setopt($ch, CURLOPT_POST, true);
  114. if (is_array($data)) {
  115. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data, ''));
  116. }
  117. if (is_string($data)) {
  118. curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
  119. }
  120. }
  121. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //禁止 cURL 验证对等证书
  122. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //是否检测服务器的域名与证书上的是否一致
  123. //运行curl
  124. $data = curl_exec($ch);
  125. if (curl_errno($ch)) { //出错则显示错误信息
  126. $error = curl_error($ch);
  127. curl_close($ch);
  128. return $error;
  129. } else {
  130. curl_close($ch);
  131. return $data;
  132. }
  133. }
  134. function arry_string($data)
  135. {
  136. if (!is_array($data)) {
  137. return false;
  138. }
  139. $usedata = [];
  140. foreach ($data as $key => $value) {
  141. if (!is_string($value) && !is_numeric($value)) {
  142. return false;
  143. }
  144. $usedata[] = $key . '=' . $value;
  145. }
  146. $str = implode('&', $usedata);
  147. return $str;
  148. }
  149. //根据身份证获取性别
  150. function getGenderBySfzid($sfzid)
  151. {
  152. $gender = false;
  153. switch (mb_strlen($sfzid)) {
  154. case 15:
  155. $genderNum = substr($sfzid, 14, 1);
  156. break;
  157. case 18:
  158. $genderNum = substr($sfzid, 16, 1);
  159. break;
  160. }
  161. if (($genderNum % 2) === 0) {
  162. $gender = "女";
  163. } else {
  164. $gender = "男";
  165. }
  166. return $gender;
  167. }
  168. function getGenderByAge($sfzid)
  169. {
  170. $birthday = substr($sfzid, 6, 8);
  171. $bmd = substr($birthday, 4, 4);
  172. $byear = substr($birthday, 0, 4);
  173. $strtoday = date('Ymd');
  174. $md = substr($strtoday, 4, 4);
  175. $year = substr($strtoday, 0, 4);
  176. $age = intval($year) - intval($byear);
  177. if ($md < $bmd) {
  178. $age = $age - 1;
  179. }
  180. return $age;
  181. }
  182. //获取身份证结束时间
  183. function getSfzend($sfzenddate)
  184. {
  185. if (is_numeric($sfzenddate)) {
  186. if (isDate($sfzenddate, "Ymd")) {
  187. $strenddate = $sfzenddate;
  188. $strendmonth = substr($strenddate, 4, 2);
  189. $strendyear = substr($strenddate, 0, 4);
  190. $strendday = substr($strenddate, 6, 2);
  191. $sfzenddate = $strendyear . '-' . $strendmonth . '-' . $strendday;
  192. } else {
  193. $sfzenddate = '2050-12-31';
  194. }
  195. } else {
  196. $sfzenddate = false;
  197. }
  198. return $sfzenddate;
  199. }
  200. //为cp后台请求验证token
  201. /*function checkToken()
  202. {
  203. $l_w = new app\index\logic\webmanger();
  204. $token = request()->server('HTTP_TOKEN');
  205. $param = ['token' => $token];
  206. $result = $l_w->queryinfobytoken($param);
  207. if (1 != $result['status']) {
  208. $str = backjson2(0, '登录失效', $result['data']);
  209. exit($str);
  210. }
  211. }*/
  212. //判断是否是手机号
  213. function isMoblid($tel)
  214. {
  215. if (preg_match("/^1[3-9]{1}\d{9}$/", $tel)) {
  216. return true;
  217. } else {
  218. return false;
  219. }
  220. }
  221. //获取httpsurl
  222. function getselfurl($name = null)
  223. {
  224. $env = config('env');
  225. $sellurl = config('selfurl');
  226. $urllist = isset($sellurl[$env]) ? $sellurl[$env] : $sellurl['pro'];
  227. $defaultname = "default";
  228. if (empty($name)) {
  229. $name = $defaultname;
  230. }
  231. return isset($urllist[$name]) ? $urllist[$name] : $urllist[$defaultname];
  232. }
  233. /**
  234. * 随机验证码
  235. *
  236. * @param integer $type
  237. * @param integer $len
  238. * @return void
  239. * @author wj
  240. * @date 2022-07-25
  241. */
  242. function randomStr($type = 1, $len = 6)
  243. {
  244. $number = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  245. $strArray = [];
  246. switch ($type) {
  247. case 1:
  248. $strArray = $number;
  249. break;
  250. }
  251. $len = $len <= 0 ? 6 : $len;
  252. $len = $len > 10 ? 6 : $len;
  253. $str = '';
  254. for ($i = 0; $i < $len; $i++) {
  255. $num = $strArray[mt_rand(0, count($strArray) - 1)];
  256. $str .= $num;
  257. }
  258. return $str;
  259. }
  260. /**
  261. * 数据加密和解密 默认加密
  262. */
  263. function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0)
  264. {
  265. $defaultkey = "acidhospital";
  266. // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
  267. $ckey_length = 4;
  268. // 密匙
  269. $key = md5($key ? $key : $defaultkey);
  270. // 密匙a会参与加解密
  271. $keya = md5(substr($key, 0, 16));
  272. // 密匙b会用来做数据完整性验证
  273. $keyb = md5(substr($key, 16, 16));
  274. // 密匙c用于变化生成的密文
  275. $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';
  276. // 参与运算的密匙
  277. $cryptkey = $keya . md5($keya . $keyc);
  278. $key_length = strlen($cryptkey);
  279. // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),
  280. //解密时会通过这个密匙验证数据完整性
  281. // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
  282. $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
  283. $string_length = strlen($string);
  284. $result = '';
  285. $box = range(0, 255);
  286. $rndkey = array();
  287. // 产生密匙簿
  288. for ($i = 0; $i <= 255; $i++) {
  289. $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  290. }
  291. // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
  292. for ($j = $i = 0; $i < 256; $i++) {
  293. $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  294. $tmp = $box[$i];
  295. $box[$i] = $box[$j];
  296. $box[$j] = $tmp;
  297. }
  298. // 核心加解密部分
  299. for ($a = $j = $i = 0; $i < $string_length; $i++) {
  300. $a = ($a + 1) % 256;
  301. $j = ($j + $box[$a]) % 256;
  302. $tmp = $box[$a];
  303. $box[$a] = $box[$j];
  304. $box[$j] = $tmp;
  305. // 从密匙簿得出密匙进行异或,再转成字符
  306. $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  307. }
  308. if ($operation == 'DECODE') {
  309. // 验证数据有效性,请看未加密明文的格式
  310. if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
  311. return substr($result, 26);
  312. } else {
  313. return '';
  314. }
  315. } else {
  316. // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
  317. // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
  318. return $keyc . str_replace('=', '', base64_encode($result));
  319. }
  320. }