Client.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <?php
  2. /**
  3. *
  4. * @link http://duoshuo.com/
  5. * @author shen2
  6. *
  7. */
  8. class Duoshuo_Client{
  9. var $end_point = 'http://api.duoshuo.com/';
  10. var $format = 'json';
  11. var $userAgent;
  12. var $shortName;
  13. var $secret;
  14. var $jwt;
  15. var $accessToken;
  16. var $http;
  17. public function __construct($shortName = null, $secret = null, $jwt = null, $accessToken = null){
  18. global $wp_version;
  19. $this->shortName = $shortName;
  20. $this->secret = $secret;
  21. $this->jwt = $jwt;
  22. $this->accessToken = $accessToken;
  23. $this->http = new WP_Http();
  24. $this->userAgent = 'WordPress/' . $wp_version . '|Duoshuo/'. Duoshuo_WordPress::VERSION;
  25. }
  26. /**
  27. *
  28. * @param $method
  29. * @param $path
  30. * @param $params
  31. * @throws Duoshuo_Exception
  32. * @return array
  33. */
  34. public function request($method, $path, $params = array()){
  35. $params['short_name'] = $this->shortName;
  36. $params['secret'] = $this->secret;
  37. if ($this->jwt)
  38. $params['jwt'] = $this->jwt;
  39. if ($this->accessToken)
  40. $params['access_token'] = $this->accessToken;
  41. $url = $this->end_point . $path. '.' . $this->format;
  42. return $this->httpRequest($url, $method, $params);
  43. }
  44. public function httpRequest($url, $method, $params){
  45. $args = array(
  46. 'method' => $method,
  47. 'timeout' => 60,
  48. 'redirection' => 5,
  49. 'httpversion' => '1.0',
  50. 'user-agent' => $this->userAgent,
  51. //'blocking' => true,
  52. 'headers' => array('Expect'=>''),
  53. //'cookies' => array(),
  54. //'compress' => false,
  55. //'decompress' => true,
  56. 'sslverify' => false,
  57. //'stream' => false,
  58. //'filename' => null
  59. );
  60. switch($method){
  61. case 'GET':
  62. $url .= '?' . http_build_query($params, null, '&'); // overwrite arg_separator.output
  63. break;
  64. case 'POST':
  65. $args['body'] = $params; // http类自己会做 http_build_query($params, null, '&') 并指定Content-Type
  66. break;
  67. default:
  68. }
  69. $response = $this->http->request($url, $args);
  70. if (isset($response->errors)){
  71. if (isset($response->errors['http_request_failed'])){
  72. $message = $response->errors['http_request_failed'][0];
  73. if ($message == 'name lookup timed out')
  74. $message = 'DNS解析超时,请重试或检查你的主机的域名解析(DNS)设置。';
  75. elseif (stripos($message, 'Could not open handle for fopen') === 0)
  76. $message = '无法打开fopen句柄,请重试或联系多说管理员。http://dev.duoshuo.com/';
  77. elseif (stripos($message, 'Couldn\'t resolve host') === 0)
  78. $message = '无法解析duoshuo.com域名,请重试或检查你的主机的域名解析(DNS)设置。';
  79. elseif (stripos($message, 'Operation timed out after ') === 0)
  80. $message = '操作超时,请重试或联系多说管理员。http://dev.duoshuo.com/';
  81. throw new Duoshuo_Exception($message, Duoshuo_Exception::REQUEST_TIMED_OUT);
  82. }
  83. else
  84. throw new Duoshuo_Exception('连接服务器失败, 详细信息:' . json_encode($response->errors), Duoshuo_Exception::REQUEST_TIMED_OUT);
  85. }
  86. $json = json_decode($response['body'], true);
  87. return $json === null ? $response['body'] : $json;
  88. }
  89. /**
  90. *
  91. * @param string $type
  92. * @param array $keys
  93. */
  94. public function getAccessToken( $type, $keys ) {
  95. $params = array(
  96. 'client_id' => $this->shortName,
  97. 'client_secret' => $this->secret,
  98. );
  99. switch($type){
  100. case 'token':
  101. $params['grant_type'] = 'refresh_token';
  102. $params['refresh_token'] = $keys['refresh_token'];
  103. break;
  104. case 'code':
  105. $params['grant_type'] = 'authorization_code';
  106. $params['code'] = $keys['code'];
  107. $params['redirect_uri'] = $keys['redirect_uri'];
  108. break;
  109. case 'password':
  110. $params['grant_type'] = 'password';
  111. $params['username'] = $keys['username'];
  112. $params['password'] = $keys['password'];
  113. break;
  114. default:
  115. throw new Duoshuo_Exception("wrong auth type");
  116. }
  117. $accessTokenUrl = $this->end_point . 'oauth2/access_token';
  118. $response = $this->httpRequest($accessTokenUrl, 'POST', $params);
  119. $token = $response;
  120. if ( is_array($token) && !isset($token['error']) ) {
  121. $this->access_token = $token['access_token'];
  122. if (isset($token['refresh_token'])) // 可能没有refresh_token
  123. $this->refresh_token = $token['refresh_token'];
  124. } else {
  125. throw new Duoshuo_Exception("get access token failed." . $token['error']);
  126. }
  127. return $token;
  128. }
  129. }