oauth.ctrl.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. /**
  3. * [WeEngine System] Copyright (c) 2014 WE7.CC
  4. * WeEngine is NOT a free software, it under the license terms, visited http://www.we7.cc/ for more details.
  5. */
  6. defined('IN_IA') or exit('Access Denied');
  7. load()->func('communication');
  8. $code = $_GPC['code'];
  9. $scope = $_GPC['scope'];
  10. if (!empty($_SESSION['pay_params'])) {
  11. $setting = uni_setting($_W['uniacid'], array('payment'));
  12. $uniacid = !empty($setting['payment']['wechat']['service']) ? $setting['payment']['wechat']['service'] : $setting['payment']['wechat']['borrow'];
  13. $acid = pdo_getcolumn('uni_account', array('uniacid' => $uniacid), 'default_acid');
  14. $setting = account_fetch($acid);
  15. $_W['account']['oauth'] = array(
  16. 'key' => $setting['key'],
  17. 'secret' => $setting['secret'],
  18. 'type' => $setting['type'],
  19. 'level' => $setting['level'],
  20. 'acid' => $setting['acid'],
  21. );
  22. }
  23. if (empty($_W['account']['oauth']) || empty($code)) {
  24. exit('通信错误,请在微信中重新发起请求');
  25. }
  26. $oauth_account = WeAccount::create($_W['account']['oauth']);
  27. $oauth = $oauth_account->getOauthInfo($code);
  28. if (is_error($oauth) || empty($oauth['openid'])) {
  29. $state = 'we7sid-'.$_W['session_id'];
  30. $str = '';
  31. if(uni_is_multi_acid()) {
  32. $str = "&j={$_W['acid']}";
  33. }
  34. $url = "{$_W['siteroot']}app/index.php?i={$_W['uniacid']}{$str}&c=auth&a=oauth&scope=snsapi_base";
  35. $callback = urlencode($url);
  36. $forward = $oauth_account->getOauthCodeUrl($callback, $state);
  37. header('Location: ' . $forward);
  38. exit;
  39. }
  40. if (!empty($_SESSION['pay_params'])) {
  41. if (!empty($oauth['openid'])) {
  42. header("Location: ".url('mc/cash/wechat', array('payopenid' => $oauth['openid'], 'params' => $_SESSION['pay_params'])));
  43. exit;
  44. }else{
  45. message('非法访问.');
  46. }
  47. }
  48. $_SESSION['oauth_openid'] = $oauth['openid'];
  49. $_SESSION['oauth_acid'] = $_W['account']['oauth']['acid'];
  50. if (intval($_W['account']['level']) == 4) {
  51. $fan = mc_fansinfo($oauth['openid']);
  52. if (!empty($fan)) {
  53. $_SESSION['openid'] = $oauth['openid'];
  54. if (empty($_SESSION['uid'])) {
  55. if (!empty($fan['uid'])) {
  56. $member = mc_fetch($fan['uid'], array('uid'));
  57. if (!empty($member) && $member['uniacid'] == $_W['uniacid']) {
  58. $_SESSION['uid'] = $member['uid'];
  59. }
  60. }
  61. }
  62. } else {
  63. $accObj = WeAccount::create($_W['account']);
  64. $userinfo = $accObj->fansQueryInfo($oauth['openid']);
  65. if(!is_error($userinfo) && !empty($userinfo) && !empty($userinfo['subscribe'])) {
  66. $userinfo['nickname'] = stripcslashes($userinfo['nickname']);
  67. if (!empty($userinfo['headimgurl'])) {
  68. $userinfo['headimgurl'] = rtrim($userinfo['headimgurl'], '0');
  69. }
  70. $userinfo['avatar'] = $userinfo['headimgurl'];
  71. $_SESSION['userinfo'] = base64_encode(iserializer($userinfo));
  72. $record = array(
  73. 'openid' => $userinfo['openid'],
  74. 'uid' => 0,
  75. 'acid' => $_W['acid'],
  76. 'uniacid' => $_W['uniacid'],
  77. 'salt' => random(8),
  78. 'updatetime' => TIMESTAMP,
  79. 'nickname' => stripslashes($userinfo['nickname']),
  80. 'follow' => $userinfo['subscribe'],
  81. 'followtime' => $userinfo['subscribe_time'],
  82. 'unfollowtime' => 0,
  83. 'unionid' => $userinfo['unionid'],
  84. 'tag' => base64_encode(iserializer($userinfo))
  85. );
  86. if (!isset($unisetting['passport']) || empty($unisetting['passport']['focusreg'])) {
  87. $email = md5($oauth['openid']).'@we7.cc';
  88. $email_exists_member = pdo_getcolumn('mc_members', array('email' => $email), 'uid');
  89. if (!empty($email_exists_member)) {
  90. $uid = $email_exists_member;
  91. } else {
  92. $default_groupid = pdo_fetchcolumn('SELECT groupid FROM ' .tablename('mc_groups') . ' WHERE uniacid = :uniacid AND isdefault = 1', array(':uniacid' => $_W['uniacid']));
  93. $data = array(
  94. 'uniacid' => $_W['uniacid'],
  95. 'email' => $email,
  96. 'salt' => random(8),
  97. 'groupid' => $default_groupid,
  98. 'createtime' => TIMESTAMP,
  99. 'password' => md5($message['from'] . $data['salt'] . $_W['config']['setting']['authkey']),
  100. 'nickname' => stripslashes($userinfo['nickname']),
  101. 'avatar' => $userinfo['headimgurl'],
  102. 'gender' => $userinfo['sex'],
  103. 'nationality' => $userinfo['country'],
  104. 'resideprovince' => $userinfo['province'] . '省',
  105. 'residecity' => $userinfo['city'] . '市',
  106. );
  107. pdo_insert('mc_members', $data);
  108. $uid = pdo_insertid();
  109. }
  110. $record['uid'] = $uid;
  111. $_SESSION['uid'] = $uid;
  112. }
  113. pdo_insert('mc_mapping_fans', $record);
  114. } else {
  115. $record = array(
  116. 'openid' => $oauth['openid'],
  117. 'nickname' => '',
  118. 'subscribe' => '0',
  119. 'subscribe_time' => '',
  120. 'headimgurl' => '',
  121. );
  122. }
  123. $_SESSION['openid'] = $oauth['openid'];
  124. $_W['fans'] = $record;
  125. $_W['fans']['from_user'] = $record['openid'];
  126. }
  127. }
  128. if (intval($_W['account']['level']) != 4) {
  129. $mc_oauth_fan = mc_oauth_fans($oauth['openid'], $_W['acid']);
  130. if (empty($mc_oauth_fan) && (!empty($_SESSION['openid']) || !empty($_SESSION['uid']))) {
  131. $data = array(
  132. 'acid' => $_W['acid'],
  133. 'oauth_openid' => $oauth['openid'],
  134. 'uid' => intval($_SESSION['uid']),
  135. 'openid' => $_SESSION['openid']
  136. );
  137. pdo_insert('mc_oauth_fans', $data);
  138. }
  139. if (!empty($mc_oauth_fan)) {
  140. if (empty($_SESSION['uid']) && !empty($mc_oauth_fan['uid'])) {
  141. $_SESSION['uid'] = intval($mc_oauth_fan['uid']);
  142. }
  143. if (empty($_SESSION['openid']) && !empty($mc_oauth_fan['openid'])) {
  144. $_SESSION['openid'] = strval($mc_oauth_fan['openid']);
  145. }
  146. }
  147. }
  148. if ($scope == 'userinfo' || $scope == 'snsapi_userinfo') {
  149. $userinfo = $oauth_account->getOauthUserInfo($oauth['access_token'], $oauth['openid']);
  150. if (!is_error($userinfo)) {
  151. $userinfo['nickname'] = stripcslashes($userinfo['nickname']);
  152. if (!empty($userinfo['headimgurl'])) {
  153. $userinfo['headimgurl'] = rtrim($userinfo['headimgurl'], '0') ;
  154. }
  155. $userinfo['avatar'] = $userinfo['headimgurl'];
  156. $_SESSION['userinfo'] = base64_encode(iserializer($userinfo));
  157. $fan = pdo_get('mc_mapping_fans', array('openid' => $oauth['openid']));
  158. if (!empty($fan)) {
  159. $record = array();
  160. $record['updatetime'] = TIMESTAMP;
  161. $record['nickname'] = stripslashes($userinfo['nickname']);
  162. $record['tag'] = base64_encode(iserializer($userinfo));
  163. pdo_update('mc_mapping_fans', $record, array('openid' => $fan['openid'], 'acid' => $_W['acid'], 'uniacid' => $_W['uniacid']));
  164. if (!empty($fan['uid']) || !empty($_SESSION['uid'])) {
  165. $uid = $fan['uid'];
  166. if(empty($uid)){
  167. $uid = $_SESSION['uid'];
  168. }
  169. $user = mc_fetch($uid, array('nickname', 'gender', 'residecity', 'resideprovince', 'nationality', 'avatar'));
  170. $record = array();
  171. if(empty($user['nickname']) && !empty($userinfo['nickname'])) {
  172. $record['nickname'] = stripslashes($userinfo['nickname']);
  173. }
  174. if(empty($user['gender']) && !empty($userinfo['sex'])) {
  175. $record['gender'] = $userinfo['sex'];
  176. }
  177. if(empty($user['residecity']) && !empty($userinfo['city'])) {
  178. $record['residecity'] = $userinfo['city'] . '市';
  179. }
  180. if(empty($user['resideprovince']) && !empty($userinfo['province'])) {
  181. $record['resideprovince'] = $userinfo['province'] . '省';
  182. }
  183. if(empty($user['nationality']) && !empty($userinfo['country'])) {
  184. $record['nationality'] = $userinfo['country'];
  185. }
  186. if(empty($user['avatar']) && !empty($userinfo['headimgurl'])) {
  187. $record['avatar'] = $userinfo['headimgurl'];
  188. }
  189. if(!empty($record)) {
  190. mc_update($user['uid'], $record);
  191. }
  192. }
  193. } else {
  194. $record = array(
  195. 'openid' => $oauth['openid'],
  196. 'uid' => 0,
  197. 'acid' => $_W['acid'],
  198. 'uniacid' => $_W['uniacid'],
  199. 'salt' => random(8),
  200. 'updatetime' => TIMESTAMP,
  201. 'nickname' => $userinfo['nickname'],
  202. 'follow' => 0,
  203. 'followtime' => 0,
  204. 'unfollowtime' => 0,
  205. 'tag' => base64_encode(iserializer($userinfo))
  206. );
  207. if (!isset($unisetting['passport']) || empty($unisetting['passport']['focusreg'])) {
  208. $default_groupid = pdo_fetchcolumn('SELECT groupid FROM ' .tablename('mc_groups') . ' WHERE uniacid = :uniacid AND isdefault = 1', array(':uniacid' => $_W['uniacid']));
  209. $data = array(
  210. 'uniacid' => $_W['uniacid'],
  211. 'email' => md5($oauth['openid']).'@we7.cc',
  212. 'salt' => random(8),
  213. 'groupid' => $default_groupid,
  214. 'createtime' => TIMESTAMP,
  215. 'password' => md5($message['from'] . $data['salt'] . $_W['config']['setting']['authkey']),
  216. 'nickname' => $userinfo['nickname'],
  217. 'avatar' => $userinfo['headimgurl'],
  218. 'gender' => $userinfo['sex'],
  219. 'nationality' => $userinfo['country'],
  220. 'resideprovince' => $userinfo['province'] . '省',
  221. 'residecity' => $userinfo['city'] . '市',
  222. );
  223. pdo_insert('mc_members', $data);
  224. $uid = pdo_insertid();
  225. $record['uid'] = $uid;
  226. $_SESSION['uid'] = $uid;
  227. }
  228. pdo_insert('mc_mapping_fans', $record);
  229. }
  230. } else {
  231. message('微信授权获取用户信息失败,错误信息为: ' . $response['message']);
  232. }
  233. }
  234. $forward = urldecode($_SESSION['dest_url']);
  235. $str = '';
  236. if(uni_is_multi_acid()) {
  237. $str = "&j={$_W['acid']}";
  238. }
  239. $forward = strexists($forward, 'i=') ? $forward : "{$forward}&i={$_W['uniacid']}{$str}";
  240. header('Location: ' . $forward . '&wxref=mp.weixin.qq.com#wechat_redirect');
  241. exit;