1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
vkontakte.php
См. документацию.
1<?
3
5{
6 const ID = "VKontakte";
7 const CONTROLLER_URL = "https://www.bitrix24.ru/controller";
8
9 protected $entityOAuth = NULL;
10
11 public function GetSettings()
12 {
13 return array(
14 array("vkontakte_appid", GetMessage("socserv_vk_id"), "", Array("text", 40)),
15 array("vkontakte_appsecret", GetMessage("socserv_vk_key"), "", Array("text", 40)),
16 array("note" => GetMessage("socserv_vk_sett_note2", array('#URL#'=>$this->getEntityOAuth()->GetRedirectURI()))),
17 );
18 }
19
20 public function GetFormHtml($arParams)
21 {
22 $url = $this->getUrl($arParams);
23
24 $phrase = ($arParams["FOR_INTRANET"]) ? GetMessage("socserv_vk_note_intranet") : GetMessage("socserv_vk_note");
25 if ($arParams["FOR_INTRANET"])
26 return array("ON_CLICK" => 'onclick="BX.util.popup(\'' . htmlspecialcharsbx(CUtil::JSEscape($url)) . '\', 660, 425)"');
27
28 return '<a href="javascript:void(0)" onclick="BX.util.popup(\'' . htmlspecialcharsbx(CUtil::JSEscape($url)) . '\', 660, 425)" class="bx-ss-button vkontakte-button"></a><span class="bx-spacer"></span><span>' . $phrase . '</span>';
29 }
30
31 public function GetOnClickJs($arParams)
32 {
33 $url = $this->getUrl($arParams);
34
35 return "BX.util.popup('" . CUtil::JSEscape($url) . "', 660, 425)";
36 }
37
38 public function getUrl($arParams)
39 {
40 global $APPLICATION;
41
42 if (IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
43 {
44 $redirect_uri = self::CONTROLLER_URL . "/redirect.php";
45 // error, but this code is not working at all
46 $state = \CHTTP::URN2URI("/bitrix/tools/oauth/liveid.php") . "?state=";
47 $backurl = urlencode($APPLICATION->GetCurPageParam('check_key=' . \CSocServAuthManager::getUniqueKey(), array("logout", "auth_service_error", "auth_service_id", "backurl")));
48 $state .= urlencode(urlencode("backurl=" . $backurl));
49 }
50 else
51 {
52 $backurl = $APPLICATION->GetCurPageParam(
53 'check_key=' . \CSocServAuthManager::getUniqueKey(),
54 array("logout", "auth_service_error", "auth_service_id", "backurl")
55 );
56
57 $state = 'site_id=' . SITE_ID . '&backurl=' . urlencode($backurl) . (isset($arParams['BACKURL']) ? '&redirect_url=' . urlencode($arParams['BACKURL']) : '');
58 $redirect_uri = $this->getEntityOAuth()->GetRedirectURI();
59
60 }
61
62 return $this->getEntityOAuth()->GetAuthUrl($redirect_uri, $state);
63 }
64
65 public function getEntityOAuth($code = false)
66 {
67 if (!$this->entityOAuth)
68 {
69 $this->entityOAuth = new CVKontakteOAuthInterface();
70 }
71
72 if ($code !== false)
73 {
74 $this->entityOAuth->setCode($code);
75 }
76
77 return $this->entityOAuth;
78 }
79
80 public function prepareUser($arVkUser, $short = false)
81 {
82 $first_name = $last_name = $gender = "";
83
84 if ($arVkUser['response']['0']['first_name'] <> '')
85 {
86 $first_name = $arVkUser['response']['0']['first_name'];
87 }
88
89 if ($arVkUser['response']['0']['last_name'] <> '')
90 {
91 $last_name = $arVkUser['response']['0']['last_name'];
92 }
93
94 if (isset($arVkUser['response']['0']['sex']) && $arVkUser['response']['0']['sex'] != '')
95 {
96 if ($arVkUser['response']['0']['sex'] == '2')
97 $gender = 'M';
98 elseif ($arVkUser['response']['0']['sex'] == '1')
99 $gender = 'F';
100 }
101
102 $arFields = array(
103 'EXTERNAL_AUTH_ID' => self::ID,
104 'XML_ID' => $arVkUser['response']['0']['id'],
105 'LOGIN' => "VKuser" . $arVkUser['response']['0']['id'],
106 'EMAIL' => $this->entityOAuth->GetCurrentUserEmail(),
107 'NAME' => $first_name,
108 'LAST_NAME' => $last_name,
109 'PERSONAL_GENDER' => $gender,
110 'OATOKEN' => $this->entityOAuth->getToken(),
111 'OATOKEN_EXPIRES' => $this->entityOAuth->getAccessTokenExpires(),
112 );
113
114 if (isset($arVkUser['response']['0']['photo_max_orig']) && self::CheckPhotoURI($arVkUser['response']['0']['photo_max_orig']))
115 {
116 if (!$short)
117 {
118 $arPic = CFile::MakeFileArray($arVkUser['response']['0']['photo_max_orig']);
119 if ($arPic)
120 {
121 $arFields["PERSONAL_PHOTO"] = $arPic;
122 }
123 }
124
125 if (isset($arVkUser['response']['0']['bdate']))
126 {
127 if ($date = MakeTimeStamp($arVkUser['response']['0']['bdate'], "DD.MM.YYYY"))
128 {
129 $arFields["PERSONAL_BIRTHDAY"] = ConvertTimeStamp($date);
130 }
131 }
132
133 $arFields["PERSONAL_WWW"] = self::getProfileUrl($arVkUser['response']['0']['id']);
134
135 if (SITE_ID <> '')
136 {
137 $arFields["SITE_ID"] = SITE_ID;
138 }
139 }
140
141 return $arFields;
142 }
143
144 public function Authorize()
145 {
146 $GLOBALS["APPLICATION"]->RestartBuffer();
147 $bSuccess = SOCSERV_AUTHORISATION_ERROR;
148
149 $stateUnpacked = base64_decode($_REQUEST['state'] ?? '');
150 if ($stateUnpacked)
151 {
152 parse_str($stateUnpacked, $stateParams);
153 if ($stateParams && is_array($stateParams))
154 {
155 $_REQUEST = array_merge($_REQUEST, $stateParams);
156 }
157 }
158
159 if ((isset($_REQUEST["code"]) && $_REQUEST["code"] <> '') && CSocServAuthManager::CheckUniqueKey())
160 {
161 if (IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
162 $redirect_uri = self::CONTROLLER_URL . "/redirect.php";
163 else
164 $redirect_uri = $this->getEntityOAuth()->GetRedirectURI();
165
166 $this->entityOAuth = $this->getEntityOAuth($_REQUEST['code']);
167 if ($this->entityOAuth->GetAccessToken($redirect_uri) !== false)
168 {
169 $arVkUser = $this->entityOAuth->GetCurrentUser();
170 if (is_array($arVkUser) && ($arVkUser['response']['0']['id'] <> ''))
171 {
172 $arFields = $this->prepareUser($arVkUser);
173 $bSuccess = $this->AuthorizeUser($arFields);
174 }
175 }
176 }
177
178 $url = ($GLOBALS["APPLICATION"]->GetCurDir() == "/login/") ? "" : $GLOBALS["APPLICATION"]->GetCurDir();
179 $aRemove = array("logout", "auth_service_error", "auth_service_id", "code", "error_reason", "error", "error_description", "check_key", "current_fieldset");
180
181
182 if ($bSuccess === true && (isset($_REQUEST['backurl']) || isset($_REQUEST['redirect_url'])))
183 {
184 $parseUrl = parse_url(isset($_REQUEST['redirect_url']) ? $_REQUEST['redirect_url'] : $_REQUEST['backurl']);
185
186 $urlPath = $parseUrl["path"];
187 $arUrlQuery = explode('&', $parseUrl["query"]);
188
189 foreach ($arUrlQuery as $key => $value)
190 {
191 foreach ($aRemove as $param)
192 {
193 if (mb_strpos($value, $param."=") === 0)
194 {
195 unset($arUrlQuery[$key]);
196 break;
197 }
198 }
199 }
200 $url = (!empty($arUrlQuery)) ? $urlPath . '?' . implode("&", $arUrlQuery) : $urlPath;
201 }
202
203 if ($bSuccess === SOCSERV_REGISTRATION_DENY)
204 {
205 $url = (preg_match("/\?/", $url)) ? $url . '&' : $url . '?';
206 $url .= 'auth_service_id=' . self::ID . '&auth_service_error=' . $bSuccess;
207 }
208 elseif ($bSuccess !== true)
209 {
210 $url = (isset($urlPath)) ? $urlPath . '?auth_service_id=' . self::ID . '&auth_service_error=' . $bSuccess : $GLOBALS['APPLICATION']->GetCurPageParam(('auth_service_id=' . self::ID . '&auth_service_error=' . $bSuccess), $aRemove);
211 }
212
213 if (CModule::IncludeModule("socialnetwork") && mb_strpos($url, "current_fieldset=") === false)
214 {
215 $url = (preg_match("/\?/", $url)) ? $url . "&current_fieldset=SOCSERV" : $url . "?current_fieldset=SOCSERV";
216 }
217
218 echo '
219<script>
220if(window.opener)
221{
222 window.opener.location = \'' . CUtil::JSEscape($url) . '\';
223}
224window.close();
225</script>
226';
227 CMain::FinalActions();
228 }
229
230 public function setUser($userId)
231 {
232 $this->getEntityOAuth()->setUser($userId);
233 }
234
235 public function getFriendsList($limit, &$next)
236 {
237 if (IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
238 $redirect_uri = self::CONTROLLER_URL . "/redirect.php";
239 else
240 $redirect_uri = $this->getEntityOAuth()->GetRedirectURI();
241
242 $vk = $this->getEntityOAuth();
243 if ($vk->GetAccessToken($redirect_uri) !== false)
244 {
245 $res = $vk->getCurrentUserFriends($limit, $next);
246 if (is_array($res) && is_array($res['response']))
247 {
248 foreach ($res['response'] as $key => $contact)
249 {
250 $res['response'][$key]['name'] = $contact["first_name"];
251 $res['response'][$key]['url'] = "https://vk.com/id" . $contact["id"];
252 $res['response'][$key]['picture'] = $contact['photo_200_orig'];
253 }
254
255 return $res['response'];
256 }
257 }
258
259 return false;
260 }
261
262 public function sendMessage($uid, $message)
263 {
264 $vk = $this->getEntityOAuth();
265
266 if (IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
267 $redirect_uri = self::CONTROLLER_URL . "/redirect.php";
268 else
269 $redirect_uri = $this->getEntityOAuth()->GetRedirectURI();
270
271 if ($vk->GetAccessToken($redirect_uri) !== false)
272 {
273 $res = $vk->sendMessage($uid, $message);
274 }
275
276 return $res;
277 }
278
279 public function getProfileUrl($uid)
280 {
281 return "http://vk.com/id" . $uid;
282 }
283}
284
286{
287 const SERVICE_ID = "VKontakte";
288
289 // https://vk.com/dev/constant_version_updates
290 const AUTH_URL = "https://oauth.vk.com/authorize";
291 const TOKEN_URL = "https://oauth.vk.com/access_token";
292 const CONTACTS_URL = "https://api.vk.com/method/users.get";
293 const FRIENDS_URL = "https://api.vk.com/method/friends.get";
294 const MESSAGE_URL = "https://api.vk.com/method/messages.send";
295 const APP_URL = "https://api.vk.com/method/apps.get";
296 // https://vk.com/dev/versions
297 const API_VERSION = "5.107";
298
299 protected $userID = false;
300 protected $userEmail = false;
301
302 protected $scope = array(
303 "friends",
304 "offline",
305 "email",
306 );
307
308 public function __construct($appID = false, $appSecret = false, $code = false)
309 {
310 if ($appID === false)
311 {
312 $appID = trim(CSocServVKontakte::GetOption("vkontakte_appid"));
313 }
314
315 if ($appSecret === false)
316 {
317 $appSecret = trim(CSocServVKontakte::GetOption("vkontakte_appsecret"));
318 }
319
320 parent::__construct($appID, $appSecret, $code);
321 }
322
323 public function GetRedirectURI()
324 {
325 return \CHTTP::URN2URI("/bitrix/tools/oauth/vkontakte.php");
326 }
327
328 public function GetAuthUrl($redirect_uri, $state = '')
329 {
330 if ($state)
331 {
332 $state = base64_encode($state);
333 }
334
335 return self::AUTH_URL .
336 "?client_id=" . urlencode($this->appID) .
337 "&redirect_uri=" . urlencode($redirect_uri) .
338 "&scope=" . $this->getScopeEncode() .
339 "&response_type=code" .
340 ($state <> '' ? '&state=' . urlencode($state) : '');
341 }
342
343 public function GetAccessToken($redirect_uri)
344 {
345 $token = $this->getStorageTokens();
346 if (is_array($token))
347 {
348 $this->access_token = $token["OATOKEN"];
349
350 return true;
351 }
352
353 if ($this->code === false)
354 {
355 return false;
356 }
357
358 $query = array(
359 "client_id" => $this->appID,
360 "client_secret" => $this->appSecret,
361 "code" => $this->code,
362 "redirect_uri" => $redirect_uri,
363 );
364
365 $h = new \Bitrix\Main\Web\HttpClient(array(
366 "socketTimeout" => $this->httpTimeout,
367 "streamTimeout" => $this->httpTimeout,
368 ));
369
370 $result = $h->post(self::TOKEN_URL, $query);
371
372 try
373 {
375 } catch (\Bitrix\Main\ArgumentException $e)
376 {
377 $arResult = array();
378 }
379
380 foreach ($arResult as $key => $value)
381 {
382 if (mb_strpos($key, 'access_token_') === 0)
383 {
384 $this->access_token = $value;
385 $this->userID = null;
386 $this->userEmail = null;
387
388 $_SESSION["OAUTH_DATA"] = array("OATOKEN" => $this->access_token);
389 return true;
390 }
391 }
392
393 if ((isset($arResult["access_token"]) && $arResult["access_token"] <> '') && isset($arResult["user_id"]) && $arResult["user_id"] <> '')
394 {
395 $this->access_token = $arResult["access_token"];
396 $this->userID = $arResult["user_id"];
397 $this->userEmail = $arResult["email"];
398
399 $_SESSION["OAUTH_DATA"] = array("OATOKEN" => $this->access_token);
400
401 return true;
402 }
403
404 return false;
405 }
406
407 public function GetCurrentUser()
408 {
409 if ($this->access_token === false)
410 {
411 return false;
412 }
413
414 $h = new \Bitrix\Main\Web\HttpClient(array(
415 "socketTimeout" => $this->httpTimeout,
416 "streamTimeout" => $this->httpTimeout,
417 ));
418
419
420 $result = $h->get(self::CONTACTS_URL . '?v='.self::API_VERSION.'&fields=uid,first_name,last_name,nickname,screen_name,sex,bdate,city,country,timezone,photo,photo_medium,photo_max_orig,photo_rec,email&access_token=' . urlencode($this->access_token));
421
422 try
423 {
425 } catch (\Bitrix\Main\ArgumentException $e)
426 {
427 $result = array();
428 }
429
430 return $result;
431 }
432
433 public function GetAppInfo()
434 {
435 if ($this->access_token === false)
436 return false;
437
438 $h = new \Bitrix\Main\Web\HttpClient();
439 $h->setTimeout($this->httpTimeout);
440
441 $result = $h->get(self::APP_URL . '?v='.self::API_VERSION.'&fields=id&access_token=' . urlencode($this->access_token));
442
443 try
444 {
446 } catch (\Bitrix\Main\ArgumentException $e)
447 {
448 $result = array();
449 }
450
451 return $result['response']['items'][0];
452 }
453
454 public function GetCurrentUserEmail()
455 {
456 return $this->userEmail;
457 }
458
459 public function GetCurrentUserFriends($limit, &$next)
460 {
461 if ($this->access_token === false)
462 {
463 return false;
464 }
465
466 $url = self::FRIENDS_URL . '?v='.self::API_VERSION.'&uids=' . $this->userID . '&fields=uid,first_name,last_name,nickname,screen_name,photo_200_orig,contacts,email&access_token=' . urlencode($this->access_token);
467
468 if ($limit > 0)
469 {
470 $url .= "&count=" . intval($limit) . "&offset=" . intval($next);
471 }
472
473 $h = new \Bitrix\Main\Web\HttpClient();
474 $h->setTimeout($this->httpTimeout);
475
476 $result = $h->get($url);
477
478 try
479 {
481 } catch (\Bitrix\Main\ArgumentException $e)
482 {
483 $result = array();
484 }
485
486 $next = $limit + $next;
487
488 return $result;
489 }
490
491 public function sendMessage($uid, $message)
492 {
493 if ($this->access_token === false)
494 {
495 return false;
496 }
497
498 $url = self::MESSAGE_URL;
499
500 $arPost = array(
501 "user_id" => $uid,
502 "access_token" => $this->access_token,
503 "message" => $message,
504 );
505
506 $ob = new \Bitrix\Main\Web\HttpClient();
507
508 return $ob->post($url, $arPost);
509 }
510}
511
512?>
$arParams
Определения access_dialog.php:21
$arResult
Определения generate_coupon.php:16
change_password_forgot_link login popup forget pas AUTH_GOTO_FORGOT_FORM login btn wrap change_password_button login popup link login popup return auth javascript
Определения change_password.php:57
static decode($data)
Определения json.php:50
Определения authmanager.php:985
static GetOption($opt)
Определения authmanager.php:1339
getStorageTokens()
Определения oauthtransport.php:116
Определения vkontakte.php:5
const ID
Определения vkontakte.php:6
getProfileUrl($uid)
Определения vkontakte.php:279
GetSettings()
Определения vkontakte.php:11
$entityOAuth
Определения vkontakte.php:9
sendMessage($uid, $message)
Определения vkontakte.php:262
getEntityOAuth($code=false)
Определения vkontakte.php:65
getUrl($arParams)
Определения vkontakte.php:38
const CONTROLLER_URL
Определения vkontakte.php:7
GetFormHtml($arParams)
Определения vkontakte.php:20
const API_VERSION
Определения vkontakte.php:297
__construct($appID=false, $appSecret=false, $code=false)
Определения vkontakte.php:308
const CONTACTS_URL
Определения vkontakte.php:292
const TOKEN_URL
Определения vkontakte.php:291
GetAccessToken($redirect_uri)
Определения vkontakte.php:343
GetCurrentUser()
Определения vkontakte.php:407
GetCurrentUserEmail()
Определения vkontakte.php:454
const MESSAGE_URL
Определения vkontakte.php:294
const AUTH_URL
Определения vkontakte.php:290
const FRIENDS_URL
Определения vkontakte.php:293
GetCurrentUserFriends($limit, &$next)
Определения vkontakte.php:459
sendMessage($uid, $message)
Определения vkontakte.php:491
GetRedirectURI()
Определения vkontakte.php:323
GetAuthUrl($redirect_uri, $state='')
Определения vkontakte.php:328
const SERVICE_ID
Определения vkontakte.php:287
GetAppInfo()
Определения vkontakte.php:433
const APP_URL
Определения vkontakte.php:295
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
$result
Определения get_property_values.php:14
$query
Определения get_search.php:11
$uid
Определения hot_keys_act.php:8
IsModuleInstalled($module_id)
Определения tools.php:5301
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
$message
Определения payment.php:8
if(empty($signedUserToken)) $key
Определения quickway.php:257
const SITE_ID
Определения sonet_set_content_view.php:12
path
Определения template_copy.php:201
$url
Определения iframe.php:7