common.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. // 应用公共文件
  3. use Firebase\JWT\JWT;
  4. use think\Exception;
  5. use think\facade\Cache;
  6. /**
  7. * 获取jwt-token
  8. */
  9. function signToken($param)
  10. {
  11. $key = 'Jmjk@886!&*123'; // 这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当 于加密中常用的 盐 salt
  12. $token = array(
  13. "iss" => $key, // 签发者 可以为空
  14. "aud" => '', // 面象的用户,可以为空
  15. "iat" => time(), // 签发时间
  16. "nbf" => time()+3, // 在什么时候jwt开始生效 (这里表示生成100秒后才生效)
  17. "exp" => time()+600, // token 过期时间 3天259200
  18. "data" => [ // 记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
  19. 'param' => $param,
  20. ]
  21. );
  22. $jwt = JWT::encode($token, $key, "HS256"); // 根据参数生成了 token
  23. return $jwt;
  24. }
  25. /**
  26. * 验证jwt-token
  27. */
  28. function checkToken($token)
  29. {
  30. $key = 'Jmjk@886!&*123';
  31. $status = array("code" => 777);
  32. try {
  33. JWT::$leeway = 86400; // 当前时间减去60,把时间留点余地
  34. $decoded = JWT::decode($token, $key, array('HS256')); // HS256方式,这里要和签发的时候对应
  35. $arr = (array)$decoded;
  36. $res['code'] = 0;
  37. $res['data'] = $arr['data'];
  38. return $res;
  39. } catch(\Firebase\JWT\SignatureInvalidException $e) { // 签名不正确
  40. $res['code'] = 101;
  41. $status['msg'] = "签名不正确";
  42. return $status;
  43. } catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
  44. $status['msg'] = "token失效";
  45. return $status;
  46. } catch(\Firebase\JWT\ExpiredException $e) { // token过期
  47. $status['msg'] = "token失效";
  48. return $status;
  49. } catch(Exception $e) { // 其他错误
  50. $status['msg'] = "未知错误";
  51. return $status;
  52. }
  53. }
  54. /**
  55. * authtoken
  56. */
  57. function get_authtoken()
  58. {
  59. $authtoken = Cache::get('authtoken') ?? '';
  60. if( ! $authtoken ) {
  61. $params = config('translate.user');
  62. $url = config('translate.request_url.get_authtoken_url');
  63. $response = curl_post_request($url , $params);
  64. if( ! $response) {
  65. return false;
  66. }
  67. $result = json_decode($response , true);
  68. $authtoken = $result['data']['authtoken'] ?? '---';
  69. /**
  70. * 设置缓存
  71. */
  72. Cache::set('authtoken' , $authtoken , config('translate.expire.authtoken_expire'));
  73. return $authtoken;
  74. }
  75. \think\facade\Log::info('Translate-authtoken:'.$authtoken);
  76. return $authtoken;
  77. }
  78. /**
  79. * curl get 请求
  80. */
  81. function curl_get_request($url)
  82. {
  83. $authtoken = get_authtoken();
  84. $curl_con = curl_init();
  85. curl_setopt($curl_con, CURLOPT_URL , $url);
  86. curl_setopt($curl_con, CURLOPT_HEADER, false);
  87. curl_setopt($curl_con, CURLOPT_CUSTOMREQUEST, 'GET');
  88. curl_setopt($curl_con, CURLOPT_RETURNTRANSFER, 1);
  89. curl_setopt($curl_con, CURLOPT_CONNECTTIMEOUT, 5);
  90. curl_setopt($curl_con, CURLOPT_FOLLOWLOCATION, true); // 解决curl返回301
  91. curl_setopt($curl_con, CURLOPT_HTTPHEADER , array(
  92. "Content-Type: application/json;charset=utf-8",
  93. "Authorization: Token $authtoken"
  94. )
  95. );
  96. $res = curl_exec($curl_con);
  97. $status = curl_getinfo($curl_con);
  98. curl_close($curl_con);
  99. if (isset($status['http_code']) && 200 == $status['http_code']) {
  100. return $res;
  101. } else {
  102. return false;
  103. }
  104. }
  105. /**
  106. * curl post 请求
  107. */
  108. function curl_post_request($url , $params , $authtoken = '')
  109. {
  110. $data = json_encode($params , JSON_UNESCAPED_UNICODE);
  111. $curl_con = curl_init();
  112. curl_setopt($curl_con, CURLOPT_URL , $url);
  113. curl_setopt($curl_con, CURLOPT_HEADER, false);
  114. curl_setopt($curl_con, CURLOPT_CUSTOMREQUEST, 'POST');
  115. curl_setopt($curl_con, CURLOPT_POSTFIELDS, $data);
  116. curl_setopt($curl_con, CURLOPT_RETURNTRANSFER, 1);
  117. curl_setopt($curl_con, CURLOPT_CONNECTTIMEOUT, 5);
  118. curl_setopt($curl_con, CURLOPT_FOLLOWLOCATION, true); // 解决curl返回301
  119. if($authtoken) {
  120. curl_setopt($curl_con, CURLOPT_HTTPHEADER , array(
  121. "Content-Type: application/json;charset=utf-8" ,
  122. "Authorization: Token $authtoken"
  123. )
  124. );
  125. } else {
  126. curl_setopt($curl_con, CURLOPT_HTTPHEADER , array(
  127. "Content-Type: application/json;charset=utf-8"
  128. )
  129. );
  130. }
  131. $res = curl_exec($curl_con);
  132. $status = curl_getinfo($curl_con);
  133. //return $status;
  134. curl_close($curl_con);
  135. \think\facade\Log::info(__FUNCTION__.': res='.$res);
  136. if (isset($status['http_code']) && 200 == $status['http_code']) {
  137. return $res;
  138. } else {
  139. return false;
  140. }
  141. }