ApiSign.php 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <?php namespace App\Servers\Encrypts;
  2. /**
  3. * 接口签名
  4. *
  5. * @author 刘相欣
  6. */
  7. class ApiSign
  8. {
  9. /**
  10. * 接口签名加密
  11. *
  12. * @param Array $data 需要加密的内容
  13. * @param Array $appid appid
  14. * @param Array $appkey key
  15. *
  16. * @return Array
  17. *
  18. * */
  19. public function encode($data,$appid,$appkey)
  20. {
  21. // 没有签名
  22. if( !empty($data['sign']) ) return ['error'=>'sign字段不允许参与'];
  23. // 没有随机字符串
  24. if( !isset($data['nonce']) ) $data['nonce'] = (string) random_int(100000,999999);
  25. // 时间戳
  26. if( !isset($data['timestamp']) ) $data['timestamp'] = time();
  27. // 组合参数
  28. $data['appid'] = $appid ? $appid :'ald930ea5d5a258f4f';
  29. // 组合参数
  30. $appkey = $appkey ? $appkey :'192006250b4c09247ec02edce69f6a2d';
  31. // 键名字典排序
  32. ksort($data);
  33. // 空字符串
  34. $param = '';
  35. // 循环参数对象,拼接url字符串
  36. foreach ( $data as $key => $value ) {
  37. // 如果键值为空(空字符串 空数组 空集合 空对象 字符串0 数字0 NULL FALSE),此参数省略;另 '000' 这类0组成的字符串 不为空
  38. if( strtolower($value) == 'false' || strtolower($value) == 'null' || empty($value) || ( is_numeric($value) && $value == 0 && substr_count($value,'.') == 1 ) ) continue;
  39. // 判断键值是否是数组,对象 ,如果是的话,键值转json字符串
  40. if( is_array( $value ) || is_object($value) ) $value = json_encode($value,JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
  41. // 如果键值为真则 键值转md5加密(此处小写) 为假则直接拼接,0特殊处理
  42. $param .= '&'.$key.'='.$value;
  43. }
  44. // 转码
  45. $param = ltrim($param,'&');
  46. // 解码
  47. $param = rawurldecode($param);
  48. // 拼接私钥数据
  49. $param .= '&key='.$appkey;
  50. // 数据加密(MD5后转大写)
  51. $data['sign'] = strtoupper(md5($param));
  52. // 验签通过
  53. return $data;
  54. }
  55. }