VerifySign.php 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <?php
  2. namespace app\common\middleware;
  3. use app\exception\BaseException;
  4. const __TEST__ = '!(FAXKJSDdi101-fjLQ91hvl~@#$-we13';
  5. class VerifySign
  6. {
  7. /**
  8. * @param $request
  9. * @param \Closure $next
  10. * @return mixed
  11. * @throws BaseException
  12. */
  13. public function handle($request, \Closure $next)
  14. {
  15. $params = $request->param();
  16. $is_open = true;
  17. if(!$is_open || (isset($params['__TEST__']) && $params['__TEST__'] == __TEST__))
  18. return $next($request);
  19. $has_upload = strpos($request->url(),'api/upload');
  20. if($has_upload !== false && $has_upload >= 0) {
  21. return $next($request);
  22. }
  23. predicate(isset($params['sign']),'sign err');
  24. $sign = $this->signature($params);
  25. predicate($sign == $params['sign'],'verify sign err');
  26. return $next($request);
  27. }
  28. function joint(array $obj, $ignoreSign = true) {
  29. $keys = array_keys($obj);
  30. asort($keys);
  31. $str = '';
  32. foreach ($keys as $key) {
  33. if ($key != 'sign') {
  34. $str .= strlen($str) > 0 ? '&' : '';
  35. $value = $obj[$key];
  36. if (is_array($value)) {
  37. $str .= $key."=".join(',', $value);
  38. } else if(is_object($value)) {
  39. $str .= $this->joint($value);
  40. } else {
  41. $str .= $key."=".$value;
  42. }
  43. }
  44. }
  45. return $str;
  46. }
  47. function signature(array $obj) {
  48. $string = 'oj)$&!@'.$this->joint($obj).'@#jfanb*(.';
  49. return md5($string);
  50. }
  51. }