Signature.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. namespace app\controller\api\util;
  3. use think\facade\Cache;
  4. use think\facade\Log;
  5. class Signature
  6. {
  7. private static $signKey = 'tdba@86868#';
  8. private static $thirdsignKey = 'tdyl@86868';
  9. /**
  10. * 二维数组根据某个字段排序
  11. * @param array $array 要排序的数组
  12. * @param string $keys 要排序的键字段
  13. * @param string $sort 排序类型 SORT_ASC SORT_DESC
  14. * @return array 排序后的数组
  15. */
  16. static function arrSort($array, $keys, $sort = SORT_DESC)
  17. {
  18. $keysValue = [];
  19. foreach ($array as $k => $v) {
  20. $keysValue[$k] = $v[$keys];
  21. }
  22. array_multisort($keysValue, $sort, $array);
  23. return $array;
  24. }
  25. /** 校验sign
  26. * @param $data
  27. * @return false
  28. */
  29. static function checkSign($data)
  30. {
  31. if (empty($data['sign'])) {
  32. return false;
  33. }
  34. $originalSign = $data['sign'];
  35. unset($data['sign']);
  36. ksort($data);
  37. $params = '';
  38. foreach ($data as $key => $value) {
  39. $params .= '&' . $key . '=' . $value;
  40. }
  41. $params = ltrim($params, '&');
  42. $sign = md5($params . '&signKey=' . self::$signKey);
  43. Log::channel("gong")->info("参数sign:" . $originalSign . ',校验生成sign' . $sign);
  44. if ($originalSign != $sign) {
  45. return false;
  46. }
  47. return true;
  48. }
  49. /** 校验sign
  50. * @param $data
  51. * @return false
  52. */
  53. static function thirdCheckSign($data,$header)
  54. {
  55. if (empty($header['sign'])) {
  56. return false;
  57. }
  58. $originalSign = $header['sign'];
  59. $timestamp = $header['timestamp'];
  60. if (abs($timestamp - time()) > 10) return false;
  61. ksort($data);
  62. $params = '';
  63. foreach ($data as $key => $value) {
  64. $params .= '&' . $key . '=' . $value;
  65. }
  66. $params = ltrim($params, '&');
  67. $sign = strtoupper(md5($params . '&signKey=' . self::$thirdsignKey . '&timestamp=' . $timestamp));
  68. Log::channel("gong")->info("参数sign:" . $originalSign . ',校验生成sign' . $sign);
  69. if ($originalSign != $sign) {
  70. return false;
  71. }
  72. $redis = Cache::store('redis')->handler();
  73. if($redis->get('thirdCheckSign:'.$originalSign)){
  74. return false;
  75. }
  76. $redis->set('thirdCheckSign:'.$originalSign,3600);
  77. return true;
  78. }
  79. }