connect.inc.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: connect.inc.php 35931 2016-05-13 03:05:05Z nemohou $
  7. */
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. $op = !empty($_GET['op']) ? $_GET['op'] : '';
  12. if(!in_array($op, array('init', 'callback'))) {
  13. showmessage('undefined_action');
  14. }
  15. $_G['connect']['callback_url'] = $_G['siteurl'].'plugin.php?id=wechat:connect&op=callback';
  16. parse_str(substr($_GET['referer'], 1), $refererarray);
  17. $referer = 'http://wsq.discuz.com/'.$_GET['referer'];
  18. try {
  19. $connectOAuthClient = Cloud::loadClass('Service_Client_ConnectOAuth');
  20. } catch(Exception $e) {
  21. showmessage('qqconnect:connect_app_invalid');
  22. }
  23. if($op == 'init') {
  24. if($_G['member']['conisbind'] && $_GET['reauthorize']) {
  25. if($_GET['formhash'] == FORMHASH) {
  26. $connectService->connectMergeMember();
  27. } else {
  28. showmessage('submit_invalid');
  29. }
  30. }
  31. $callback = $_G['connect']['callback_url'] . '&referer=' . urlencode($_GET['referer']) . (!empty($_GET['isqqshow']) ? '&isqqshow=yes' : '');
  32. if(!$_G['setting']['connect']['oauth2']) {
  33. dsetcookie('con_request_token');
  34. dsetcookie('con_request_token_secret');
  35. try {
  36. $response = $connectOAuthClient->connectGetRequestToken($callback);
  37. } catch(Exception $e) {
  38. showmessage('qqconnect:connect_get_request_token_failed_code', $referer, array('codeMessage' => getErrorMessage($e->getmessage()), 'code' => $e->getmessage()));
  39. }
  40. $request_token = $response['oauth_token'];
  41. $request_token_secret = $response['oauth_token_secret'];
  42. dsetcookie('con_request_token', $request_token);
  43. dsetcookie('con_request_token_secret', $request_token_secret);
  44. $redirect = $connectOAuthClient->getOAuthAuthorizeURL($request_token);
  45. if(defined('IN_MOBILE') || $_GET['oauth_style'] == 'mobile') {
  46. $redirect .= '&oauth_style=mobile';
  47. }
  48. } else {
  49. try {
  50. dsetcookie('con_request_uri', $callback);
  51. $redirect = $connectOAuthClient->getOAuthAuthorizeURL_V2($callback);
  52. if(defined('IN_MOBILE') || $_GET['oauth_style'] == 'mobile') {
  53. $redirect .= '&display=mobile';
  54. }
  55. } catch(Exception $e) {
  56. showmessage('qqconnect:connect_get_request_token_failed_code', $referer, array('codeMessage' => getErrorMessage($e->getmessage()), 'code' => $e->getmessage()));
  57. }
  58. }
  59. dheader('Location:' . $redirect);
  60. } elseif($op == 'callback') {
  61. $params = $_GET;
  62. if(!isset($params['receive'])) {
  63. $utilService = Cloud::loadClass('Service_Util');
  64. echo '<script type="text/javascript">setTimeout("window.location.href=\'plugin.php?receive=yes&'.str_replace("'", "\'", $utilService->httpBuildQuery($_GET, '', '&')).'\'", 1)</script>';
  65. exit;
  66. }
  67. if(!$_G['setting']['connect']['oauth2']) {
  68. try {
  69. $response = $connectOAuthClient->connectGetAccessToken($params, $_G['cookie']['con_request_token_secret']);
  70. } catch(Exception $e) {
  71. showmessage('qqconnect:connect_get_access_token_failed_code', $referer, array('codeMessage' => getErrorMessage($e->getmessage()), 'code' => $e->getmessage()));
  72. }
  73. dsetcookie('con_request_token');
  74. dsetcookie('con_request_token_secret');
  75. $conuin = $response['oauth_token'];
  76. $conuinsecret = $response['oauth_token_secret'];
  77. $conopenid = strtoupper($response['openid']);
  78. if(!$conuin || !$conuinsecret || !$conopenid) {
  79. showmessage('qqconnect:connect_get_access_token_failed_code', $referer);
  80. }
  81. } else {
  82. if($_GET['state'] != md5(FORMHASH)){
  83. showmessage('qqconnect:connect_get_access_token_failed', $referer);
  84. }
  85. try {
  86. $response = $connectOAuthClient->connectGetOpenId_V2($_G['cookie']['con_request_uri'], $_GET['code']);
  87. } catch(Exception $e) {
  88. showmessage('qqconnect:connect_get_access_token_failed_code', $referer, array('codeMessage' => getErrorMessage($e->getmessage()), 'code' => $e->getmessage()));
  89. }
  90. dsetcookie('con_request_token');
  91. dsetcookie('con_request_token_secret');
  92. $conuintoken = $response['access_token'];
  93. $conopenid = strtoupper($response['openid']);
  94. if(!$conuintoken || !$conopenid) {
  95. showmessage('qqconnect:connect_get_access_token_failed', $referer);
  96. }
  97. }
  98. loadcache('connect_blacklist');
  99. if(in_array($conopenid, array_map('strtoupper', $_G['cache']['connect_blacklist']))) {
  100. $change_qq_url = $_G['connect']['discuz_change_qq_url'];
  101. showmessage('qqconnect:connect_uin_in_blacklist', $referer, array('changeqqurl' => $change_qq_url));
  102. }
  103. if($params['uin']) {
  104. $old_conuin = $params['uin'];
  105. }
  106. $is_notify = true;
  107. $conispublishfeed = 0;
  108. $conispublisht = 0;
  109. $is_user_info = 1;
  110. $is_feed = 1;
  111. $user_auth_fields = 1;
  112. $cookie_expires = 2592000;
  113. dsetcookie('client_created', TIMESTAMP, $cookie_expires);
  114. dsetcookie('client_token', $conopenid, $cookie_expires);
  115. $connect_member = array();
  116. $fields = array('uid', 'conuin', 'conuinsecret', 'conopenid');
  117. if($old_conuin) {
  118. $connect_member = C::t('#qqconnect#common_member_connect')->fetch_fields_by_openid($old_conuin, $fields);
  119. }
  120. if(empty($connect_member)) {
  121. $connect_member = C::t('#qqconnect#common_member_connect')->fetch_fields_by_openid($conopenid, $fields);
  122. }
  123. if($connect_member) {
  124. $member = getuserbyuid($connect_member['uid']);
  125. if($member) {
  126. if(!$member['conisbind']) {
  127. C::t('#qqconnect#common_member_connect')->delete($connect_member['uid']);
  128. unset($connect_member);
  129. } else {
  130. $connect_member['conisbind'] = $member['conisbind'];
  131. }
  132. } else {
  133. C::t('#qqconnect#common_member_connect')->delete($connect_member['uid']);
  134. unset($connect_member);
  135. }
  136. $connect_is_unbind = $params['is_unbind'] == 1 ? 1 : 0;
  137. require_once DISCUZ_ROOT.'./source/plugin/wechat/wsq.class.php';
  138. if(method_exists('wsq', 'userloginUrl')) {
  139. $_source = isset($refererarray['_source']) ? $refererarray['_source'] : '';
  140. if(!$_source && !empty($refererarray['openid']) && !empty($refererarray['openidsign'])) {
  141. $loginUrl = wsq::userloginUrl($connect_member['uid'], $refererarray['openid'], $refererarray['openidsign']);
  142. if(!C::t('#wechat#common_member_wechatmp')->fetch($connect_member['uid'])) {
  143. C::t('#wechat#common_member_wechatmp')->insert(array('uid' => $connect_member['uid'], 'openid' => $refererarray['openid'], 'status' => 1), false, true);
  144. }
  145. } else {
  146. $loginUrl = wsq::userloginUrl2($_G['uid']);
  147. }
  148. $referer .= '&loginUrl='.urlencode($loginUrl);
  149. }
  150. C::t('#qqconnect#common_member_connect')->update($connect_member['uid'],
  151. !$_G['setting']['connect']['oauth2'] ? array(
  152. 'conuin' => $conuin,
  153. 'conuinsecret' => $conuinsecret,
  154. 'conopenid' => $conopenid,
  155. 'conisfeed' => 1,
  156. ) : array(
  157. 'conuintoken' => $conuintoken,
  158. 'conopenid' => $conopenid,
  159. 'conisfeed' => 1,
  160. )
  161. );
  162. $params['mod'] = 'login';
  163. connect_login($connect_member);
  164. loadcache('usergroups');
  165. $usergroups = $_G['cache']['usergroups'][$_G['groupid']]['grouptitle'];
  166. $param = array('username' => $_G['member']['username'], 'usergroup' => $_G['group']['grouptitle']);
  167. C::t('common_member_status')->update($connect_member['uid'], array('lastip'=>$_G['clientip'], 'lastvisit'=>TIMESTAMP, 'lastactivity' => TIMESTAMP));
  168. $ucsynlogin = '';
  169. if($_G['setting']['allowsynlogin']) {
  170. loaducenter();
  171. $ucsynlogin = uc_user_synlogin($_G['uid']);
  172. }
  173. dsetcookie('stats_qc_login', 3, 86400);
  174. header('location: '.$referer);
  175. exit;
  176. } else {
  177. header('location: '.$referer.'&loginErr=1001');
  178. exit;
  179. }
  180. }
  181. function connect_login($connect_member) {
  182. global $_G;
  183. if(!($member = getuserbyuid($connect_member['uid'], 1))) {
  184. return false;
  185. } else {
  186. if(isset($member['_inarchive'])) {
  187. C::t('common_member_archive')->move_to_master($member['uid']);
  188. }
  189. }
  190. require_once libfile('function/member');
  191. $cookietime = 1296000;
  192. setloginstatus($member, $cookietime);
  193. dsetcookie('connect_login', 1, $cookietime);
  194. dsetcookie('connect_is_bind', '1', 31536000);
  195. dsetcookie('connect_uin', $connect_member['conopenid'], 31536000);
  196. return true;
  197. }
  198. function getErrorMessage($errroCode) {
  199. $str = sprintf('connect_error_code_%d', $errroCode);
  200. return lang('plugin/qqconnect', $str);
  201. }