1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
odnoklassniki.php
См. документацию.
1<?
3
5{
6 const ID = "Odnoklassniki";
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("odnoklassniki_appid", GetMessage("socserv_odnoklassniki_client_id"), "", Array("text", 40)),
15 array("odnoklassniki_appkey", GetMessage("socserv_odnoklassniki_client_key"), "", Array("text", 40)),
16 array("odnoklassniki_appsecret", GetMessage("socserv_odnoklassniki_client_secret"), "", Array("text", 40)),
17 array("note"=>GetMessage("socserv_odnoklassniki_form_note", array('#URL#'=>\CHTTP::URN2URI("/bitrix/tools/oauth/odnoklassniki.php")))),
18 );
19 }
20
21 public function getEntityOAuth()
22 {
23 return $this->entityOAuth;
24 }
25
26 public function GetFormHtml($arParams)
27 {
28 $url = $this->getUrl('opener', null, $arParams);
29 $phrase = ($arParams["FOR_INTRANET"]) ? GetMessage("MAIN_OPTION_COMMENT1_INTRANET") : GetMessage("MAIN_OPTION_COMMENT1");
30
31 if($arParams["FOR_INTRANET"])
32 return array("ON_CLICK" => 'onclick="BX.util.popup(\''.htmlspecialcharsbx(CUtil::JSEscape($url)).'\', 580, 400)"');
33 return '<a href="javascript:void(0)" onclick="BX.util.popup(\''.htmlspecialcharsbx(CUtil::JSEscape($url)).'\', 580, 400)" class="bx-ss-button odnoklassniki-button"></a><span class="bx-spacer"></span><span>'.$phrase.'</span>';
34 }
35
36 public function GetOnClickJs($arParams)
37 {
38 $url = $this->getUrl('opener', null, $arParams);
39 return "BX.util.popup('".CUtil::JSEscape($url)."', 580, 400)";
40 }
41
42
43 public function getUrl($location = 'opener', $addScope = null, $arParams = array())
44 {
45 global $APPLICATION;
46
47 $this->entityOAuth = new COdnoklassnikiInterface();
48
49 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
50 {
51 $redirect_uri = self::CONTROLLER_URL."/redirect.php";
52 $state = \CHTTP::URN2URI("/bitrix/tools/oauth/odnoklassniki.php")."?state=";
53 $backurl = urlencode($GLOBALS["APPLICATION"]->GetCurPageParam('check_key='.\CSocServAuthManager::getUniqueKey(), array("logout", "auth_service_error", "auth_service_id", "backurl"))).'&mode='.$location;
54 $state .= urlencode(urlencode("backurl=".$backurl));
55 }
56 else
57 {
58 $backurl = $APPLICATION->GetCurPageParam(
59 'check_key='.\CSocServAuthManager::getUniqueKey(),
60 array("logout", "auth_service_error", "auth_service_id", "backurl")
61 );
62 $redirect_uri = \CHTTP::URN2URI("/bitrix/tools/oauth/odnoklassniki.php");
63 $state = 'site_id='.SITE_ID.'&backurl='.urlencode($backurl).(isset($arParams['BACKURL']) ? '&redirect_url='.urlencode($arParams['BACKURL']) : '').'&mode='.$location;
64 }
65
66 return $this->entityOAuth->GetAuthUrl($redirect_uri, $state);
67 }
68
69 public function Authorize()
70 {
71 global $APPLICATION;
72
73 $APPLICATION->RestartBuffer();
74 $bSuccess = SOCSERV_AUTHORISATION_ERROR;
75 $bProcessState = false;
76
77 if((isset($_REQUEST["code"]) && $_REQUEST["code"] <> '') && CSocServAuthManager::CheckUniqueKey())
78 {
79 $bProcessState = true;
80
81 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
82 $redirect_uri = self::CONTROLLER_URL."/redirect.php";
83 else
84 $redirect_uri= \CHTTP::URN2URI("/bitrix/tools/oauth/odnoklassniki.php");
85
86 $appID = trim(self::GetOption("odnoklassniki_appid"));
87 $appSecret = trim(self::GetOption("odnoklassniki_appsecret"));
88 $appKey = trim(self::GetOption("odnoklassniki_appkey"));
89
90 $gAuth = new COdnoklassnikiInterface($appID, $appSecret, $appKey, $_REQUEST["code"]);
91
92 if($gAuth->GetAccessToken($redirect_uri) !== false)
93 {
94 $arOdnoklUser = $gAuth->GetCurrentUser();
95
96 if(is_array($arOdnoklUser) && ($arOdnoklUser['uid'] <> ''))
97 {
98 $uid = $arOdnoklUser['uid'];
99 $first_name = $last_name = $gender = "";
100 if($arOdnoklUser['first_name'] <> '')
101 $first_name = $arOdnoklUser['first_name'];
102 if($arOdnoklUser['last_name'] <> '')
103 $last_name = $arOdnoklUser['last_name'];
104 if(isset($arOdnoklUser['gender']) && $arOdnoklUser['gender'] != '')
105 {
106 if($arOdnoklUser['gender'] == 'male')
107 $gender = 'M';
108 elseif($arOdnoklUser['gender'] == 'female')
109 $gender = 'F';
110 }
111
112 $arFields = array(
113 'EXTERNAL_AUTH_ID' => self::ID,
114 'XML_ID' => "OK".$uid,
115 'LOGIN' => "OKuser".$uid,
116 'NAME'=> $first_name,
117 'LAST_NAME'=> $last_name,
118 'PERSONAL_GENDER' => $gender,
119 );
120 if(isset($arOdnoklUser['birthday']))
121 if($date = MakeTimeStamp($arOdnoklUser['birthday'], "YYYY-MM-DD"))
122 $arFields["PERSONAL_BIRTHDAY"] = ConvertTimeStamp($date);
123 if(isset($arOdnoklUser['pic_2']) && self::CheckPhotoURI($arOdnoklUser['pic_2']))
124 {
125 if($arPic = CFile::MakeFileArray($arOdnoklUser['pic_2']))
126 {
127 $arPic['name'] = md5($arOdnoklUser['pic_2']).'.jpg';
128 $arFields["PERSONAL_PHOTO"] = $arPic;
129 }
130 }
131 $arFields["PERSONAL_WWW"] = "http://odnoklassniki.ru/profile/".$uid;
132 if(SITE_ID <> '')
133 $arFields["SITE_ID"] = SITE_ID;
134
135 $bSuccess = $this->AuthorizeUser($arFields);
136 }
137 }
138 }
139
140 if(!$bProcessState)
141 {
142 unset($_REQUEST["state"]);
143 }
144
145 $url = ($APPLICATION->GetCurDir() == "/login/") ? "" : $APPLICATION->GetCurDir();
146 $aRemove = array("logout", "auth_service_error", "auth_service_id", "code", "error_reason", "error", "error_description", "check_key", "current_fieldset");
147
148 $mode = 'opener';
149 if(isset($_REQUEST["state"]))
150 {
151 $arState = array();
152 parse_str($_REQUEST["state"], $arState);
153 if(isset($arState['backurl']) || isset($arState['redirect_url']))
154 {
155 $parseUrl = parse_url(!empty($arState['redirect_url']) ? $arState['redirect_url'] : $arState['backurl']);
156 $urlPath = $parseUrl["path"];
157 $arUrlQuery = explode('&', $parseUrl["query"]);
158
159 foreach($arUrlQuery as $key => $value)
160 {
161 foreach($aRemove as $param)
162 {
163 if(mb_strpos($value, $param."=") === 0)
164 {
165 unset($arUrlQuery[$key]);
166 break;
167 }
168 }
169 }
170
171 $url = (!empty($arUrlQuery)) ? $urlPath.'?'.implode("&", $arUrlQuery) : $urlPath;
172 }
173
174 if(isset($arState['mode']))
175 {
176 $mode = $arState['mode'];
177 }
178 }
179
180 if($bSuccess === SOCSERV_REGISTRATION_DENY)
181 {
182 $url = (preg_match("/\?/", $url)) ? $url.'&' : $url.'?';
183 $url .= 'auth_service_id='.self::ID.'&auth_service_error='.SOCSERV_REGISTRATION_DENY;
184 }
185 elseif($bSuccess !== true)
186 {
187 $url = (isset($parseUrl))
188 ? $urlPath.'?auth_service_id='.self::ID.'&auth_service_error='.$bSuccess
189 : $APPLICATION->GetCurPageParam(('auth_service_id='.self::ID.'&auth_service_error='.$bSuccess), $aRemove);
190 }
191
192 if(CModule::IncludeModule("socialnetwork") && mb_strpos($url, "current_fieldset=") === false)
193 $url = (preg_match("/\?/", $url)) ? $url."&current_fieldset=SOCSERV" : $url."?current_fieldset=SOCSERV";
194
195 $url = CUtil::JSEscape($url);
196 $location = ($mode == "opener") ? 'if(window.opener) window.opener.location = \''.$url.'\'; window.close();' : ' window.location = \''.$url.'\';';
197
198 $JSScript = '
199 <script>
200 '.$location.'
201 </script>
202 ';
203
204 echo $JSScript;
205
206 CMain::FinalActions();
207 }
208
209 public static function SendUserFeed($userId, $message)
210 {
211 $appID = trim(self::GetOption("odnoklassniki_appid"));
212 $appSecret = trim(self::GetOption("odnoklassniki_appsecret"));
213 $appKey = trim(self::GetOption("odnoklassniki_appkey"));
214 $gAuth = new COdnoklassnikiInterface($appID, $appSecret, $appKey);
215 $result = $gAuth->SendFeed($userId, $message);
216 return $result;
217 }
218
219}
220
221class COdnoklassnikiInterface
222{
223 const AUTH_URL = "https://www.odnoklassniki.ru/oauth/authorize";
224 const TOKEN_URL = "https://api.odnoklassniki.ru/oauth/token.do";
225 const CONTACTS_URL = "https://api.odnoklassniki.ru/fb.do";
226
227 protected $appID;
228 protected $appSecret;
229 protected $appKey;
230 protected $code = false;
231 protected $access_token = false;
232 protected $sign = false;
233 protected $refresh_token = '';
234 protected $userId = 0;
235
236 public function __construct($appID = false, $appSecret = false, $appKey = false, $code=false)
237 {
238 if($appID === false)
239 {
240 $appID = trim(CSocServLiveIDOAuth::GetOption("odnoklassniki_appid"));
241 }
242
243 if($appSecret === false)
244 {
245 $appSecret = trim(CSocServLiveIDOAuth::GetOption("odnoklassniki_appsecret"));
246 }
247
248 if($appKey === false)
249 {
250 $appKey = trim(CSocServLiveIDOAuth::GetOption("odnoklassniki_appkey"));
251 }
252
253 $this->httpTimeout = SOCSERV_DEFAULT_HTTP_TIMEOUT;
254 $this->appID = $appID;
255 $this->appSecret = $appSecret;
256 $this->code = $code;
257 $this->appKey = $appKey;
258 }
259
260 public function GetAuthUrl($redirect_uri, $state='')
261 {
262 return self::AUTH_URL.
263 "?client_id=".urlencode($this->appID).
264 "&redirect_uri=".urlencode($redirect_uri).
265 "&response_type=code".
266 ($state <> ''? '&state='.urlencode($state):'');
267 }
268
269 public function GetAccessToken($redirect_uri)
270 {
271 if($this->code === false)
272 return false;
273
274 $result = CHTTP::sPostHeader(self::TOKEN_URL, array(
275 "code"=>$this->code,
276 "client_id"=>$this->appID,
277 "client_secret"=>$this->appSecret,
278 "redirect_uri"=>$redirect_uri,
279 "grant_type"=>"authorization_code",
280 ), array(), $this->httpTimeout);
281
282 $arResult = CUtil::JsObjectToPhp($result);
283
284 if(isset($arResult["access_token"]) && $arResult["access_token"] <> '')
285 {
286 $this->access_token = $arResult["access_token"];
287 $_SESSION["OAUTH_DATA"] = array("OATOKEN" => $this->access_token);
288 if(isset($arResult["refresh_token"]) && $arResult["refresh_token"] <> '')
289 {
290 $this->refresh_token = $arResult["refresh_token"];
291 $_SESSION["OAUTH_DATA"]["REFRESH_TOKEN"] = $this->refresh_token;
292 }
293
294 $arguments = array();
295 $arguments["application_key"] = $this->appKey;
296 $arguments['method'] = 'users.getCurrentUser';
297 ksort($arguments);
298 $this->sign = mb_strtolower(md5('application_key='.$arguments["application_key"].'method='.$arguments['method'].md5($this->access_token.$this->appSecret)));
299 return true;
300 }
301 return false;
302 }
303
304 public function GetCurrentUser()
305 {
306 if($this->access_token === false)
307 return false;
308
309 $result = CHTTP::sGetHeader(self::CONTACTS_URL."?method=users.getCurrentUser&application_key=".$this->appKey."&access_token=".$this->access_token."&sig=".$this->sign, array(), $this->httpTimeout);
310
311 return CUtil::JsObjectToPhp($result);
312 }
313
314 public function SendFeed($socServUserId, $message, $getNewToken=true)
315 {
316 if(!$this->access_token || intval($this->userId) < 1)
317 self::SetOauthKeys($socServUserId);
318
319 $this->sign = mb_strtolower(md5('application_key='.$this->appKey.'method=users.setStatusstatus='.$message.md5($this->access_token.$this->appSecret)));
320 $result = CHTTP::sGetHeader(self::CONTACTS_URL."?method=users.setStatus&application_key=".$this->appKey."&access_token=".$this->access_token."&sig=".$this->sign."&status=".urlencode($message), array(), $this->httpTimeout);
321
322 $arResult = CUtil::JsObjectToPhp($result);
323 if($getNewToken === true && isset($arResult["error_code"]) && $arResult["error_code"] == "102")
324 {
325 $newToken = self::RefreshToken($socServUserId);
326 if($newToken === true)
327 self::SendFeed($socServUserId, $message, false);
328 else
329 return false;
330 }
331 return $arResult;
332 }
333
334 private function SetOauthKeys($socServUserId)
335 {
336 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
337 'filter' => ['=ID' => $socServUserId],
338 'select' => ["OATOKEN", "XML_ID", "REFRESH_TOKEN"]
339 ]);
340 while($arOauth = $dbSocservUser->fetch())
341 {
342 $this->access_token = $arOauth["OATOKEN"];
343 $this->userId = preg_replace("|\D|", '', $arOauth["XML_ID"]);
344 $this->refresh_token = $arOauth["REFRESH_TOKEN"];
345 }
346 }
347
348 private function RefreshToken($socServUserId)
349 {
350 $result = CHTTP::sPostHeader(self::TOKEN_URL, array(
351 "refresh_token"=>$this->refresh_token,
352 "client_id"=>$this->appID,
353 "client_secret"=>$this->appSecret,
354 "grant_type"=>"refresh_token",
355 ), array(), $this->httpTimeout);
356 $arResult = CUtil::JsObjectToPhp($result);
357
358 if(isset($arResult["access_token"]) && $arResult["access_token"] <> '')
359 {
360 $this->access_token = $arResult["access_token"];
361 \Bitrix\Socialservices\UserTable::update($socServUserId, array("OATOKEN" => $arResult["access_token"]));
362 return true;
363 }
364 return false;
365 }
366}
367?>
$arParams
Определения access_dialog.php:21
return select
Определения access_edit.php:440
global $APPLICATION
Определения include.php:80
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 URN2URI($urn, $server_name='')
Определения http.php:39
Определения authmanager.php:985
AuthorizeUser($socservUserFields, $bSave=false)
Определения authmanager.php:1395
const ID
Определения odnoklassniki.php:6
GetSettings()
Определения odnoklassniki.php:11
getEntityOAuth()
Определения odnoklassniki.php:21
const CONTROLLER_URL
Определения odnoklassniki.php:7
getUrl($location='opener', $addScope=null, $arParams=array())
Определения odnoklassniki.php:43
GetFormHtml($arParams)
Определения odnoklassniki.php:26
$arFields
Определения dblapprove.php:5
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
<? if( $useEditor3):?>< tr class="heading">< td colspan="2"><? echo GetMessage("FILEMAN_OPTION_SPELL_SET");?></td ></tr ><? if(function_exists( 'pspell_config_create')):$use_pspell_checked=(COption::GetOptionString( $module_id, "use_pspell", "Y")=="Y") ? "checked" :"";?>< tr >< td valign="top">< label for="use_pspell"><?echo GetMessage("FILEMAN_OPTION_USE_PSPELL");?></label >< br >< a title="<?echo GetMessage("FILEMAN_OPTION_ADDISH_DICS_TITLE");?> http
Определения options.php:1473
$_REQUEST["admin_mnu_menu_id"]
Определения get_menu.php:8
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
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
$location
Определения options.php:2729
const SOCSERV_REGISTRATION_DENY
Определения include.php:4
const SITE_ID
Определения sonet_set_content_view.php:12
$url
Определения iframe.php:7