PageRenderTime 47ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/sale/lib/rest/synchronization/client.php

https://gitlab.com/alexprowars/bitrix
PHP | 224 lines | 189 code | 35 blank | 0 comment | 16 complexity | d73f26ecabc1684dfa9e466a7a023f28 MD5 | raw file
  1. <?php
  2. namespace Bitrix\Sale\Rest\Synchronization;
  3. use Bitrix\Main\ArgumentException;
  4. use Bitrix\Main\Error;
  5. use Bitrix\Main\Loader;
  6. use Bitrix\Main\SystemException;
  7. use Bitrix\Main\Text\Encoding;
  8. use Bitrix\Main\Web\HttpClient;
  9. use Bitrix\Main\Web\Json;
  10. use Bitrix\Rest\OAuthService;
  11. use Bitrix\Sale\Result;
  12. class Client
  13. {
  14. protected $clientId;
  15. protected $clientSecret;
  16. protected $serviceUrl;
  17. protected $refreshToken;
  18. const HTTP_SOCKET_TIMEOUT = 10;
  19. const HTTP_STREAM_TIMEOUT = 10;
  20. const SERVICE_PATH = "/rest/";
  21. const B24_APP_GRANT_TYPE = 'refresh_token';
  22. public function __construct($clientId, $clientSecret, $serviceUrl)
  23. {
  24. $this->clientId = $clientId;
  25. $this->clientSecret = $clientSecret;
  26. $this->serviceUrl = $serviceUrl;
  27. }
  28. protected function getHttpClient()
  29. {
  30. return new HttpClient(array(
  31. 'socketTimeout' => static::HTTP_SOCKET_TIMEOUT,
  32. 'streamTimeout' => static::HTTP_STREAM_TIMEOUT,
  33. ));
  34. }
  35. protected function getRequestUrl($methodName)
  36. {
  37. return $this->serviceUrl.self::SERVICE_PATH.$methodName;
  38. }
  39. public function call($methodName, $additionalParams=[])
  40. {
  41. $result = new Result();
  42. if($this->clientId && $this->clientSecret)
  43. {
  44. $httpClient = $this->getHttpClient();
  45. $additionalParams = $this->prepareRequest($additionalParams);
  46. LoggerDiag::addMessage('CLIENT_CALL_REQUEST', var_export([
  47. 'getRequestUrl'=>$this->getRequestUrl($methodName),
  48. 'additionalParams'=>$additionalParams,
  49. ], true));
  50. $httpResult = $httpClient->post(
  51. $this->getRequestUrl($methodName),
  52. $additionalParams
  53. );
  54. LoggerDiag::addMessage('CLIENT_CALL_PROCESS_RESULT', var_export([
  55. 'result'=>$httpResult,
  56. 'status'=>$httpClient->getStatus()
  57. ], true));
  58. $respons = $this->prepareResponse($httpResult);
  59. if($respons)
  60. {
  61. LoggerDiag::addMessage('CLIENT_CALL_PROCESS_RESULT_SUCCESS');
  62. if(isset($respons['error']))
  63. {
  64. $result->addError(new Error($respons['error_description'], mb_strtoupper($respons['error'])));
  65. LoggerDiag::addMessage('CLIENT_CALL_RESULT_ERROR');
  66. }
  67. else
  68. {
  69. $result->setData(['DATA'=>$respons]);
  70. LoggerDiag::addMessage('CLIENT_CALL_RESULT_SUCCESS', var_export($respons, true));
  71. }
  72. }
  73. else
  74. {
  75. $result->addError(new Error('Strange answer from Bitrix Service! '.$httpResult, 'STRANGE_ANSWER'));
  76. LoggerDiag::addMessage('CLIENT_CALL_PROCESS_RESULT_ERROR');
  77. }
  78. }
  79. else
  80. {
  81. $result->addError(new Error('No client credentials for refresh token'));
  82. LoggerDiag::addMessage('CLIENT_CALL_CLIENT_ID_EMPTY');
  83. }
  84. return $result;
  85. }
  86. protected function prepareResponse($result)
  87. {
  88. try
  89. {
  90. return Json::decode($result);
  91. }
  92. catch(ArgumentException $e)
  93. {
  94. return false;
  95. }
  96. }
  97. protected function prepareRequest($params)
  98. {
  99. if(!is_array($params))
  100. {
  101. $params = array();
  102. }
  103. else
  104. {
  105. $params = Encoding::convertEncoding($params, LANG_CHARSET, "utf-8");
  106. }
  107. return $params;
  108. }
  109. public function refreshToken($refreshToken)
  110. {
  111. $result = new Result();
  112. if($refreshToken=='')
  113. {
  114. $result->addError(new Error('Refresh token is empty'));
  115. LoggerDiag::addMessage('CLIENT_REFRESH_TOKEN_EMPTY');
  116. }
  117. if(!$this->clientId || !$this->clientSecret)
  118. {
  119. $result->addError(new Error('No client credentials for refresh token'));
  120. LoggerDiag::addMessage('CLIENT_REFRESH_TOKEN_CLIENT_ID_EMPTY');
  121. }
  122. if($result->isSuccess())
  123. {
  124. $request = OAuthService::SERVICE_URL.'/oauth/token/'.'?'.http_build_query(
  125. [
  126. 'grant_type'=>self::B24_APP_GRANT_TYPE,
  127. 'client_id'=>$this->clientId,
  128. 'client_secret'=>$this->clientSecret,
  129. 'refresh_token'=>$refreshToken
  130. ]);
  131. LoggerDiag::addMessage('CLIENT_REFRESH_TOKEN_REQUEST', var_export($request,true));
  132. $httpClient = $this->getHttpClient();
  133. $httpResult = $httpClient->get($request);
  134. LoggerDiag::addMessage('CLIENT_REFRESH_TOKEN_PROCESS_RESULT', var_export([
  135. 'result'=>$httpResult,
  136. 'status'=>$httpClient->getStatus()
  137. ], true));
  138. $respons = $this->prepareResponse($httpResult);
  139. if($respons)
  140. {
  141. LoggerDiag::addMessage('CLIENT_REFRESH_TOKEN_PROCESS_RESULT_SUCCESS');
  142. if(isset($respons['error']))
  143. {
  144. $result->addError(new Error($respons['error_description'], mb_strtoupper($respons['error'])));
  145. LoggerDiag::addMessage('CLIENT_REFRESH_TOKEN_RESULT_ERROR');
  146. }
  147. else
  148. {
  149. $result->setData(['DATA'=>$respons]);
  150. LoggerDiag::addMessage('CLIENT_REFRESH_TOKEN_RESULT_SUCCESS', var_export($respons, true));
  151. }
  152. }
  153. else
  154. {
  155. $result->addError(new Error('Strange answer from Bitrix Service! ', 'STRANGE_ANSWER_REFRESH_TOKEN'));
  156. LoggerDiag::addMessage('CLIENT_REFRESH_TOKEN_PROCESS_RESULT_ERROR');
  157. }
  158. }
  159. return $result;
  160. }
  161. public function checkAccessToken($accessToken)
  162. {
  163. $result = new Result();
  164. if(!Loader::includeModule('rest'))
  165. $result->addError(new Error('Module REST is not included'));
  166. if($result->isSuccess())
  167. {
  168. if(!\Bitrix\Rest\OAuthService::getEngine()->isRegistered())
  169. {
  170. try
  171. {
  172. \Bitrix\Rest\OAuthService::register();
  173. }
  174. catch(\Bitrix\Main\SystemException $e)
  175. {
  176. $result->addError(new Error('OAuthServiceError', ' OAUTH_SERVICE_ERROR'));
  177. }
  178. }
  179. if($result->isSuccess())
  180. {
  181. $client = \Bitrix\Rest\OAuthService::getEngine()->getClient();
  182. $respons = $client->call('app.info', ['auth' => $accessToken]);
  183. if(isset($respons['error']))
  184. $result->addError(new Error($respons['error_description'], mb_strtoupper($respons['error'])));
  185. }
  186. }
  187. return $result;
  188. }
  189. }