ToolServer.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. <?php
  2. namespace App\Services;
  3. class ToolServer
  4. {
  5. /**
  6. * curl 请求工具
  7. * @param string $method
  8. * @param string $url
  9. * @param array $params
  10. * @param bool $json
  11. * @param bool $isDecode
  12. * @return bool|mixed|string
  13. */
  14. public static function curl(string $method, string $url, array $params = [], bool $json = false, bool $isDecode = false)
  15. {
  16. $method = strtoupper($method);
  17. $ch = curl_init();
  18. curl_setopt($ch, CURLOPT_HEADER, 0);
  19. if ($method == 'GET') {
  20. $url_params = '';
  21. foreach ($params as $key => $val) {
  22. if (empty($url_params)) {
  23. $url_params .= '?';
  24. } else {
  25. $url_params .= '&';
  26. }
  27. $url_params .= $key . '=' . $val;
  28. }
  29. if (!empty($url_params)) {
  30. $url .= $url_params;
  31. }
  32. curl_setopt($ch, CURLOPT_URL, $url);
  33. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  34. } elseif ($method == 'POST') {
  35. curl_setopt($ch, CURLOPT_URL, $url);
  36. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  37. curl_setopt($ch, CURLOPT_POST, 1);
  38. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  39. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  40. if ($json == true) {
  41. $params = json_encode($params, JSON_UNESCAPED_UNICODE);
  42. $len = strlen($params);
  43. $headers = array("Content-type: application/json;charset=UTF-8","Content-Length: $len");
  44. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  45. } else {
  46. $params = http_build_query($params);
  47. }
  48. curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
  49. }
  50. $data = curl_exec($ch);
  51. curl_close($ch);
  52. if ($isDecode) {
  53. $data = json_decode($data, true);
  54. }
  55. return $data;
  56. }
  57. /**
  58. * 时间格式化(时间戳)
  59. * @param $ptime
  60. * @return false|string
  61. */
  62. public static function uc_time_ago($ptime)
  63. {
  64. $lang = request()->header('lang','zh');
  65. date_default_timezone_set('PRC');
  66. $etime = time() - $ptime;
  67. switch ($etime) {
  68. case $etime <= 60:
  69. $msg = trans('api.JUST_NOW');
  70. break;
  71. case $etime > 60 && $etime <= 60 * 60:
  72. $msg = floor($etime / 60) . trans('api.MINUTES_AGO');
  73. break;
  74. case $etime > 60 * 60 && $etime <= 24 * 60 * 60:
  75. $msg = date('Ymd', $ptime) == date('Ymd', time()) ? trans('api.TODAY').' ' . date('H:i', $ptime) : trans('api.YESTERDAY').' ' . date('H:i', $ptime);
  76. break;
  77. // case $etime > 24 * 60 * 60 && $etime <= 2 * 24 * 60 * 60:
  78. // $msg = date('Ymd', $ptime) + 1 == date('Ymd', time()) ? trans('api.YESTERDAY').' ' . date('H:i', $ptime) : '前天 ' . date('H:i', $ptime);
  79. // break;
  80. // case $etime > 2 * 24 * 60 * 60 && $etime <= 12 * 30 * 24 * 60 * 60:
  81. // $msg = date('Y', $ptime) == date('Y', time()) ? date('m-d H:i', $ptime) : date('Y-m-d H:i', $ptime);
  82. // break;
  83. default:
  84. $msg = date('Y-m-d H:i', $ptime);
  85. }
  86. return $msg;
  87. }
  88. /**
  89. * 自动收起距离单位
  90. * @param float $distance
  91. * @return float|int|string
  92. */
  93. public static function distance(float $distance)
  94. {
  95. if ($distance == -1) {
  96. return -1;
  97. }
  98. if ($distance > 1000) {
  99. $distance = round($distance / 1000, 2) . 'km';
  100. } else {
  101. $distance .= 'm';
  102. }
  103. return $distance;
  104. }
  105. /**
  106. * 获取地址距离
  107. * @param array $from [起点坐标(经纬度),例如:array(118.012951,36.810024)]
  108. * @param array $to [终点坐标(经纬度)]
  109. * @param bool $km 是否以公里为单位 false:米 true:公里(千米)
  110. * @param int $decimal $decimal 精度 保留小数位数
  111. * @return int|string 距离数值
  112. */
  113. public static function getDistance(array $from, array $to, bool $km = true, int $decimal = 2)
  114. {
  115. sort($from);
  116. sort($to);
  117. $EARTH_RADIUS = 6370.996; // 地球半径系数
  118. $distance = $EARTH_RADIUS * 2 * asin(sqrt(pow(sin(($from[0] * pi() / 180 - $to[0] * pi() / 180) / 2), 2) + cos($from[0] * pi() / 180) * cos($to[0] * pi() / 180) * pow(sin(($from[1] * pi() / 180 - $to[1] * pi() / 180) / 2), 2))) * 1000;
  119. if ($km) {
  120. $distance = $distance / 1000;
  121. }
  122. return round($distance, $decimal);
  123. }
  124. /**
  125. * 加密(可对接java)
  126. * @param array $data
  127. * @param string $key
  128. * @param string $secret
  129. * @return string
  130. */
  131. public static function encodeOld(array $data, string $key, string $secret)
  132. {
  133. $plaintext = urldecode(http_build_query($data)) . '@';
  134. $key = strtoupper(md5($key . $secret));
  135. $size = 16;
  136. $iv = str_repeat("\0", $size);
  137. $padding = $size - strlen($plaintext) % $size;
  138. $plaintext .= str_repeat(chr($padding), $padding);
  139. $encrypted = openssl_encrypt($plaintext, 'AES-192-CBC', base64_decode($key), OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
  140. return base64_encode($encrypted);
  141. }
  142. /**
  143. * 加密
  144. * @param array $data
  145. * @param string $key
  146. * @return string
  147. */
  148. public static function encode(array $data, string $key)
  149. {
  150. //数据集合转化字符串 再加个 @
  151. $plaintext = urldecode(http_build_query($data)) . '@';
  152. //md5 加密 key
  153. $key_md5 = $key;
  154. $size = 16;
  155. //生成 16 位偏移量
  156. //$iv = str_repeat("\0", $size);
  157. $iv = "0987654321098765";
  158. // 使用 PKCS5Padding 填充
  159. $padding = $size - strlen($plaintext) % $size;
  160. $plaintext .= str_repeat(chr($padding), $padding);
  161. $encrypted = openssl_encrypt($plaintext, 'AES-128-CBC', $key_md5, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
  162. return base64_encode($encrypted);
  163. }
  164. public static function encodeStr(string $data, string $key)
  165. {
  166. //数据集合转化字符串 再加个 @
  167. $plaintext = $data . '@';
  168. //md5 加密 key
  169. $key_md5 = $key;
  170. $size = 16;
  171. //生成 16 位偏移量
  172. $iv = str_repeat("\0", $size);
  173. //$iv = "0987654321098765";
  174. // 使用 PKCS5Padding 填充
  175. $padding = $size - strlen($plaintext) % $size;
  176. $plaintext .= str_repeat(chr($padding), $padding);
  177. $encrypted = openssl_encrypt($plaintext, 'AES-128-CBC', $key_md5, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
  178. return base64_encode($encrypted);
  179. }
  180. /**
  181. * 解密(可对接java)
  182. * @param string $content
  183. * @param string $key
  184. * @return array
  185. */
  186. public static function decode(string $content, string $key)
  187. {
  188. $key_md5 = $key;
  189. $size = 16;
  190. //$iv = str_repeat("\0", $size);
  191. $iv = "0987654321098765";
  192. $decrypted = openssl_decrypt(base64_decode($content), 'AES-128-CBC', $key_md5, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
  193. $data_decode = explode('@', $decrypted);
  194. //$data = [];
  195. //parse_str($data_decode[0], $data);
  196. return json_decode($data_decode[0], true);
  197. }
  198. /**
  199. * 解密(php)
  200. * @param string $content
  201. * @param string $key
  202. * @param string $secret
  203. * @return mixed
  204. */
  205. public static function decodeOld(string $content, string $key, string $secret)
  206. {
  207. $key = strtoupper(md5($key . $secret));
  208. $size = 16;
  209. $iv = str_repeat("\0", $size);
  210. $decrypted = openssl_decrypt(base64_decode($content), 'AES-192-CBC', base64_decode($key), OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
  211. $data_decode = explode('@', $decrypted);
  212. //$data = [];
  213. //parse_str($data_decode[0], $data);
  214. //return $data;
  215. return json_decode($data_decode[0], true);
  216. }
  217. public static function toStr($bytes)
  218. {
  219. $str = '';
  220. foreach ($bytes as $ch) {
  221. //dd(chr($ch));
  222. try {
  223. $str .= chr($ch);
  224. } catch (\Exception $e) {
  225. dd(chr($ch));
  226. }
  227. }
  228. return $str;
  229. }
  230. /**
  231. * 签名算法
  232. * @param array $params
  233. * @param string $secret
  234. * @return array
  235. */
  236. public static function sign(array $params, string $secret)
  237. {
  238. $p = ksort($params);
  239. $str = '';
  240. if ($p) {
  241. foreach ($params as $key => $items) {
  242. $str .= "{$key}";
  243. $str .= "=";
  244. $str .= "{$items}";
  245. $str .= "&";
  246. }
  247. }
  248. $string = substr($str, 0, -1);
  249. //$string = "appKey=$this->appKey&nonce=$this->nonce&timestamp=$this->timestamp";
  250. $stringSignTemp = "$string&secret=$secret";
  251. //echo $stringSignTemp;
  252. $sign = strtoupper(MD5($stringSignTemp));
  253. $params['sign'] = $sign;
  254. return $params;
  255. }
  256. }