111
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 

70 righe
2.2 KiB

  1. <?php
  2. /**
  3. * @copyright (C)2016-2099 Hnaoyun Inc.
  4. * @author XingMeng
  5. * @email hnxsh@foxmail.com
  6. * @date 2018年4月22日
  7. * API公共控制类
  8. */
  9. namespace app\common;
  10. use core\basic\Controller;
  11. use core\basic\Config;
  12. class ApiController extends Controller
  13. {
  14. public function __construct()
  15. {
  16. // 自动缓存基础信息
  17. cache_lg();
  18. cache_config();
  19. $this->checkAccess($this->config());
  20. }
  21. /**
  22. * 客户端发起请求必须包含appid、timestamp、signature三个参数;
  23. * signature通过appid、secret、timestamp连接为一个字符串,然后进行双层md5加密生成;
  24. */
  25. public static function checkAccess($config)
  26. {
  27. if (! isset($config['api_open']) || ! $config['api_open']) {
  28. json(0, '系统尚未开启API功能,请到后台配置');
  29. }
  30. // 验证总开关
  31. if ($config['api_auth']) {
  32. // 判断用户
  33. if (! $config['api_appid']) {
  34. json(0, '请求失败:管理后台接口认证用户配置有误');
  35. }
  36. // 判断密钥
  37. if (! $config['api_secret']) {
  38. json(0, '请求失败:管理后台接口认证密钥配置有误');
  39. }
  40. // 获取参数
  41. if (! $appid = request('appid')) {
  42. json(0, '请求失败:未检查到appid参数');
  43. }
  44. if (! $timestamp = request('timestamp')) {
  45. json(0, '请求失败:未检查到timestamp参数');
  46. }
  47. if (! $signature = request('signature')) {
  48. json(0, '请求失败:未检查到signature参数');
  49. }
  50. // 验证时间戳
  51. if (strpos($_SERVER['HTTP_REFERER'], get_http_url()) === false && time() - $timestamp > 15) { // 请求时间戳认证,不得超过15秒
  52. json(0, '请求失败:接口时间戳验证失败!');
  53. }
  54. // 验证签名
  55. if ($signature != md5(md5($config['api_appid'] . $config['api_secret'] . $timestamp))) {
  56. error('请求失败:接口签名信息错误!');
  57. }
  58. }
  59. }
  60. }