VerifySign.php 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. predicate(isset($params['sign']),'sign err');
  20. $sign = $this->signature($params);
  21. predicate($sign == $params['sign'],'verify sign err');
  22. return $next($request);
  23. }
  24. function joint(array $obj, $ignoreSign = true) {
  25. $keys = array_keys($obj);
  26. asort($keys);
  27. $str = '';
  28. foreach ($keys as $key) {
  29. if ($key != 'sign') {
  30. $str .= strlen($str) > 0 ? '&' : '';
  31. $value = $obj[$key];
  32. if (is_array($value)) {
  33. $str .= $key."=".join(',', $value);
  34. } else if(is_object($value)) {
  35. $str .= $this->joint($value);
  36. } else {
  37. $str .= $key."=".$value;
  38. }
  39. }
  40. }
  41. return $str;
  42. }
  43. function signature(array $obj) {
  44. $string = 'oj)$&!@'.$this->joint($obj).'@#jfanb*(.';
  45. return md5($string);
  46. }
  47. }